爬蟲邏輯
對於有針對性的爬取數據,爬蟲的每一層邏輯可以不必多麼精妙,但必須力求準確,而這便需要探尋到網站的規律,亦或者邏輯(因爲需要管理和維護,所以網站肯定有他自己的規律或者邏輯)
咳咳,還是這個福利網站(mzitu.com)
我們由淺入深
先嚐試單個套圖的爬取
那麼
第一步:獲取此套圖的所有單頁url
從首頁F12探尋翻頁按鈕,我們可以察覺到這個網站的一個套圖下的所有圖片所在頁面的url得規律,基礎url+“/”+str(i)
並且我們可以獲取到此套圖一共42頁
根據這個規律我們便可以爬取出這個套圖下的所有圖片的標題和鏈接
第二步:根據鏈接下載對應圖片並存進一個目錄
對於這個網站的圖片服務器來說,如果同一ip訪問頻率太快,是會被禁止的,但是這個頻率的界限存在於多線程,單線程下頻率超不過臨界,因此不必擔心
第三步:並沒有第三步,只需兩步,只需兩步,這個爬蟲便能夠完成
上代碼:
import requests
import os
from lxml import html
all_message = []
def GetAllMessage(url):
global all_message
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
}
print("開始解析地址:%s" % (url))
page = requests.get(url=url,headers=headers)
tree = html.fromstring(page.text)
result = tree.xpath('//div[@class="pagenavi"]//a[last()-1]/@href')
number_end = int("".join(result).replace(url + '/', ''))
print("解析此套圖一共 %d 張" % (number_end))
print("開始解析此套圖所有圖片名稱和地址!")
for i in range(1, number_end + 1):
page_url = url + "/" + str(i)
page2 = requests.get(url=page_url, headers=headers)
tree = html.fromstring(page2.text)
img_url = tree.xpath('//div[@class="main-image"]//img/@src')
img_name = tree.xpath('//div[@class="content"]//h2[@class="main-title"]/text()')
img_list = {'img_name': img_name[0], 'img_url': img_url[0]}
all_message.append(img_list)
print(all_message)
def DownloadImg(url):
global all_message
path = './收藏/' + all_message[0]['img_name']
print("開始構建套圖存儲目錄:%s"%(path))
is_exists = os.path.exists(path)
if not is_exists:
os.makedirs(path)
print("目錄 %s 構建成功!" % (path))
else:
print("目錄 %s 已存在!" % (path))
for i in range(len(all_message)):
try:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36',
"Referer": url + "/" + str(i)
}
img = requests.get(url=all_message[i]['img_url'], headers=headers)
with open(path + '/' + all_message[i]['img_name'] + '.jpg', "wb") as f:
f.write(img.content)
f.close()
except Exception as e:
print(e)
pass
print("套圖 %s 下載完畢!" % (all_message[0]['img_name']))
if __name__ == '__main__':
url = input("請輸入mzitu.com的套圖鏈接(第一頁的鏈接):")
GetAllMessage(url)
DownloadImg(url)
大功告成,只需簡簡單單的兩個方法,此爬蟲便宣告完成