Python學習筆記9-爬花瓣網指定圖片,從此找圖不用愁

花瓣網,是國內著名的圖片閱覽網。有很多極具設計想法的圖片,設計師可以在這裏查找靈感。

今天,就來做一個爬蟲,爬指定的圖片。

第一步,分析花瓣網的AJAX

進入花瓣網,是個搜索框。

輸入一個“網頁設計”,進入搜索結果頁面。往下拉動,圖片還會自動增加,很明顯這個是AJAX的結果。

F12,查看 network,分析下載的文件。主要分析 XHR(就是 XMLHttpRequest,AJAX 請求)。記得勾選“Preserve log” 保留每次刷新的文件目錄。第一次打開,什麼都看不到,需要刷新一下頁面,進行加載就行了。

分別點這三個文件,看右邊的 Reponse 響應結果,發現它們都跟頁面內容無關,都是些不痛不癢的數據。

往下拉動頁面,發現左邊新增了一個文件,點它,果然頁面數據就在這裏了。

第二步,分析花瓣網的數據

把上面的那個文件,response 響應回來的內容複製出來,找個工具格式化。推薦 https://www.sojson.com/

但是發現這個JSON 裏沒有傳統的圖片地址~!!! 

回到花瓣網的頁面,Elements,查看圖片

發現圖片的地址本身就很詭異,不是傳統的 jpg ,png 結尾。複製出來是這個樣子:

//hbimg.huabanimg.com/68f6594f57ffcb237584802a95526886e98754655d057-zXvsGM_fw236

很明顯用了CDN位置,完整路徑應該是:

https://hbimg.huabanimg.com/68f6594f57ffcb237584802a95526886e98754655d057-zXvsGM_fw236

複製到瀏覽器地址欄中,果然打開了。

遂複製  68f6594f57ffcb237584802a95526886e98754655d057-zXvsGM_fw236 ,在剛剛那個 JSON 中去查找,居然找不到~!!

隱藏的夠深~~!!

仔細觀察,發現  68f6594f57ffcb237584802a95526886e98754655d057-zXvsGM_fw236   前面部分似乎就是 JSON 的 key 字段~!!

把後面的_fw236  去掉試試,還是可以打開圖片。看來,花瓣隱藏的很深啊~!!!(寫到這裏,把剛剛那個字段弄丟了,原圖不知道是哪個了,就換個字段,道理是一樣的。尷尬~)

https://hbimg.huabanimg.com/af8ee6b8aa9bbe64146ef5c6e2491cedb49f3a90126be7-EJu5cA

(點開,還是可以看到圖片)也就是說,我們用  https://hbimg.huabanimg.com/ 結合 JSON 的key 字段,就可以得到 圖片的地址。

果然找到:(剛剛那個字段丟了,重新截圖一個,是其他的數據,道理一樣的。)

步驟三:分析 JSON 地址和請求參數

看下那個文件的地址和請求方法,原來是 get 方式,那麼地址後面的參數就用 params 添加。

猜都猜的到,page 是第2 頁的數據,每頁20個。如果把 page 改成1,per_page 改成 50,就是獲取了前 50 張圖。

不敢爬太多,怕花瓣封我的 IP,還是低調點。

爬蟲,千萬不要影響網站的正常運營,否則就犯法了,進橘子就不好玩了~~

第四步,編碼

# -*- coding:utf-8 -*-
import  requests,os,json

baseurl = "https://hbimg.huabanimg.com/"  # 圖片地址公用部分
imgs = []   # 圖片存儲的list
weburl = r"https://huaban.com/search"     # 請求地址
kw = input("請輸入你要查找的圖片:")   # 添加個輸入,這樣要什麼圖,自己寫就是
# 構建 get 參數。
params = {
    "q": kw,
    "k765peeh":"",
    "page": 1,
    "per_page": 50,
    "wfl": 1
}
# 設置請求 headers,僞裝瀏覽器 並接受中文數據
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.116 Safari/537.36'
}
req = requests.get( url=weburl, params=params, headers=headers)
req.encoding="utf-8"   # 設置請求編碼
#  這個地方畫板有個坑,請求的結果是搜索結果HTML頁面。數據在第19行~!!
req_json_txt = req.text.split("\n")[18]  # 獲取數據相關字符串
# 字符串的第19個字符開始到倒數第二個字符是 json 字符串,最後一個符號是分號。
# 這裏不詳細解釋,大家自己操作下就知道了。
# print( req_json_txt )
req_json =json.loads(req_json_txt[18:-1])   # 把字符串轉爲 JSON,其實是 list 列表數據。
# print( req_json )
# 列表的每個元素都是 dict,圖片名字就放在 file 字段的 key 字段裏。
for item in req_json :
    imgs.append( baseurl+ item["file"]["key"] )  # 拼接圖片數組
# print( imgs )
# 遍歷圖片地址 list,下載對應圖片到指定文件夾中。文件名用的是網絡中的名字。
for item in imgs:
    img_req = requests.get(item,headers=headers)
    with open("huaban/"+item.split("/")[-1]+".jpg", "wb" ) as f:
        f.write(img_req.content)

詳細代碼就不解釋了,請看註釋。

這裏有個小坑,就是請求的結果居然是 搜索結果 HTML,而不是我以爲的單純的JSON,而且這個頁面還是 VUE寫的。好在數據都在頁面上,就用以下代碼獲取對應字符串。

req_json_txt = req.text.split("\n")[18]   

搜索的“美人”圖,關鍵還是大圖,不是縮略小圖。花瓣真良心~哈哈,雖然不是超大的圖,但是作爲設計靈感的參考,我覺得完全夠用~!!如果要想獲得更多的圖,修改參數就行。但是不要太多,貪心可不好哦~

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