在理解异步爬虫之前,我们首先需要理解同步和异步编程的基本概念。
1. 同步(Synchronous)
同步是指程序按照代码的顺序一步步执行,每一步都要等待前一步完成后才能进行下一步。这种方式简单易懂,但在处理I/O操作(如网络请求、读写文件等)时,可能会导致程序的效率低下。
例如,你在做饭,同步的方式就是你先洗菜,等菜洗完了,你再去切菜,等切菜完了,你再去炒菜。这个过程中,你在做每一件事的时候都不能做其他事情。
# 一个简单的同步操作例子
import time
def job(t):
print(f'Start job {t}')
time.sleep(t) # 等待t秒,模拟I/O操作
print(f'Finish job {t}')
def main():
[job(t) for t in range(1, 3)]
main()
2. 异步(Asynchronous)
异步是指程序不需要阻塞等待I/O操作的完成,可以在等待过程中执行其他任务。这种方式可以极大地提高程序的效率。
例如,你在做饭,异步的方式就是你把菜放进锅里炒,然后就去洗碗,等你洗完碗,菜可能也炒好了。这个过程中,你在等待菜炒的过程中并没有闲着,而是去做了其他事情。
# 一个简单的异步操作例子
import asyncio
async def job(t):
print(f'Start job {t}')
await asyncio.sleep(t) # 等待t秒,模拟I/O操作
print(f'Finish job {t}')
async def main(loop):
tasks = [loop.create_task(job(t)) for t in range(1, 3)]
await asyncio.wait(tasks)
loop = asyncio.get_event_loop()
loop.run_until_complete(main(loop))
loop.close()
在爬虫中的应用
在爬虫中,我们经常需要进行网络请求(一种I/O操作),如果使用同步的方式,那么在等待服务器响应的过程中,我们的爬虫就无法做其他事情,这就导致了效率的低下。而如果使用异步的方式,我们的爬虫就可以在等待服务器响应的过程中进行其他网站的请求,这样就大大提高了爬虫的效率。
推荐阅读:
https://mp.weixin.qq.com/s/dV2JzXfgjDdCmWRmE0glDA
https://mp.weixin.qq.com/s/an83QZOWXHqll3SGPYTL5g
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。