網路爬蟲——爬蟲實戰(一)

敲程式碼的胖虎發表於2022-01-29

圖片爬蟲實戰

假如我們想把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"模式進行寫入)。

五、效果演示

在這裡插入圖片描述

六、結束語

最後,祝大家都能夠學有所成!!!

相關文章