欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

一、背景

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

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))

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

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

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是可迭代對象,里面每個參數(shù)都會給getPage方法處理
 
endTime= time.time()#結束計時
print("完成時間%d"%(endTime - beginTime))

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

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

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

單線程+異步協(xié)程?。。。。。。。。。娏彝扑],目前流行的方式。

相關概念:

#%%
import time 
#使用協(xié)程
import asyncio
 
 
async def getPage(url):  #定義了一個協(xié)程對象,python中函數(shù)也是對象
    print("開始爬取網站",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)
'''
 
#綁定回調使用
 
async def getPage2(url):  #定義了一個協(xié)程對象,python中函數(shù)也是對象
    print("開始爬取網站",url)
    time.sleep(2)#阻塞
    print("爬取完成?。?!",url)
    return url
    
#async修飾的函數(shù)返回的對象    
c2 = getPage2(2)
 
def callback_func(task):
    print(task.result()) #task.result()返回任務對象中封裝的協(xié)程對象對應函數(shù)的返回值
 
 
#綁定回調
loop_event = asyncio.get_event_loop()
task       = asyncio.ensure_future(c2)
 
task.add_done_callback(callback_func)  #真正綁定,
loop_event.run_until_complete(task)

輸出:

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

import time 
#使用多任務協(xié)程
import asyncio
 
 
 
 
urls = ['url1','url2','url3','url4','url5']
 
 
 
async def getPage(url):  #定義了一個協(xié)程對象,python中函數(shù)也是對象
    print("開始爬取網站",url)
    #在異步協(xié)程中如果出現(xiàn)同步模塊相關的代碼,那么無法實現(xiàn)異步
    #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)#創(chuàng)建任務對象
    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)) 

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

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

參考下面代碼:

async def getPage(url):  #定義了一個協(xié)程對象,python中函數(shù)也是對象
    print("開始爬取網站",url)
    #在異步協(xié)程中如果出現(xià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()返回二進制數(shù)據(jù),注意不是content
    print("爬取完成?。?!",url)
    return page_text 

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

相關文章

  • python函數(shù)缺省值與引用學習筆記分享

    python函數(shù)缺省值與引用學習筆記分享

    有關一個在函數(shù)參數(shù)設置缺省值與引用的問題,這個問題是大多數(shù)Pythoner可能會忽視的問題,作個筆記,以備后閱,同時供需要的朋友參考
    2013-02-02
  • python重要函數(shù)eval多種用法解析

    python重要函數(shù)eval多種用法解析

    這篇文章主要介紹了python重要函數(shù)eval多種用法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-01-01
  • python os.path模塊使用方法介紹

    python os.path模塊使用方法介紹

    os.path 模塊是系統(tǒng)路徑操作模塊,但實際的原理可以把它認為是處理包含斜杠("/")和反斜杠("\")字符串的模塊,其中,斜杠("/")是 linux 系統(tǒng)下的路徑分隔符,和反斜杠("\")是 windows 系統(tǒng)下的路徑分隔符
    2022-08-08
  • 關于Python函數(shù)對象的名稱空間和作用域

    關于Python函數(shù)對象的名稱空間和作用域

    這篇文章主要介紹了關于Python函數(shù)對象的名稱空間和作用域,數(shù)據(jù)的名稱是儲存到棧區(qū),而數(shù)據(jù)的內容是儲存到堆區(qū),當我們要去使用數(shù)據(jù)的內容時,我們可以通過數(shù)據(jù)的名稱來直接去表示數(shù)據(jù)的內容,需要的朋友可以參考下
    2023-04-04
  • python 實現(xiàn)return返回多個值

    python 實現(xiàn)return返回多個值

    今天小編就為大家分享一篇python 實現(xiàn)return返回多個值,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-11-11
  • python實現(xiàn)web郵箱掃描的示例(附源碼)

    python實現(xiàn)web郵箱掃描的示例(附源碼)

    這篇文章主要介紹了python實現(xiàn)web郵箱掃描的示例(附源碼),幫助大家更好的理解和學習使用python,感興趣的朋友可以了解下
    2021-03-03
  • python 實現(xiàn)Requests發(fā)送帶cookies的請求

    python 實現(xiàn)Requests發(fā)送帶cookies的請求

    這篇文章主要介紹了python 實現(xiàn)Requests發(fā)送帶cookies請求的方法,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2021-02-02
  • python3環(huán)境搭建過程(利用Anaconda+pycharm)完整版

    python3環(huán)境搭建過程(利用Anaconda+pycharm)完整版

    這篇文章主要介紹了python3環(huán)境搭建過程(利用Anaconda+pycharm)完整版,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • python k-近鄰算法實例分享

    python k-近鄰算法實例分享

    這個算法主要工作是測量不同特征值之間的距離,有個這個距離,就可以進行分類了。簡稱kNN。
    2014-06-06
  • python模塊之StringIO使用示例

    python模塊之StringIO使用示例

    這篇文章主要介紹了python模塊之StringIO使用示例,本文直接給出示例代碼,需要的朋友可以參考下
    2015-04-04

最新評論