异步爬虫概述
异步爬虫概述
异步爬虫的作用很显而易见,就是为了提高我们爬虫的效率。因为网络请求通常会消耗一点时间,普通的爬虫在网络请求这段时间会诸塞住,CPU 的资源是浪费掉了。使用异步爬虫,就是在一个任务请求数据的时候,把 CPU 让出来,处理其他任务,从而提高爬虫的效率。
异步爬虫在实际应用中很有用也很没有用。说他有用,是因为就是像前面说的,可以提高爬虫的效率。说他没用,是因为实际的爬虫中,我们很多时候不那么追求效率。毕竟如果请求过于频繁,是有可能把人家的服务器搞崩掉的,会造成麻烦。另外,如果人家的服务器设置了反爬,有可能会禁掉我们的 IP。所以有些时候,我们不但不会想方设法提高效率,反而还会适当降低一点请求的频率。细水长流嘛。
当然,话说回来,有没有用是他的事,学不学是我们的事。知道怎么进行异步爬虫,才不至于将来用的时候手忙脚乱。
在这里主要介绍两种异步爬虫机制:
- 基于线程池的异步爬虫
- 基于单线程 + 多任务的异步爬虫(基于 asyncio 协程)
当然异步爬虫不仅限于这两个,而且线程池和协程也会有很多种写法,这里只是抛砖引玉,具体怎么用还得随机应变,灵活使用。
使用 Flask 框架搭建一个简单的 Web 服务器
我们要进行异步爬虫的演示,要看到效果就要对比同步和异步过程需要消耗的时间。如果使用网络中的服务器,测试时间会受网络波动的影响,不一定准确。所以在开始介绍异步爬虫之前,先让我们在本地搭建一个 Web 服务器。这样,用这个服务器测试我们的结果,就不会受网速的影响了。
我们从前一致用 Django 搭建 Web 服务器,这次我们换一个轻量的 Web 框架,Flask。
首先,我们要安装 Flask:
pip install flask
然后创建一个 py 文件,名字随意,比如就叫 FlaskServer.py。
然后就可以创建一个 Web 服务器了:
from flask import Flask, render_template
from time import sleep
# 实例化一个app
app = Flask(__name__)
# 创建视图函数&路由地址
def index_1():
sleep(2) # 这里睡2秒是为了模拟网络请求消耗的时间
return render_template('test.html') # test.html放在FlaskServer.py同级目录下的templates文件夹中
def index_2():
sleep(2)
return render_template('test.html')
def index_3():
sleep(2)
return render_template('test.html')
if __name__ == "__main__":
# debug=True表示开启调试模式:服务器端代码被修改后按下保存键会自动重启服务
app.run(debug=True)
执行文件,即可启动 Flask 项目。项目默认运行在 http://127.0.0.1:5000/。
可以通过修改 run 的 port 的参数,置顶端口。