python異步爬蟲之多線程
多線程,多進(jìn)程(不建議使用)
優(yōu)點:可以為相關(guān)阻塞的操作單獨開啟線程或者進(jìn)程,阻塞操作可以異步執(zhí)行
弊端:無法無限制開啟多線程或多進(jìn)程。
原則:線程池處理的是阻塞且耗時的操作
單線爬蟲示例:
import time def get_page(str): ? ? print("正在下載:",str) ? ? time.sleep(2) ? ? print('下載成功:',str) name_list = ['aa','bb','cc','dd'] start_time = time.time() for i in range(len(name_list)): ? ? get_page(name_list[i]) end_time = time.time() print('%d second'% (end_time-start_time))
多線程爬蟲示例:
import time # 導(dǎo)入線程池模塊對應(yīng)的類 from multiprocessing.dummy import Pool start_time = time.time() def get_page(str): ? ? print("正在下載:",str) ? ? time.sleep(2) ? ? print('下載成功:',str) name_list = ['aa','bb','cc','dd'] # 實例化一個線程池對象 pool = Pool(4) # 將列表中每一個列表元素傳遞給get_page進(jìn)行處理 pool.map(get_page,name_list) end_time = time.time() print(end_time-start_time)
案例:
# 多線爬蟲示例 import requests from lxml import etree import re from multiprocessing.dummy import Pool headers = { ? ? 'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0', ? ? 'Content-type':'application/json', } # 對下述url發(fā)起請求解析出視頻詳情頁的url和視頻的名稱 url = "https://pearvideo.com/category_5" page_text = requests.get(url=url,headers=headers).text tree = etree.HTML(page_text) li_list = tree.xpath('//ul[@id="listvideoListUl"]/li') urls = [] #存儲所有視頻的鏈接 for li in li_list: ? ? detail_url = 'https://pearvideo.com/' + li.xpath('./div/a/@href')[0] ? ? name = li.xpath('./div/a/div[2]/text()')[0]+'.mp4' ? ? # 對詳情頁的url發(fā)起請求 ? ? detail_page_text = requests.get(url=detail_url,headers=headers).text ? ? # print(detail_url,name) ? ? # 從詳情頁中解析出視頻的地址(url) ? ? id = re.findall(r'\d+', detail_url)[0] # ? ? https://pearvideo.com/videoStatus.jsp?contId=1751458&mrd=0.32392817067398805 ? ? detail_vedio_url = 'https://pearvideo.com/videoStatus.jsp?contId='+id ? ? header1s = { ? ? ? ? 'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0', ? ? ? ? 'Content-type': 'application/json', ? ? ? ? 'referer':detail_url ? ? } ? ? vedio_text = requests.get(url=detail_vedio_url,headers=header1s).json() ? ? # print(vedio_text) ? ? vedio_url = vedio_text['videoInfo']['videos']['srcUrl'] ? ? dic = { ? ? ? ? 'name': name, ? ? ? ? 'url': vedio_url ? ? } ? ? urls.append(dic) ? ? print(vedio_url) def get_video_data(dic): ? ? url = dic['url'] ? ? print(dic['name'],'正在下載......') ? ? data = requests.get(url=url,headers=header1s).content # ? 持久化存儲操作 ? ? with open(dic['name'],'wb') as fp: ? ? ? ? fp.write(data) ? ? ? ? print(dic['name'],'下載成功') # 使用線程池對視頻數(shù)據(jù)進(jìn)行請求(較為耗時的阻塞操作) pool = Pool(4) pool.map(get_video_data,urls) pool.close() pool.join()
到此這篇關(guān)于python異步爬蟲之多線程的文章就介紹到這了,更多相關(guān)python爬蟲多線程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
windows python3安裝Jupyter Notebooks教程
這篇文章主要介紹了windows python3安裝Jupyter Notebooks教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04Python分支結(jié)構(gòu)(switch)操作簡介
這篇文章主要介紹了Python分支結(jié)構(gòu)(switch)操作簡介,具有一定借鑒價值,需要的朋友可以參考下2018-01-01Python+Selenium實現(xiàn)在Geoserver批量發(fā)布Mongo矢量數(shù)據(jù)
這篇文章主要為大家詳細(xì)介紹了如何利用Python+Selenium實現(xiàn)在 Geoserver批量發(fā)布來自Mongo中的矢量數(shù)據(jù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-07-07PyTorch?之?強大的?hub?模塊和搭建神經(jīng)網(wǎng)絡(luò)進(jìn)行氣溫預(yù)測
hub 模塊是調(diào)用別人訓(xùn)練好的網(wǎng)絡(luò)架構(gòu)以及訓(xùn)練好的權(quán)重參數(shù),使得自己的一行代碼就可以解決問題,方便大家進(jìn)行調(diào)用,這篇文章主要介紹了PyTorch?之?強大的?hub?模塊和搭建神經(jīng)網(wǎng)絡(luò)進(jìn)行氣溫預(yù)測,需要的朋友可以參考下2023-03-03