#-*- 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 絕對值得檢視。非同步是怎麼一回事?在傳統的順序程式設計中,所有傳送給直譯...