您的位置:首页 > 其它

简单爬虫脚本——对百度贴吧的帖子中的图片进行爬取,可以爬取下一页

2018-09-12 18:57 85 查看

前几天突然间想去下载一点女神的图片!

但是自己又不会批量下载,所以只能手动搞起,结果花了一个半小时,一个一个点保存,才保存了一百多个!那么我怎么才能快一点呢,因此接触到了爬虫,不得不说,兴趣才是驱动学习的最终力量!

下面进入正题:

我有什么需求?

1.要对百度贴吧-周慧敏吧中的一个最多最全的帖子进行爬取,下载出这个帖子中所有女神的图片点击进入帖子
2.然后就是欣赏就可以了

具体实现:

1.首先得到了这个帖子的首页就要对页面进行分析

def getHtml(url):
page = urllib.request.urlopen(url)
html = page.read()
return html

利用

page = urllib.request.urlopen(url)
解析出html页面信息,以备取出图片的url信息,把page信息转为字符串形式存到html中再返回页面的html

2.对html进行解析,使用正则表达式提取出对自己有用的信息,在一个页面中将所有的相关有用的图片url找到,然后存入到imgurl中,方便以后遍历

def getImg(html):
reg = r'class="BDE_Image" src="([.*\S]*\.jpg)" '
imgre = re.compile(reg)
imgurl = re.findall(imgre, html)
return imgurl

3.想要抓取帖子里的所有图片,要知道先要实现抓取并下载一个页面的图片,不能心急!这个要用到一个循环来解决,每次都将imgurl取出来,并且打开这个.jpg文件:

然后把这个.jpg文件写入到文件夹中`f.write((urllib.request.urlopen(imgList)).read())`。
  • 这里会自动生成一个图片名
    f = open("pic/" + str(imgCount) + ".jpg", 'wb')
  • 然后把这个.jpg文件写入到文件夹中

    f.write((urllib.request.urlopen(imgList)).read())

  • 关闭

    f.close()

for imgList in imgLists:
f = open("pic/" + str(imgCount) + ".jpg", 'wb')
f.write((urllib.request.urlopen(imgList)).read())
f.close()
imgCount += 1

4.到这里为止一页的抓取工作就有了,那么进行全部每页帖子的抓取了呢

  • 首先我要去看一下到底有多少的页面,然后发现有53页,这里也需要一个for循环来实现分页爬取:这里看第一页和第二页的url有什么区别:http://tieba.baidu.com/p/5601213420?pn=1http://tieba.baidu.com/p/5601213420?pn=2。我们能发现只有后面的“pn=*”有不一样的地方,所以我们就可以利用这点每次都打开一个页面来进行爬取

  • 这里利用

    re.sub()
    对url进行重组,也就是

html = getHtml(re.sub('pn=\d','pn=%d'%i,Pages))

遇到的问题:

  • 在不管时间延迟的情况下,应该是自己的爬虫被网站识别出来了所以在下载了600+图片的时候莫名其妙停止

  • 解决的方法是进行一个时间延迟的处理,每爬取5页就停下来让爬虫歇一会,歇5秒钟就够了(利用pageCount来计数)

if pageCount == 5:
time.sleep(5)
pageCount = 0

看成果

贴代码:

import re
import urllib.request
import time

#爬取网页html
def getHtml(url):
page = urllib.request.urlopen(url)
html = page.read()
return html

#获取图片链接的方法
def getImg(html):
reg = r'class="BDE_Image" src="([.*\S]*\.jpg)" '
imgre = re.compile(reg)
imgurl = re.findall(imgre, html)
return imgurl

imgCount = 0
pageCount = 0
Pages = 'http://tieba.baidu.com/p/5601213420?pn=1'
for i in range(1, 53):
html = getHtml(re.sub('pn=\d', 'pn=%d'%i , Pages))
html = html.decode('UTF-8')
imgLists = getImg(html)
#for把获取到的图片都下载到本地pic文件夹里,保存之前先在本地建一个pic文件夹

for imgList in imgLists:
f = open("pic/" + str(imgCount) + ".jpg", 'wb')
f.write((urllib.request.urlopen(imgList)).read())
f.close()
imgCount += 1

if pageCount == 5:
time.sleep(5)
pageCount = 0
print("全部抓取完成")
阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: