asyncio在爬蟲中的使用

2022-06-16 08:36:13 字數 3975 閱讀 4150

#

-*- coding: utf-8 -*-

#協程基礎.py

import

asyncio

import

time

async

defrequest(url):

print("

正在請求:

非同步函式返回的協程物件

#1.例項化事件迴圈

loop =asyncio.get_event_loop()

#2.任務物件,把協程物件放到任務物件中

task =loop.create_task(c)

#3.把任務物件放到事件迴圈中

loop.run_until_complete(task)

#

-*- coding: utf-8 -*-

#給任務物件繫結**.py

import

asyncio

import

time

async

defrequest(url):

print("

正在請求:

非同步函式返回的協程物件

#**函式的引數是任務物件task,**在爬蟲中是用來解析的

defparse(task):

print("

這是**函式")

print("

列印結果是協程函式的返回值

", task.result())

#1.例項化事件迴圈

loop =asyncio.get_event_loop()

#2.任務物件,把協程物件放到任務物件中

task =loop.create_task(c)

#給任務物件繫結乙個**函式

task.add_done_callback(parse)

#3.把任務物件放到事件迴圈中

loop.run_until_complete(task)

#

-*- coding: utf-8 -*-

#多工非同步協程.py

正在請求:

", url)

#time.sleep(3) # 需要改成支援非同步的**

await asyncio.sleep(3) #

協程物件

print("

", url)

loop =asyncio.get_event_loop()

#任務列表,放置多個任務

tasks =

for url in

urls:

c = request(url) #

協程物件

task =loop.create_task(c)

loop.run_until_complete(asyncio.wait(tasks))

print('

總共耗時:

', time.time() - start)

#

-*- coding: utf-8 -*-

#多工非同步協程在爬蟲中應用.py

跟requests的區別就是支援非同步請求

#單執行緒 + 多工非同步協程

#start = time.time()

#urls = [

#'',

#'',

#'',#]

##async def get_pagetext(url):##

page_text = requests.get(url).text # 不支援非同步請求,所以會報錯##

# 返回給**函式

#return page_text##

#loop = asyncio.get_event_loop()

#tasks =

#for url in urls:

#c = get_pagetext(url)

#task = loop.create_task(c)##

loop.run_until_complete(asyncio.wait(tasks))##

print('總共耗時:', time.time() - start)

start =time.time()

urls =[

'', #

頁面響應2秒

'', #

頁面響應2秒

'', #

頁面響應2秒]#

**操作的時候

#開啟乙個連線請求s

#await的使用條件: 請求和響應都存在網路傳輸,

#傳送乙個連線請求,其他引數跟用request發請求一樣比如headers,直接寫括號裡

async with await s.get(url=url) as response:

#獲取響應

page_text =await response.text()

#print(page_text)

#把page_text傳給**函式進行解析

return

page_text

from lxml import

etree

defparse(task):

#獲取 執行函式呼叫的結果

page_text =task.result()

## 例項化etree解析物件

#tree = etree.html(page_text)

#page_data = tree.xpath('//*[@id="page"]/a[1]/span[1]/i/@class')[0]

print(page_text, "

開始對頁面進行解析")

loop =asyncio.get_event_loop()

tasks =

for url in

urls:

c =get_pagetext(url)

task =loop.create_task(c)

#給每乙個任務物件繫結**函式

task.add_done_callback(parse)

loop.run_until_complete(asyncio.wait(tasks))

print('

總共耗時:

', time.time() - start)

Python中多程序在爬蟲中的使用

本來這周準備寫乙個整合ip池,多程序的高效爬取所有職位詳細資訊的爬蟲的,結果在多程序這一塊兒折騰了好久,簡直把我氣死,雖然內容其實不多,但把自己學習的過程寫下來,希望能幫到有同樣困惑的朋友。實現多工最常見的兩種方式就是多程序和多執行緒了。多程序,顧名思義,多個程序併發執行,可以有效提高程式的執行效率...

python非同步框架asyncio的使用

python對非同步程式設計有原生的支援,即asyncio標準庫,使用非同步io模型可以節約大量的io等待時間,非常適合於爬蟲任務。import time import asyncio import aiohttp 用非同步方式獲取網頁內容 loop asyncio.get event loop 獲...

Python中的非同步程式設計 Asyncio

如果你已經決定要理解 python 的非同步部分,歡迎來到我們的 asyncio how to 注 哪怕連異動正規化的存在都不知道的情況下,你也可以成功地使用 python。但是,如果你對底層執行模式感興趣的話,asyncio 絕對值得檢視。非同步是怎麼一回事?在傳統的順序程式設計中,所有傳送給直譯...