亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用Python怎么實現異步爬蟲的原理是什么

發布時間:2021-05-13 16:32:43 來源:億速云 閱讀:221 作者:Leah 欄目:開發技術

這篇文章給大家介紹使用Python怎么實現異步爬蟲的原理是什么,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

一、背景

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

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

使用Python怎么實現異步爬蟲的原理是什么

下面通過模擬爬取網站來完成對多線程,多進程,協程的理解。

二、多線程實現

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

使用Python怎么實現異步爬蟲的原理是什么

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

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

三、協程實現

單線程+異步協程!!!!!!!!!!強烈推薦,目前流行的方式。

相關概念:

使用Python怎么實現異步爬蟲的原理是什么

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

輸出:

使用Python怎么實現異步爬蟲的原理是什么

四、多任務協程實現

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

使用Python怎么實現異步爬蟲的原理是什么

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

對于真正爬取過程中,如在getPage()方法中真正爬取數據時,即requests.get(url) ,它是基于同步方式實現。應該使用異步網絡請求模塊aiohttp

參考下面代碼:

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

使用Python怎么實現異步爬蟲的原理是什么

python可以做什么

Python是一種編程語言,內置了許多有效的工具,Python幾乎無所不能,該語言通俗易懂、容易入門、功能強大,在許多領域中都有廣泛的應用,例如最熱門的大數據分析,人工智能,Web開發等。

關于使用Python怎么實現異步爬蟲的原理是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

合作市| 都匀市| 阳山县| 扎鲁特旗| 镇平县| 庆阳市| 武强县| 汉沽区| 大邑县| 麻城市| 镇江市| 石柱| 泰顺县| 连云港市| 习水县| 北宁市| 宁明县| 玉田县| 昔阳县| 沁阳市| 台东县| 牙克石市| 越西县| 遵义市| 疏勒县| 尖扎县| 金平| 白水县| 江北区| 马山县| 廉江市| 武宣县| 葫芦岛市| 安平县| 凤山市| 盐源县| 新乡市| 东阿县| 富阳市| 吐鲁番市| 眉山市|