向右奔跑老師寫了《007 - Python簡單爬蟲 - 正則表達式》爬取了貼吧中的圖片扰柠,留了一個任務是爬取花瓣上面的圖片
實現(xiàn)步驟
根據(jù)老師的貼吧示例粉铐,簡單分析花瓣爬蟲的如下:
1、獲取url對應的網(wǎng)頁源代碼
2卤档、根據(jù)網(wǎng)頁圖片的網(wǎng)址特征蝙泼,確定正則表達式
3、利用正則中的findall方法進行圖片地址的提取
4劝枣、遍歷圖片地址用urlretrieve獲取
分析過程:
老師文章中已經(jīng)給出了正則表達式
<img src="([.\S])"
仔細分析發(fā)現(xiàn)汤踏,這種匹配無法區(qū)分圖片跟頭像。下載下來有很多無用的信息舔腾。
對比圖片和頭像的img標簽溪胶,發(fā)現(xiàn)圖片都有指定寬度width
而頭像怎沒有指定width
故修改正則為: r'<img src="([.\S])" width' 去除掉沒有width的img標簽。
實現(xiàn)代碼
# coding:utf-8
from urllib import request
import re
# 獲取網(wǎng)頁源代碼的方法
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為函數(shù):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轉(zhuǎn)換成string對象:page.read().decode('utf-8')
運行結(jié)果
存在缺陷
現(xiàn)在采集到的還只是圖片的縮略圖,沒有能夠深入到畫板的主頁面去采集原圖氨距。后面考慮獲取到畫板縮略圖的源地址桑逝,去源地址進行原圖片的獲取。