特殊的函数
协程对象
任务对象
事件循环对象
wait方法的作用:
注意事项【重要】:
await关键字
import requests
import asyncio
import time
import aiohttp
from lxml import etree
urls = [ # 用列表存储你想要爬取的网站
'http://www.1.com',
'http://www.2.com',
'http://www.3.com'
]
# requests是一个不支持异步的模块,需要使用aiohttp发起请求
# get_request()被async修饰后变成了一个特殊的函数
async def get_request(url):
#实例化好了一个请求对象
async with aiohttp.ClientSession() as sess:
#调用get发起请求,返回一个响应对象
#get/post(url,headers,params/data,proxy="http://ip:port")
async with await sess.get(url=url) as response:
#text()获取了字符串形式的响应数据
#read()获取byte类型的响应数据
page_text = await response.text()
return page_text
#解析函数的封装
#参数t:就是该回调函数的调用者(任务对象)
def parse(t):
#获取请求到页面源码数据
page_text = t.result() # result返回的就是特殊函数的返回值
tree = etree.HTML(page_text)
parse_text = tree.xpath('//a[@id="feng"]/text()')[0]
print(parse_text)
if __name__ == "__main__":
start = time.time()
tasks = []
for url in urls:
c = get_request(url) # c就是一个协程对象
task = asyncio.ensure_future(c) # 任务对象就是对协程对象的进一步封装
task.add_done_callback(parse) # 给task绑定一个回调函数
tasks.append(task)
loop = asyncio.get_event_loop() # 创建事件循环对象
loop.run_until_complete(asyncio.wait(tasks)) # 将任务对象注册到事件循环中且开启事件循环
print('总耗时:',time.time()-start)
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务