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()-程序开始时间)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

web安全工具库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值