我們在對多個鏈接進行處理的時候,往往是先請求一個鏈接獲得數據後,再請求第二個。
中間在等待返回數據時候,存在一個空閒時間,腳本啥都沒幹。
用aiohttp異步協程的方法,創建多條任務發送請求(理論上不是多任務,可以理解爲前一個請求發送後不等待結果就發送第二條請求)
這裏引用的是別人的案例,對異步協程過程已經進行封裝,主要腳本名字“xiuren.py”
# coding=utf-8 import aiohttp import asyncio class xiuren: def __init__(self, urls): self.urls = urls self.browser_header = { 'cookie': 'ASPSESSIONIDASQAASCA=DFGGEPNAAJKPIAGBHOKMFNEA; cfstatshowcookie=xiurenji', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/104.0.5112.81 Safari/537.36 Edg/104.0.1293.54'} async def get_data(self, url): async with aiohttp.ClientSession() as session: # 等價於request async with session.get(url=url, headers=self.browser_header) as resp: # 等價於resp=request.get() return [url, await resp.content.read()] # 返回數據 async def main(self): tasks = [asyncio.create_task(self.get_data(url)) for url in self.urls] # 創建任務列表 await asyncio.wait(tasks) # 執行併發任務 return [i.result() for i in tasks] # 返回數據 def run(self): loop = asyncio.get_event_loop() return loop.run_until_complete(self.main()) # 返回數據
請求鏈接的腳本
from xiuren import xiuren urls = [ "https://www.qq.com", 'https://www.baidu.com', 'https://www.sina.com.cn', 'https://www.avvdc.com', 'https://www.163.com' ] for i in xiuren(urls=urls).run(): print(i)
接下來就是請求後數據的獲取,關鍵點在這一段, 將決定你輸出的內容
return ['status',resp.status] # 返回請求後的狀態碼 return ['headers',resp.headers] # 返回請求後的響應頭 return ['body',await resp.text()] # 返回請求後的響應體 return ['bytes',await resp.read()] # 返回請求後的響應體二進制內容 return ['json',await resp.json()] # 返回請求後的響應體二進制內容
返回數據後,然後對數據進行處理提取就可以了,print這一步處理數據
aiohttp還可以對腳本設置參數,比如請求數據,設置超時時間等,詳細就直接貼地址參考了
https://www.cnblogs.com/jiba/p/16672319.html
https://www.cnblogs.com/XiaoYang-sir/p/16217721.html