0
点赞
收藏
分享

微信扫一扫

2023爬虫学习笔记 -- 协程操作

倪雅各 2023-03-03 阅读 76

一、普通访问,获取网站内容需要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()-程序开始时间)

2023爬虫学习笔记 -- 协程操作_HTML

二、协程操作

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、运行结果,比普通函数快了很多

2023爬虫学习笔记 -- 协程操作_HTML_02

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 条评论