【python爬虫 系列】11异步爬虫

第十一节:异步爬虫
注意:python版本3.6.0及以上才可以
11.1.异步简介

异步模型是事件驱动模型的基础。异步活动的执行模型可以只有 一个
单一的主控制流,能在单核心系统和多核心系统中运行。在并发执行的异步模型中,许多任务被穿插在同一时间线上,所有的任务 都由一个控制流执行(单线程)。任务的执行可能被暂停或恢复,中间的这段时间线程将会去执行其他任务。

携程初步:
协程就是一个函数,只是它满足以下几个特征:
有I/0依赖的操作。
可以在进行1/0操作时暂停。
无法直接执行。
它的作用就是对有大量I/O 操作的程序进行加速。

Python协程属于可等待对象,因此可以在其他协程中被等待

基本的异步代码1import asyncio

async def main():
	print("hello...")
	await asyncio.sleep(1)
	print("....world")

asyncio.run(main())

输出:

hello...
....world
import asyncio
async def net():
	return 1

async def main():
	#net()  #错误方法
	a=await net()
	print(a) 


asyncio.run(main())

输出:1

为了可读性和理解:我们可以这么写

async def net():
	return 1

async def main():
	task=asyncio.create_task(net())
	await task

asyncio.run(main())
我们用睡眠模仿一-下耗时的I0操作
async def hello(i):
	print("hello",i)
	await asyncio.sleep(3)
	print("word",i)

if __name__ == '__main__':
	tasks=[]
	for i in range(4):
		tasks.append(hello(i))
	loop=asyncio.get_event_loop()
	loop.run_until_complete(asyncio.wait(tasks))

注意这里的sleep和我们的原生的方法,我们常用的import time time.sleep不一样,原生方法里sleep的话就是真的停止运行,且不会让其他任务执行,而这里的sleep具有等待的意思,是让其他的task执行。
输出:

hello 2
hello 3
hello 1
hello 0
word 2
word 1
word 3
word 0

通过输出结果我们就能了解异步了,并且这里的输出我们可以看到,hello并不是从0开始的,也就是输出是不可控的,这也是异步的一个重要特点。

异步爬虫基本代码
i

mport asyncio
import aiohttp
from bs4 import BeautifulSoup

headers={'Referer': 'http://xiaohua.zol.com.cn/lengxiaohua/',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36'}

async def crawl(i):
	url="http://xiaohua.zol.com.cn/lengxiaohua/{}.html".format(i)
	async with aiohttp.ClientSession(headers=headers)as session:
		async with session.get(url) as resp:
			print(resp.status)
			text=await resp.text()  #获取页面html需要时间 所以结果是穿插输出的

	print(text)
		
if __name__ == '__main__':
	loop=asyncio.get_event_loop()
	tasks=[crawl(i) for i in range(1,10)]
	loop.run_until_complete(asyncio.wait(tasks))

用异步请求库aiohttp取代requests
安装方法:pip install aiohttp
添加headers
本质上没有多大区别
只是串行变成了异步
11.2异步使用线程池和进程池(concurrent. futures模块)
我们结合这节课的异步知识和上节的多线程多进程知识
这个模块可以和异步连接
具有线程池和进程池
管理并发编程
处理非确定性的执行流程
同步功能

10个线程

import asyncio
import aiohttp
from bs4 import BeautifulSoup
from concurrent.futures import ThreadPoolExecutor

def crawl(i):
	print("1")

async def main():
	loop=asyncio.get_event_loop()
	tasks=[]
	with ThreadPoolExecutor(max_workers=10) as t:
		for i in range(10):
			tasks.append(loop.run_in_executor(
				t,crawl,i
				))

if __name__ == '__main__':
	loop=asyncio.get_event_loop()
	loop.run_until_complete(main())
	loop.close()

注意:io密集型利用线程池效率更高

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python爬虫异步是指使用并发的方式进行网页数据的获取和处理,以提高效率和性能。在异步爬虫中,可以使用多种方法实现异步操作,如使用aiohttp和asyncio库进行异步HTTP请求,使用协程来处理异步任务,以及使用线程池和进程池来实现异步执行等。 一种常见的异步爬虫实现方式是使用aiohttp和asyncio库。通过创建一个信号量对象,可以控制并发量的大小,使用async with语句将信号量作为上下文对象,从而在爬取方法中控制并发量。另外,在main方法中使用asyncio.gather方法来同时执行多个爬取任务,以提高效率。 另一种实现异步爬虫的方式是使用asyncio库中的wait方法来执行多个请求任务。首先,将需要执行的任务封装成协程对象,并放入一个任务列表中。然后,使用asyncio.wait方法来执行任务列表中的任务,并通过循环获取每个任务的结果。 除了使用aiohttp和asyncio库,还可以使用其他库来实现异步爬虫。例如,使用aiohttp库结合时间模块来控制请求的延迟时间,从而模拟异步请求的效果。在get方法中使用await关键字挂起请求,并在得到响应后再继续执行。 此外,还可以使用线程池或进程池来实现异步爬虫。通过使用multiprocessing.dummy库中的Pool类,可以创建一个线程池,并使用map方法将任务分配到多个线程中并发执行。这样可以降低系统对线程或进程的创建和销毁频率,提高系统的性能和效率。 综上所述,Python爬虫异步是通过使用异步操作的方式来提高爬取效率和性能的一种方法。可以使用aiohttp和asyncio库、线程池或进程池等不同的工具和技术来实现异步爬虫。这些方法都能够提供更高并发量和更快的响应速度,从而提升爬虫的效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值