python協程gevent案例 爬取鬥魚圖片過程解析
阿新 • • 發佈:2020-01-09
分析
分析網站尋找需要的網址
用谷歌瀏覽器摁F12開啟開發者工具,然後開啟鬥魚顏值分類的頁面,如圖:
在裡面的請求中,最後發現它是以ajax載入的資料,資料格式為json,如圖:
圈住的部分是我們需要的資料,然後複製它的網址為https://www.douyu.com/gapi/rknc/directory/yzRec/1,出於學習目的只爬取第一頁(減少伺服器壓力)。然後把網址放到瀏覽器中測試是否可以訪問。如圖:
結果正常。
分析json資料,提取圖片連結
最後分析發現json中的data裡面的rl是每個房間的資訊,大概有200條左右,拿出其中的一條查詢裡面的圖片連結。
{ "rid": 1282190,"rn": "大家要開心啊~","uid": 77538371,"nn": "鯨魚歐尼","cid1": 8,"cid2": 201,"cid3": 581,"iv": 1,"av": "avatar_v3/201908/d62c503c603945098f2c22d0d95c3b2e","ol": 610574,"url": "/1282190","c2url": "/directory/game/yz","c2name": "顏值","icdata": { "217": { "url": "https://sta-op.douyucdn.cn/dy-listicon/king-web.png-v3.png","w": 0,"h": 0 } },"dot": 2103,"subrt": 0,"topid": 0,"bid": 0,"gldid": 0,"rs1": "https://rpic.douyucdn.cn/live-cover/appCovers/2019/08/01/1282190_20190801002745_big.jpg/dy1","rs16": "https://rpic.douyucdn.cn/live-cover/appCovers/2019/08/01/1282190_20190801002745_small.jpg/dy1","utag": [ { "name": "呆萌鯨魚","id": 111405 },{ "name": "美美美","id": 41 },{ "name": "萌萌噠","id": 520 },{ "name": "刀神老婆","id": 132367 } ],"rpos": 0,"rgrpt": 1,"rkic": "","rt": 2103,"ot": 0,"clis": 1,"chanid": 0,"icv1": [ [ { "id": 217,"url": "https://sta-op.douyucdn.cn/dy-listicon/web-king-1-10-v3.png","score": 994,"h": 0 } ],[ ],[ ] ],"ioa": 0,"od": "" }
測試發現rs16是房間的圖片,如果把連結最後的/dy1去掉的話,圖片就成大圖了,心裡美滋滋。
程式碼實現
import gevent import json from urllib import request from gevent import monkey # 使用gevent打補丁,耗時操作自動替換成gevent提供的模組 monkey.patch_all() # 圖片存放的目錄 ROOT = "./images/" # 設定請求頭,防止被反爬蟲的第一步 header = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/75.0.3770.142 Safari/537.36 " } def download(img_src): # 把每個連結最後的/dy1去掉 img_src: str = img_src.replace("/dy1","") # 提取圖片名 file_name: str = img_src.split("/")[-1] response = request.urlopen(request.Request(img_src,headers=header)) # 儲存到本地 with open(ROOT + file_name,"wb") as f: f.write(response.read()) print(file_name,"下載完成!") if __name__ == '__main__': req = request.Request("https://www.douyu.com/gapi/rknc/directory/yzRec/1",headers=header) # 把json資料轉換成python中的字典 json_obj = json.loads(request.urlopen(req).read().decode("utf-8")) tasks = [] for src in json_obj["data"]["rl"]: tasks.append(gevent.spawn(download,src["rs16"])) # 開始下載圖片 gevent.joinall(tasks)
結果
由於使用的是協程,比執行緒效率更高,不到1秒就把第一頁的圖片全部爬取下來了。效果如圖:
此案例僅用於學習gevent的使用。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。