向右奔跑老师写了《007 - Python简单爬虫 - 正则表达式》爬取了贴吧中的图片,留了一个任务是爬取花瓣上面的图片
实现步骤
根据老师的贴吧示例,简单分析花瓣爬虫的如下:
1、获取url对应的网页源代码
2、根据网页图片的网址特征,确定正则表达式
3、利用正则中的findall方法进行图片地址的提取
4、遍历图片地址用urlretrieve获取
分析过程:
老师文章中已经给出了正则表达式
<img src="([.\S])"
仔细分析发现,这种匹配无法区分图片跟头像。下载下来有很多无用的信息。
示意图 头像示意图
对比图片和头像的img标签,发现图片都有指定宽度width
主图 缩略图
而头像怎没有指定width
头像故修改正则为: r'<img src="([.\S])" width' 去除掉没有width的img标签。
实现代码
# coding:utf-8
from urllib import request
import re
# 获取网页源代码的方法
def getHtml(url):
page = request.urlopen(url)
html = page.read().decode('utf-8') # Python3需要decode
return html
html = getHtml('http://huaban.com/pins/1120072731/')
reg = r'<img src="([.*\S]*)" width'
imgurls = re.findall(reg, html) #用正则匹配到的图片路径的集合
x = 1
for imgurl in imgurls:
imgurl ='http:'+ str(imgurl)
print (imgurl) # 打印查看一下是不是 每个图片的URL
request.urlretrieve(imgurl, 'images2/%s.jpg' % x)
print ("正在下载第 %d 张"%x)
x +=1
注意事项
因为我用的版本是python3版本,代码存在些许差异,比方说:
1、在Python3中print为函数:print (imgurl)
2、urlopen在request下:request.urlopen(url)
修改完成后运行程序,报错:TypeError: cannot use a string pattern on a bytes-like object
查询资料得知python3中urllib.read返回的是bytes对象,不是string,得把它decode转换成string对象:page.read().decode('utf-8')
运行结果
采集结果存在缺陷
现在采集到的还只是图片的缩略图,没有能够深入到画板的主页面去采集原图。后面考虑获取到画板缩略图的源地址,去源地址进行原图片的获取。
网友评论