在上一篇中讲解了从百度贴吧中如何爬虫图片,并保存在本地,不过该代码只爬取了这个网址下的第一页中的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)