在python3.4中,引入了asyncio模块,在3.5的版本中引入了asynic await 关键字。
这是asyncio的基础使用:
import requests import time import asyncio # 异步函数定义需要加async装饰 async def get_request(url): print(‘开始请求的url:‘, url) await asyncio.sleep(2) # 阻塞代码前需要加await,且该代码支持异步操作 print(‘请求完成的url:‘, url) return 123 def callback(t): # 为异步函数,t.result()为异步函数return的值。 print(t.result()) url_ls = [ ‘http://www.baidu1.com‘, ‘http://www.baidu2.com‘, ‘http://www.baidu3.com‘ ] if __name__ == ‘__main__‘: start = time.time() tasks = [] # 创建对象任务列表 for url in url_ls: c = get_request(url) # 创建协程对象 task = asyncio.ensure_future(c) # 创建任务对象 tasks.append(task) # 将任务对象加入到任务列表,统一执行 task.add_done_callback(callback) # 设置回调函数 loop = asyncio.get_event_loop() # 创建事件循环 res = loop.run_until_complete(asyncio.wait(tasks)) # 执行任务 print(‘总耗时为:‘, time.time()-start)
下面是配合aiohttp实现异步爬虫的代码:
import requests
import time
import asyncio
import aiohttp
from lxml import etree
# 异步函数定义需要加async装饰
async def get_request(url):
async with aiohttp.ClientSession() as session:
async with await session.get(url=url) as respones:
html = await respones.text()
print(len(html))
return html
def parse(t): # t为异步函数的任务对象 t.result()为异步函数return的值。
html = etree.HTML(t.result())
tag = html.xpath(r"//a/text()")
print(tag)
url_ls = [
‘http://www.baidu.com‘,
‘http://www.baidu.com‘,
‘http://www.baidu.com‘
]
if __name__ == ‘__main__‘:
start = time.time()
tasks = [] # 创建对象任务列表
for url in url_ls:
c = get_request(url) # 创建协程对象
task = asyncio.ensure_future(c) # 创建任务对象
tasks.append(task) # 将任务对象加入到任务列表,统一执行
task.add_done_callback(parse) # 设置回调函数
loop = asyncio.get_event_loop() # 创建事件循环
res = loop.run_until_complete(asyncio.wait(tasks)) # 执行任务
print(‘总耗时为:‘, time.time()-start)
原文:https://www.cnblogs.com/hehahahepython/p/15134200.html