向右奔跑老師寫了《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')
運行結果
采集結果
存在缺陷
現在采集到的還只是圖片的縮略圖,沒有能夠深入到畫板的主頁面去采集原圖。后面考慮獲取到畫板縮略圖的源地址,去源地址進行原圖片的獲取。