最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python異步爬蟲實現(xiàn)原理與知識總結(jié)

 更新時間:2021年05月13日 08:31:14   作者:amcomputer  
之前有很多小伙伴想看Python異步爬蟲的有關(guān)知識總結(jié),這次它來了,文中有非常詳細(xì)的代碼示例與注釋,即使對剛開始學(xué)python的小伙伴也很友好,,需要的朋友可以參考下

一、背景

默認(rèn)情況下,用get請求時,會出現(xiàn)阻塞,需要很多時間來等待,對于有很多請求url時,速度就很慢。因為需要一個url請求的完成,才能讓下一個url繼續(xù)訪問。一種很自然的想法就是用異步機(jī)制來提高爬蟲速度。通過構(gòu)建線程池或者進(jìn)程池完成異步爬蟲,即使用多線程或者多進(jìn)程來處理多個請求(在別的進(jìn)程或者線程阻塞時)。

import time 
#串形
 
def getPage(url):
    print("開始爬取網(wǎng)站",url)
    time.sleep(2)#阻塞
    print("爬取完成?。?!",url)
 
 
urls = ['url1','url2','url3','url4','url5']
 
beginTime = time.time()#開始計時
 
for url in urls:
    getPage(url)
 
endTime= time.time()#結(jié)束計時
print("完成時間%d"%(endTime - beginTime))

下面通過模擬爬取網(wǎng)站來完成對多線程,多進(jìn)程,協(xié)程的理解。

二、多線程實現(xiàn)

import time 
#使用線程池對象
from multiprocessing.dummy import Pool
 
def getPage(url):
    print("開始爬取網(wǎng)站",url)
    time.sleep(2)#阻塞
    print("爬取完成?。?!",url)
 
 
urls = ['url1','url2','url3','url4','url5']
 
beginTime = time.time()#開始計時
 
#準(zhǔn)備開啟5個線程,并示例化對象
pool = Pool(5)
pool.map(getPage, urls)#urls是可迭代對象,里面每個參數(shù)都會給getPage方法處理
 
endTime= time.time()#結(jié)束計時
print("完成時間%d"%(endTime - beginTime))

完成時間只需要2s!!!!!!!!

線程池使用原則:適合處理耗時并且阻塞的操作

三、協(xié)程實現(xiàn)

單線程+異步協(xié)程?。。。。。。。。。?qiáng)烈推薦,目前流行的方式。

相關(guān)概念:

#%%
import time 
#使用協(xié)程
import asyncio
 
 
async def getPage(url):  #定義了一個協(xié)程對象,python中函數(shù)也是對象
    print("開始爬取網(wǎng)站",url)
    time.sleep(2)#阻塞
    print("爬取完成!??!",url)
    
#async修飾的函數(shù)返回的對象    
c = getPage(11)
 
#創(chuàng)建事件對象
loop_event = asyncio.get_event_loop()
#注冊并啟動looP
loop_event.run_until_complete(c)
 
#task對象使用,封裝協(xié)程對象c
'''
loop_event = asyncio.get_event_loop()
task = loop_event.create_task(c)
loop_event.run_until_complete(task)
'''
 
#Future對象使用,封裝協(xié)程對象c            用法和task差不多
'''
loop_event = asyncio.get_event_loop()
task       = asyncio.ensure_future(c)
loop_event.run_until_complete(task)
'''
 
#綁定回調(diào)使用
 
async def getPage2(url):  #定義了一個協(xié)程對象,python中函數(shù)也是對象
    print("開始爬取網(wǎng)站",url)
    time.sleep(2)#阻塞
    print("爬取完成?。?!",url)
    return url
    
#async修飾的函數(shù)返回的對象    
c2 = getPage2(2)
 
def callback_func(task):
    print(task.result()) #task.result()返回任務(wù)對象中封裝的協(xié)程對象對應(yīng)函數(shù)的返回值
 
 
#綁定回調(diào)
loop_event = asyncio.get_event_loop()
task       = asyncio.ensure_future(c2)
 
task.add_done_callback(callback_func)  #真正綁定,
loop_event.run_until_complete(task)

輸出:

四、多任務(wù)協(xié)程實現(xiàn)

import time 
#使用多任務(wù)協(xié)程
import asyncio
 
 
 
 
urls = ['url1','url2','url3','url4','url5']
 
 
 
async def getPage(url):  #定義了一個協(xié)程對象,python中函數(shù)也是對象
    print("開始爬取網(wǎng)站",url)
    #在異步協(xié)程中如果出現(xiàn)同步模塊相關(guān)的代碼,那么無法實現(xiàn)異步
    #time.sleep(2)#阻塞
    await asyncio.sleep(2)#遇到阻塞操作必須手動掛起
    print("爬取完成?。?!",url)
    return url
    
 
beginTime = time.time()  
 
 
#任務(wù)列表,有多個任務(wù)
tasks = []
 
for url in urls:
    c = getPage(url)
    task = asyncio.ensure_future(c)#創(chuàng)建任務(wù)對象
    tasks.append(task)
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(tasks))#不能直接放task,需要封裝進(jìn)入asyncio,wait()方法中
 
endTime = time.time()   
print("完成時間%d"%(endTime - beginTime)) 

此時不能用time.sleep(2),用了還是10秒

對于真正爬取過程中,如在getPage()方法中真正爬取數(shù)據(jù)時,即requests.get(url) ,它是基于同步方式實現(xiàn)。應(yīng)該使用異步網(wǎng)絡(luò)請求模塊aiohttp

參考下面代碼:

async def getPage(url):  #定義了一個協(xié)程對象,python中函數(shù)也是對象
    print("開始爬取網(wǎng)站",url)
    #在異步協(xié)程中如果出現(xiàn)同步模塊相關(guān)的代碼,那么無法實現(xiàn)異步
    #requests.get(url)#阻塞
    async with aiohttp.ClintSession() as session:
 
                     async with await  session.get(url) as response: #手動掛起
 
                                       page_text =  await response.text() #.text()返回字符串,read()返回二進(jìn)制數(shù)據(jù),注意不是content
    print("爬取完成!?。?,url)
    return page_text 

到此這篇關(guān)于Python異步爬蟲實現(xiàn)原理與知識總結(jié)的文章就介紹到這了,更多相關(guān)Python異步爬蟲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 利用Python進(jìn)行異常值分析實例代碼

    利用Python進(jìn)行異常值分析實例代碼

    數(shù)據(jù)挖掘工作中的第一步就是異常值檢測,異常值的存在會影響實驗結(jié)果。下面這篇文章主要給大家介紹了關(guān)于利用Python進(jìn)行異常值分析的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-12-12
  • Python實現(xiàn)識別圖片為文字的示例代碼

    Python實現(xiàn)識別圖片為文字的示例代碼

    這篇文章主要為大家詳細(xì)介紹了Python如何不調(diào)用三方收費接口,照樣實現(xiàn)識別圖片為文字的功能。文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-08-08
  • python調(diào)用MySql保姆級圖文教程(包會的)

    python調(diào)用MySql保姆級圖文教程(包會的)

    MySQL是當(dāng)今市場上最受歡迎的數(shù)據(jù)庫系統(tǒng)之一,由于大多數(shù)應(yīng)用程序需要以某種形式與數(shù)據(jù)交互,因此像Python這樣的編程語言提供了用于存儲和訪問這些數(shù)據(jù)的工具,這篇文章主要給大家介紹了關(guān)于python調(diào)用MySql的相關(guān)資料,需要的朋友可以參考下
    2024-12-12
  • 關(guān)于Numpy中的行向量和列向量詳解

    關(guān)于Numpy中的行向量和列向量詳解

    今天小編就為大家分享一篇關(guān)于Numpy中的行向量和列向量詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • python辦公自動化(Excel)的實例教程

    python辦公自動化(Excel)的實例教程

    使用Excel自動化處理,將會用到Python第三方庫,所以我們需要提前通過來進(jìn)行安裝,下面這篇文章主要給大家介紹了關(guān)于python辦公自動化(Excel)的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Tensorflow tf.nn.depthwise_conv2d如何實現(xiàn)深度卷積的

    Tensorflow tf.nn.depthwise_conv2d如何實現(xiàn)深度卷積的

    這篇文章主要介紹了Tensorflow tf.nn.depthwise_conv2d如何實現(xiàn)深度卷積的,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Python?matplotlib中plt.plot()函數(shù)的顏色參數(shù)設(shè)置及可以直接運行的程序代碼

    Python?matplotlib中plt.plot()函數(shù)的顏色參數(shù)設(shè)置及可以直接運行的程序代碼

    在數(shù)據(jù)可視化中matplotlib.pyplot模塊的plot函數(shù)是一個非常重要且常用的工具,用于繪制2D圖形,這篇文章主要給大家介紹了關(guān)于Python?matplotlib中plt.plot()函數(shù)的顏色參數(shù)設(shè)置及可以直接運行的程序代碼,需要的朋友可以參考下
    2024-03-03
  • k-means 聚類算法與Python實現(xiàn)代碼

    k-means 聚類算法與Python實現(xiàn)代碼

    這篇文章主要介紹了k-means 聚類算法與Python實現(xiàn)代碼,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • python中的參數(shù)類型匹配提醒

    python中的參數(shù)類型匹配提醒

    這篇文章主要介紹了python中的參數(shù)類型匹配提醒,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • Python入門教程(二十)Python的Lambda表達(dá)式

    Python入門教程(二十)Python的Lambda表達(dá)式

    這篇文章主要介紹了Python入門教程(二十)Python的Lambda表達(dá)式,lambda表達(dá)式是一行的函數(shù)。它們在其他語言中也被稱為匿名函數(shù),lambda表達(dá)式非常有用,可以讓代碼簡單,簡潔,需要的朋友可以參考下
    2023-04-04

最新評論

黎川县| 滨海县| 安溪县| 常州市| 启东市| 大城县| 六枝特区| 北流市| 鹤山市| 东乡族自治县| 仙桃市| 安新县| 枣庄市| 江北区| 灵山县| 安多县| 隆林| 手机| 依兰县| 长泰县| 阿城市| 老河口市| 巴南区| 清新县| 南投县| 门源| 甘孜| 洪雅县| 仁化县| 天长市| 永济市| 开平市| 邢台市| 正蓝旗| 会理县| 涟水县| 甘谷县| 肇庆市| 积石山| 淮北市| 澄迈县|