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

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

女神美吧

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

下面进入正题:

我有什么需求?

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("全部抓取完成")
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值