python中的異步爬蟲詳解
python異步爬蟲
基本概念
目的:在爬蟲中使用異步實現高性能的數據爬取操作。
異步爬蟲的方式:
- 多線程,多進程(不建議) :
- 好處:可以為相關阻塞的操作單獨開啟線程或者進程,阻塞操作就可以異步執(zhí)行。
- 弊端:無法無限制的開啟多線程或者多進程。
- 線程池、 進程池(適當) :
- 好處:我們可以降低系統對進程或者線程創(chuàng)建和銷毀的一個頻率,從而很好的降低系統的開銷。
- 弊端:池中線程或進程的數量是有上限。
線程池的基本使用
# 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)
效果圖
單線程串行方式
線程池
爬取網址:https://www.pearvideo.com/category_6
代碼
import requests,re,random from lxml import etree from multiprocessing.dummy import Pool urls = [] #視頻地址和視頻名稱的字典 #獲取視頻假地址函數 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'] #獲取視頻數據和持久化存儲 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) #子線程結束后關閉 pool.close() #主線程關閉 pool.join()
效果圖
思路
1.詳情頁發(fā)現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ā)現
圈中的數字中換為cont-video_id就為真地址
到此這篇關于python中的異步爬蟲詳解的文章就介紹到這了,更多相關python異步爬蟲內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
使用Python的數據可視化庫Matplotlib實現折線圖
數據可視化是數據分析和探索中不可或缺的一環(huán),本文將介紹如何使用Python中的數據可視化庫Matplotlib,通過示例代碼實現一個簡單的折線圖,感興趣的同學可以參考閱讀下2023-07-07python使用SimpleXMLRPCServer實現簡單的rpc過程
這篇文章主要介紹了python使用SimpleXMLRPCServer實現簡單的rpc過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06全面掌握Python?JSON庫函數與方法學會JSON數據處理
Python提供了內置的JSON庫,允許在Python中解析和序列化JSON數據,本文將深入研究Python中JSON庫的各種函數和方法,為你提供豐富的示例代碼來幫助掌握JSON處理的方方面面2024-01-01