圖片爬蟲實戰
假如我們想把jd商城的商品圖片下載到本地,通過手工複製粘貼將是一份非常龐大的工程,此時,可以用Python網絡爬蟲實現。我們可以通過Python網絡爬蟲將這些網頁上的圖片全部爬取到本地,這類爬蟲稱爲圖片爬蟲。
首先打開jd商城的首頁,在搜索輸入框中輸入想要爬取的商品,例如:褲子。如下圖所示:
再查看該網頁的網址,該網址就是我們需要爬取的起始頁面,如下圖所示:
一、導入模塊
import re
from urllib import request as req
from urllib import parse as pa
二、主函數
if __name__=="__main__":
key = input("請輸入關鍵字:")
wd = {'keyword': key}
keyword = pa.urlencode(wd)
controllspider('https://search.jd.com/Search?'+keyword+'&enc=utf-8&qrst=1&rt=1&stop=1&vt=2&wq=%E8%A3%A4%E5%AD%90')
key:即我們需要下載圖片的商品名稱
urlencode():urllib庫裏的parse模塊,對關鍵字進行編碼
controllspider:爬蟲控制器,負責整個爬取過程的調度
三、爬蟲控制器
def controllspider(url):
'''
功能:爬蟲的控制器,負責整個爬取過程的調度
:param url:初始爬取的url
:return:
'''
# 爬蟲控制開關
flag = True
page = 1
while flag:
flag = False
print("\n\n\n")
print("--------------------------------------正在爬取第%s頁-------------------------------------------------------"%page)
urls= url+'&page='+str(page)
product_list=spider(urls)
downloadimg(product_list)
control_input = input("是否繼續?(按enter繼續,Q退出)")
if control_input != 'Q':
flag = True
page += 1
爬取過程中,可進行交互功能,由用戶決定是否繼續爬取。
控制器(controllspider)將需要爬取的URL鏈接交給爬蟲(spider),爬蟲(spider)返回圖片鏈接的集合。
控制器(controllspider)再將返回的圖片鏈接集合交給下載器(downloadimg),將圖片下載至本地。
控制器(controllspider)會判斷是否滿足停止條件。
四、爬蟲spider
def spider(url):
'''
功能:獲取圖片鏈接
:param url: 待爬取的網頁url鏈接
:return: 返回該頁所有的商品圖片的鏈接
'''
headers={'User-Agent':'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)'}
request=req.Request(url,headers=headers)
html=req.urlopen(request)
html=str(html.read())
print(url)
#pattern1='<li class="gl-item">.*? </li>'
pattern1 = 'class="gl-item".*?</li>'
results1=re.compile(pattern1).findall(html)
print(results1)
product_list=[]
for result in results1:
product_dict = {}
pattern2='//img.*?"'
imageurl=re.compile(pattern2).findall(result)
product_dict['imageurl'] = imageurl
product_list.append(product_dict)
return product_list
headers :在使用python爬蟲爬取數據的時候,經常會遇到一些網站的反爬蟲措施,一般就是針對於headers中的User-Agent,如果沒有對headers進行設置,而如果網站有反爬蟲的話會拒絕這樣的連接,因此修改headers可以將自己的爬蟲腳本僞裝成瀏覽器的正常訪問。
re正則的使用:調用urlopen函數,返回HTML內容,調用**str(html)**函數將其轉換爲字符串。結合我上一篇的正則表達式用法,將字符串裏面的所有圖片鏈接URL匹配完成,返回URL集合。
五、下載器
def downloadimg(product_list):
'''
功能:根據URL下載圖片
:param product_list: 圖片URL集合
:return:
'''
for product in product_list:
imageurl = product['imageurl']
imageurl = imageurl[0].replace('"', '')
imageurl = "http:" + imageurl
print(imageurl)
filename='image\\'+str(imageurl)[-20:]
headers={'User-Agent':'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)'}
request=req.Request(imageurl,headers=headers)
html=req.urlopen(request).read()
with open(filename,'wb') as f:
f.write(html)
根據圖片的URL鏈接,獲取html的相應內容,再將其寫入到本地(圖片需要用"wb"模式進行寫入)。
五、效果演示
六、結束語
最後,祝大家都能夠學有所成!!!