python中的異步爬蟲(chóng)詳解
python異步爬蟲(chóng)
基本概念
目的:在爬蟲(chóng)中使用異步實(shí)現(xiàn)高性能的數(shù)據(jù)爬取操作。
異步爬蟲(chóng)的方式:
- 多線程,多進(jìn)程(不建議) :
- 好處:可以為相關(guān)阻塞的操作單獨(dú)開(kāi)啟線程或者進(jìn)程,阻塞操作就可以異步執(zhí)行。
- 弊端:無(wú)法無(wú)限制的開(kāi)啟多線程或者多進(jìn)程。
- 線程池、 進(jìn)程池(適當(dāng)) :
- 好處:我們可以降低系統(tǒng)對(duì)進(jìn)程或者線程創(chuàng)建和銷毀的一個(gè)頻率,從而很好的降低系統(tǒng)的開(kāi)銷。
- 弊端:池中線程或進(jìn)程的數(shù)量是有上限。
線程池的基本使用
# import time
# #單線程串行方式執(zhí)行
# start_time = time.time()
# def get_page(str):
# print('正在下載:',str)
# time.sleep(2)
# print('下載完成:',str)
#
# name_list = ['haha','lala','duoduo','anan']
#
# for i in range(len(name_list)):
# get_page(name_list[i])
#
# end_time = time.time()
# print(end_time-start_time)
import time
from multiprocessing.dummy import Pool
#單線程串行方式執(zhí)行
start_time = time.time()
def get_page(str):
print('正在下載:',str)
time.sleep(2)
print('下載完成:',str)
name_list = ['haha','lala','duoduo','anan']
pool = Pool(4)
pool.map(get_page,name_list)
end_time = time.time()
print(end_time-start_time)效果圖
單線程串行方式

線程池

爬取網(wǎng)址:https://www.pearvideo.com/category_6
代碼
import requests,re,random
from lxml import etree
from multiprocessing.dummy import Pool
urls = [] #視頻地址和視頻名稱的字典
#獲取視頻假地址函數(shù)
def get_videoadd(detail_url,video_id):
ajks_url = 'https://www.pearvideo.com/videoStatus.jsp'
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36',
'Referer':detail_url
}
params = {
'contId': video_id,
'mrd': str(random.random())
}
video_json = requests.post(headers=header,url=ajks_url,params=params).json()
return video_json['videoInfo']['videos']['srcUrl']
#獲取視頻數(shù)據(jù)和持久化存儲(chǔ)
def get_videoData(dic):
right_url = dic['url']
print(dic['name'],'start!')
video_data = requests.get(url=right_url,headers=headers).content
with open(dic['name'],'wb') as fp:
fp.write(video_data)
print(dic['name'],'over!')
if __name__ == '__main__':
url = 'https://www.梨video.com/category_6'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'
}
page_text = requests.get(url=url,headers=headers).text
tree = etree.HTML(page_text)
li_list = tree.xpath('//*[@id="listvideoListUl"]/li')
for li in li_list:
detail_url = 'https://www.pearvideo.com/'+li.xpath('./div/a/@href')[0]
name = li.xpath('./div/a/div[2]/text()')[0]+'.mp4'
#解析視頻ID
video_id = detail_url.split('/')[-1].split('_')[-1]
false_url = get_videoadd(detail_url,video_id)
temp = false_url.split('/')[-1].split('-')[0]
#拼接出正確的url
right_url = false_url.replace(temp,'cont-'+str(video_id))
dic = {
'name':name,
'url':right_url
}
urls.append(dic)
#使用線程池
pool = Pool(4)
pool.map(get_videoData,urls)
#子線程結(jié)束后關(guān)閉
pool.close()
#主線程關(guān)閉
pool.join()效果圖

思路
1.詳情頁(yè)發(fā)現(xiàn)ajks請(qǐng)求

2.但是,這是假地址 例: 假地址:
https://video.pearvideo.com/mp4/adshort/20210323/1616511268090-15637590_adpkg-ad_hd.mp4
3.真地址
https://video.pearvideo.com/mp4/adshort/20210323/cont-1724179-15637590_adpkg-ad_hd.mp4
對(duì)比之后發(fā)現(xiàn)

圈中的數(shù)字中換為cont-video_id就為真地址
到此這篇關(guān)于python中的異步爬蟲(chóng)詳解的文章就介紹到這了,更多相關(guān)python異步爬蟲(chóng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python OpenCV中的resize()函數(shù)的使用
這篇文章主要介紹了Python OpenCV中的resize()函數(shù)的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
tensorflow 實(shí)現(xiàn)打印pb模型的所有節(jié)點(diǎn)
今天小編就為大家分享一篇tensorflow 實(shí)現(xiàn)打印pb模型的所有節(jié)點(diǎn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01
解決PyCharm無(wú)法使用lxml庫(kù)的問(wèn)題(圖解)
這篇文章主要介紹了解決PyCharm無(wú)法使用lxml庫(kù)的問(wèn)題,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
使用Python的數(shù)據(jù)可視化庫(kù)Matplotlib實(shí)現(xiàn)折線圖
數(shù)據(jù)可視化是數(shù)據(jù)分析和探索中不可或缺的一環(huán),本文將介紹如何使用Python中的數(shù)據(jù)可視化庫(kù)Matplotlib,通過(guò)示例代碼實(shí)現(xiàn)一個(gè)簡(jiǎn)單的折線圖,感興趣的同學(xué)可以參考閱讀下2023-07-07
Pandas數(shù)據(jù)分析之pandas文本處理
這篇文章主要介紹了Pandas數(shù)據(jù)分析之pandas文本處理,pandas對(duì)文本數(shù)據(jù)也有很多便捷處理方法,可以不用寫循環(huán),向量化操作運(yùn)算速度快,還可以進(jìn)行高級(jí)的正則表達(dá)式,各種復(fù)雜的邏輯篩選和匹配提取信息2022-08-08
利用Anaconda簡(jiǎn)單安裝scrapy框架的方法
今天小編就為大家分享一篇利用Anaconda簡(jiǎn)單安裝scrapy框架的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
python使用SimpleXMLRPCServer實(shí)現(xiàn)簡(jiǎn)單的rpc過(guò)程
這篇文章主要介紹了python使用SimpleXMLRPCServer實(shí)現(xiàn)簡(jiǎn)單的rpc過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
全面掌握Python?JSON庫(kù)函數(shù)與方法學(xué)會(huì)JSON數(shù)據(jù)處理
Python提供了內(nèi)置的JSON庫(kù),允許在Python中解析和序列化JSON數(shù)據(jù),本文將深入研究Python中JSON庫(kù)的各種函數(shù)和方法,為你提供豐富的示例代碼來(lái)幫助掌握J(rèn)SON處理的方方面面2024-01-01

