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爬虫学习笔记 -- 协程操作的主要内容,如果未能解决你的问题,请参考以下文章

2023爬虫学习笔记 -- 多线程操作

2023爬虫学习笔记 -- 解决爬虫Cookies问题

2023爬虫学习笔记 -- 优化xpath解析代码

2023爬虫学习笔记 -- 批量爬取图片

2023爬虫学习笔记 -- 批量获取免费代理

2023爬虫学习笔记 -- selenium库的实际应用