python協(xié)程gevent案例 爬取斗魚圖片過程解析
分析
分析網(wǎng)站尋找需要的網(wǎng)址
用谷歌瀏覽器摁F12打開開發(fā)者工具,然后打開斗魚顏值分類的頁面,如圖:

在里面的請(qǐng)求中,最后發(fā)現(xiàn)它是以ajax加載的數(shù)據(jù),數(shù)據(jù)格式為json,如圖:

圈住的部分是我們需要的數(shù)據(jù),然后復(fù)制它的網(wǎng)址為https://www.douyu.com/gapi/rknc/directory/yzRec/1,出于學(xué)習(xí)目的只爬取第一頁(減少服務(wù)器壓力)。然后把網(wǎng)址放到瀏覽器中測(cè)試是否可以訪問。如圖:

結(jié)果正常。
分析json數(shù)據(jù),提取圖片鏈接
最后分析發(fā)現(xiàn)json中的data里面的rl是每個(gè)房間的信息,大概有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,
"w": 0,
"h": 0
}
],
[
],
[
],
[
]
],
"ioa": 0,
"od": ""
}
測(cè)試發(fā)現(xiàn)rs16是房間的圖片,如果把鏈接最后的/dy1去掉的話,圖片就成大圖了,心里美滋滋。
代碼實(shí)現(xiàn)
import gevent
import json
from urllib import request
from gevent import monkey
# 使用gevent打補(bǔ)丁,耗時(shí)操作自動(dòng)替換成gevent提供的模塊
monkey.patch_all()
# 圖片存放的目錄
ROOT = "./images/"
# 設(shè)置請(qǐng)求頭,防止被反爬蟲的第一步
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):
# 把每個(gè)鏈接最后的/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數(shù)據(jù)轉(zhuǎn)換成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)
結(jié)果
由于使用的是協(xié)程,比線程效率更高,不到1秒就把第一頁的圖片全部爬取下來了。效果如圖:

此案例僅用于學(xué)習(xí)gevent的使用。
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
對(duì)python實(shí)時(shí)得到鼠標(biāo)位置的示例講解
今天小編就為大家分享一篇對(duì)python實(shí)時(shí)得到鼠標(biāo)位置的示例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-10-10
Python數(shù)據(jù)預(yù)處理之?dāng)?shù)據(jù)規(guī)范化(歸一化)示例
這篇文章主要介紹了Python數(shù)據(jù)預(yù)處理之?dāng)?shù)據(jù)規(guī)范化,簡單描述了數(shù)據(jù)規(guī)范化的原理、用法及相關(guān)操作技巧,需要的朋友可以參考下2019-01-01
100行Python代碼實(shí)現(xiàn)每天不同時(shí)間段定時(shí)給女友發(fā)消息
這篇文章主要介紹了100行Python代碼,每天不同時(shí)間段定時(shí)給女友發(fā)消息,本文給出了實(shí)現(xiàn)思路,代碼簡單易懂非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09
不到20行代碼用Python做一個(gè)智能聊天機(jī)器人
小編先向大家介紹一下本次運(yùn)用到的python庫,本次項(xiàng)目主要運(yùn)用到的庫有wxpy和chatterbot。對(duì)Python做一個(gè)智能聊天機(jī)器人的相關(guān)知識(shí)感興趣的朋友跟隨小編一起看看吧2019-04-04
python+selenium+chromedriver實(shí)現(xiàn)爬蟲示例代碼
這篇文章主要介紹了python+selenium+chromedriver實(shí)現(xiàn)爬蟲示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04
pytorch 彩色圖像轉(zhuǎn)灰度圖像實(shí)例
今天小編就為大家分享一篇pytorch 彩色圖像轉(zhuǎn)灰度圖像實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-01-01
python 動(dòng)態(tài)調(diào)用函數(shù)實(shí)例解析
這篇文章主要介紹了python 動(dòng)態(tài)調(diào)用函數(shù)實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10

