python中的異步爬蟲詳解
python異步爬蟲
基本概念
目的:在爬蟲中使用異步實現(xiàn)高性能的數(shù)據(jù)爬取操作。
異步爬蟲的方式:
- 多線程,多進程(不建議) :
- 好處:可以為相關阻塞的操作單獨開啟線程或者進程,阻塞操作就可以異步執(zhí)行。
- 弊端:無法無限制的開啟多線程或者多進程。
- 線程池、 進程池(適當) :
- 好處:我們可以降低系統(tǒng)對進程或者線程創(chuàng)建和銷毀的一個頻率,從而很好的降低系統(tǒng)的開銷。
- 弊端:池中線程或進程的數(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ù)和持久化存儲 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é)束后關閉 pool.close() #主線程關閉 pool.join()
效果圖
思路
1.詳情頁發(fā)現(xiàn)ajks請求
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
對比之后發(fā)現(xiàn)
圈中的數(shù)字中換為cont-video_id就為真地址
到此這篇關于python中的異步爬蟲詳解的文章就介紹到這了,更多相關python異步爬蟲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python OpenCV中的resize()函數(shù)的使用
這篇文章主要介紹了Python OpenCV中的resize()函數(shù)的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-06-06tensorflow 實現(xiàn)打印pb模型的所有節(jié)點
今天小編就為大家分享一篇tensorflow 實現(xiàn)打印pb模型的所有節(jié)點,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01使用Python的數(shù)據(jù)可視化庫Matplotlib實現(xiàn)折線圖
數(shù)據(jù)可視化是數(shù)據(jù)分析和探索中不可或缺的一環(huán),本文將介紹如何使用Python中的數(shù)據(jù)可視化庫Matplotlib,通過示例代碼實現(xiàn)一個簡單的折線圖,感興趣的同學可以參考閱讀下2023-07-07Pandas數(shù)據(jù)分析之pandas文本處理
這篇文章主要介紹了Pandas數(shù)據(jù)分析之pandas文本處理,pandas對文本數(shù)據(jù)也有很多便捷處理方法,可以不用寫循環(huán),向量化操作運算速度快,還可以進行高級的正則表達式,各種復雜的邏輯篩選和匹配提取信息2022-08-08python使用SimpleXMLRPCServer實現(xiàn)簡單的rpc過程
這篇文章主要介紹了python使用SimpleXMLRPCServer實現(xiàn)簡單的rpc過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06全面掌握Python?JSON庫函數(shù)與方法學會JSON數(shù)據(jù)處理
Python提供了內(nèi)置的JSON庫,允許在Python中解析和序列化JSON數(shù)據(jù),本文將深入研究Python中JSON庫的各種函數(shù)和方法,為你提供豐富的示例代碼來幫助掌握JSON處理的方方面面2024-01-01