爬蟲入門(一)——靜態網頁爬取:批量獲取高清壁紙

應老師分的方向,昨天開始自學入門爬蟲了

雖然實現了一個比較簡單的小爬蟲,自己還是非常興奮的,還是第一次實現  真的好開心

本來想爬pexel上的壁紙,然而發現對方的網頁不知道設置了什麼,反正有反爬蟲機制,用python訪問直接Fobbiden!真小氣qwq

最後還是乖乖去爬zol上的壁紙了


Before:

在設計爬蟲項目的時候,首先要在腦內明確人工瀏覽頁面獲得圖片時的步驟

一般地,我們去網上批量打開壁紙的時候一般操作如下:

1、打開壁紙網頁

2、單擊壁紙圖(打開指定壁紙的頁面)

3、選擇分辨率(我們要下載高清的圖)

4、保存圖片

實際操作時,我們實現瞭如下幾步網頁地址的訪問:打開了壁紙的網頁→單擊壁紙圖打開指定頁面→選擇分辨率,點擊後打開最終保存目標圖片網頁→保存圖片

在爬蟲的過程中我們就嘗試通過模擬瀏覽器打開網頁的操作,一步步獲得、訪問網頁、最後獲得目標圖片的下載地址,對圖片進行下載保存到指定路徑中

*這些中間過程中網頁的一些具體篩選條件的構造,需要打開指定頁面的源代碼去觀察和尋找包含有目的鏈接的標籤


 

具體實現項目與註釋

這裏我只想獲得一些指定的圖片,所以我先在網頁上搜索“長門有希”,打開了一個搜索結果頁面,發現在這個頁面上就已經包含了同類型的其他壁紙鏈接,於是我一開始就把最初訪問的目的地址設置爲這個搜索結果頁面

目標結果頁面截圖:

 

圖中下標爲"1/29"."2/29"爲其他同類型目標壁紙,通過點擊這些圖片我們可以打開新的目標下載圖片頁面

這裏我們查看一下網頁源代碼

 

圖中黃色底的地方就是打開這些同類壁紙的目的地址(訪問的時候需要加上前綴"http://desk.zol.com.cn")

 

現在我們可以嘗試實現構建爬蟲:

打開指定頁面→篩選獲得所有長門有希壁紙的目標下載頁面鏈接

代碼如下:

 1 from urllib import request,error
 2 import re
 3 
 4 url = "http://desk.zol.com.cn/bizhi/561_5496_2.html"
 5 
 6 try:
 7         response = request.urlopen(url)# 打開頁面
 8         html = response.read() #此時是byte類型
 9         html = str(html) # 轉換成字符串
10 
11         pattern = re.compile(r'<a.*? href="(.*?)".*?>.*?</a>')
12         imglist = re.findall(pattern,html) # 匹配<a>標籤中的href地址
13         truelist = []
14         for item in imglist:
15             if re.match(r'^\/bizhi\/561_',item): # 觀察到所有目的地址下載頁面前綴都是/bizhi/561_,通過match函數進行篩選
16                 truelist.append(item)# 篩選掉其他無關的頁面(把真的目標頁面加到truelist列表中)
17 except error.HTTPError as e:
18         print(e.reason)
19 except error.URLError as e:
20         print(e.reason)
21 except:
22         pass

獲得地址以後我們可以通過獲取地址→打開指定頁面→選擇分辨率→獲得目的下載地址→保存到本地指定路徑中

在測試的時候我輸出了一下上一步truelist中保存的內容

可以看到保存的只是一個後綴,在訪問的時候我們需要加上一個指定的前綴

實現代碼如下(註釋見代碼):

 1 # 對於每一張地址,抓取其地址並且下載到本地
 2 x=0
 3 for wallpaperpage in truelist:
 4     try:
 5         # print(wallpaperpage)
 6         url1 = "http://desk.zol.com.cn" + wallpaperpage
 7         response1 = request.urlopen(url1) # 打開壁紙的頁面,相當於在瀏覽器中單擊壁紙名
 8         html1 = response1.read()
 9         html1 = str(html1)
10         pattern1 = re.compile(r'<a.*?id="1920x1080" href="(.*?)".*?>.*</a>')
11         urllist = re.findall(pattern1,html1) #匹配<a>標籤中的id爲1920 * 1080的地址,相當於在瀏覽器中選擇1920*1080分辨率
12         html2 = str(request.urlopen("http://desk.zol.com.cn"+urllist[0]).read()) # 打開網頁
13 
14         pattern2 = re.compile(r'<img.*? src="(.*?)"')
15         wallpaperurl = re.findall(pattern2,html2) # 用於獲取高清圖片的地址
16 
17         request.urlretrieve(wallpaperurl[0],"E://walkingbug/chapter1pic/%r.jpg" % x)
18         x+=1
19     except error.HTTPError as e:
20         print(e.reason)
21     except error.URLError as e:
22         print(e.reason)
23     except:
24         pass

 

最後可以在自己的目標文件夾中看到爬下來的圖片集~

 


 

其他:

對上面代碼出現的一些函數作用加以解釋:

request.urlopen(url):用於獲取url網頁的源代碼內容信息,相當於模仿瀏覽器打開這個頁面

response.read():打印出源代碼的內容

③pattern = re.compile(r'<a.*? href="(.*?)".*?>.*?</a>'):對正則表達式進行預編譯

imglist = re.findall(pattern,html):在html中搜尋有無與pattern內容相匹配的字符串,保存括號內的內容,(黃色底內的內容)

這兩段實際上等價於

imglist =  re.findall(r'<a.*? href="(.*?)".*?>.*?</a>',html)

其實當匹配次數很高的時候,有無預編譯的正則表達式匹配速度會有明顯的差距,所以儘可能使用compile()預編譯之後再進行正則表達式的匹配

request.urlretrieve(wallpaperurl[0],"E://walkingbug/chapter1pic/%r.jpg" % x):用於把目標文件下載保存到指定路徑中

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章