2023爬虫学习笔记 -- 协程操作
Posted web安全工具库
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2023爬虫学习笔记 -- 协程操作相关的知识,希望对你有一定的参考价值。
一、普通访问,获取网站内容需要1秒左右,但是如果用协程,会更快一点
程序开始时间=time.time()
网址列表=['http://www.baidu.com','http://www.sogou.com','http://www.163.com']
头=
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
def 访问网站(url):
网站内容=requests.get(url=url,headers=头).text
解析=etree.HTML(网站内容)
解析内容=解析.xpath('/html/head/title/text()')[0]
print(解析内容)
for 网址 in 网址列表:
访问网站(网址)
print("总耗时长:",time.time()-程序开始时间)
二、协程操作
1、设置程序开始时间,定义一个目标列表
程序开始时间=time.time()
网址列表=['http://www.baidu.com','http://www.sogou.com','http://www.163.com']
头=
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
2、在函数开头需要加上关键字async,创建一个协程请求aiohttp.ClientSession(),相当于requests,然后通过text()获取网页的内容,并且返回
async def 访问网站(url):
async with aiohttp.ClientSession() as 协程请求:
async with await 协程请求.get(url=url,headers=头) as 响应内容:
网站内容=await 响应内容.text()
return 网站内容
3、这是解析操作,协程中把耗时操作单独写出来
def 解析操作(内容):
网站内容=内容.result()
解析 = etree.HTML(网站内容)
解析内容 = 解析.xpath('/html/head/title/text()')[0]
print(解析内容)
4、创建一个时间循环,固定写法,将创建的协程任务放到该事件中执行
事件循环=asyncio.new_event_loop()
asyncio.set_event_loop(事件循环)
5、创建任务,把所有任务写到一个任务列表中
任务列表=[]
for 网址 in 网址列表:
网站对象=访问网站(网址)
任务=asyncio.ensure_future(网站对象,loop=事件循环)
任务.add_done_callback(解析操作)
任务列表.append(任务)
6、再把任务列表传递给事件循环中执行
事件循环.run_until_complete(asyncio.wait(任务列表))
7、运行结果,比普通函数快了很多
8、附源码
程序开始时间=time.time()
网址列表=['http://www.baidu.com','http://www.sogou.com','http://www.163.com']
头=
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36"
async def 访问网站(url):
async with aiohttp.ClientSession() as 协程请求:
async with await 协程请求.get(url=url,headers=头) as 响应内容:
网站内容=await 响应内容.text()
return 网站内容
def 解析操作(内容):
网站内容=内容.result()
解析 = etree.HTML(网站内容)
解析内容 = 解析.xpath('/html/head/title/text()')[0]
print(解析内容)
事件循环=asyncio.new_event_loop()
asyncio.set_event_loop(事件循环)
任务列表=[]
for 网址 in 网址列表:
网站对象=访问网站(网址)
任务=asyncio.ensure_future(网站对象,loop=事件循环)
任务.add_done_callback(解析操作)
任务列表.append(任务)
事件循环.run_until_complete(asyncio.wait(任务列表))
print("总耗时长:",time.time()-程序开始时间)
以上是关于2023爬虫学习笔记 -- 协程操作的主要内容,如果未能解决你的问题,请参考以下文章