python aiohttp异步协程实现同时执行多条请求
我们在对多个链接进行处理的时候,往往是先请求一个链接获得数据后,再请求第二个。
中间在等待返回数据时候,存在一个空闲时间,脚本啥都没干。
用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