Python爬虫学习笔记二:百度贴吧网页图片抓取

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/feimengjuan/article/details/51164660

在上一篇中讲解了从百度贴吧中如何爬虫图片,并保存在本地,不过该代码只爬取了这个网址下的第一页中的60多张图片,从网页中可以看到,实际上这个帖子中存在74个页面,如图:



改进了一下代码,爬取了该帖子中74个页面的所有图片。

通过分析网页的源代码,可以看到从下面这里可以获取页面数,



于是用了一个正则表达式,来从源代码中分析出页面数:

  # 获取该网址下共有多少页
    def getPageNumber(self,html):
        # 利用正则表达式来从网页源代码中分析得到页面数
        reg = '<span class="red">(.*?)</span>'  # 根据正则表达式找到该网址下共有多少个页面
        numre = re.compile(reg)
        number = numre.findall(html)
        return int(number[0]) #可能会找到好几个这个数字,只需取出第一个,并转为整型

并且,在代码中进行了一些改进,写了一个TiebaSpider类来实现,具体如下:

# -*- coding: utf-8 -*-
# feimengjuan
import re
import urllib
import urllib2
import os
#抓取网页图片

class TiebaSpider:
    def __init__(self):
        self.siteURL = "http://tieba.baidu.com/p/2460150866"
        self.imageNumber = 0 #用于表示一共保存了多少张图片

    #根据给定的网址来获取网页详细信息,得到的html就是网页的源代码
    def getHtml(self):
        page = urllib.urlopen(self.siteURL)
        html = page.read()
        return html

    #创建保存图片的文件夹
    def mkdir(self,path):
        path = path.strip()
        # 判断路径是否存在
        #  存在    True
        #  不存在  Flase
        isExists = os.path.exists(path)
        if not isExists:
            print u'新建了名字叫做',path,u'的文件夹'
            # 创建目录操作函数
            os.makedirs(path)
            return True
        else:
            # 如果目录存在则不创建,并提示目录已经存在
            print u'名为',path,u'的文件夹已经创建成功'
            return False

    # 输入文件名,保存多张图片
    def saveImages(self,imglist,name):
        for imageURL in imglist:
            self.imageNumber += 1
            splitPath = imageURL.split('.')
            fTail = splitPath.pop()
            if len(fTail) > 3:
                fTail = 'jpg'
            fileName = name + "/" + str(self.imageNumber) + "." + fTail
            # 对于每张图片地址,进行保存
            try:
                u = urllib2.urlopen(imageURL)
                data = u.read()
                f = open(fileName,'wb+')
                f.write(data)
                print u'正在保存的一张图片为',fileName
                f.close()
            except urllib2.URLError as e:
                print (e.reason)


    # 获取网页中某个页面的所有图片的地址
    def getAllImg(self,page):
        # 利用正则表达式把源代码中的图片地址过滤出来
        reg = r'src="(.+?\.jpg)" pic_ext'
        imgre = re.compile(reg)
        imglist = imgre.findall(page) #表示在整个页面中过滤出所有图片的地址,放在imglist中
        return imglist

    # 获取该网址下共有多少页
    def getPageNumber(self,html):
        # 利用正则表达式来从网页源代码中分析得到页面数
        reg = '<span class="red">(.*?)</span>'  # 根据正则表达式找到该网址下共有多少个页面
        numre = re.compile(reg)
        number = numre.findall(html)
        return int(number[0]) #可能会找到好几个这个数字,只需取出第一个,并转为整型

    #  获取网址下所有页面
    def getAllPages(self,number):
        # 获取主网址下的共number个页面的源代码,放在pagesHtml中
        pagesHtml = []
        for pageIndex in range(1,number + 1):
            url = self.siteURL + '?pn=' + str(pageIndex)
            pageHtml = urllib.urlopen(url).read()
            pagesHtml.append(pageHtml)
        return pagesHtml

    #从该网址下所有页面中获取图片
    def saveImgAllPages(self):
        # 新建本地文件夹保存图片
        path = u'图片'
        self.mkdir(path)
        #获取所要爬虫的网址网页详细信息,得到的html就是网页的源代码  
        html = self.getHtml()
        # 得到该贴吧网址下共有多少个页面
        pageNumber = self.getPageNumber(html)
        # 获取所有的页面的源代码,从中分析出图片
        pagesHtml = self.getAllPages(pageNumber)
        x = 1
        for pageHtml in pagesHtml:
            # 获取每个页面下的所有图片地址列表
            imglist = self.getAllImg(pageHtml) #获取图片的地址列表
            self.saveImages(imglist,path) # 保存图片
            print u'已经保存了第',x,u'页的所有图片'
            x += 1



#创建本地保存文件夹,并下载保存图片
if __name__ == '__main__':
    spider = TiebaSpider()
    spider.saveImgAllPages()
    print u'图片下载保存结束,共抓取了',spider.imageNumber,u'张图片'
   # path = u'图片'
   # mkdir(path) #创建本地文件夹
   # imglist = getAllImg(html) 
   # saveImages(imglist,path) 


猜你喜欢

转载自blog.csdn.net/feimengjuan/article/details/51164660