线程池
我们暂时用自己的服务器进行爬取(Flask的基本使用)
Flask的基本使用:
-
环境安装: pip install flask
-
创建一个py源文件 -
详细代码看 FlaskServer.py
from flask import Flask, render_template
from time import sleep
app = Flask(__name__)
@app.route('/bobo')
def index_1():
sleep(2)
return render_template('test.html')
@app.route('/jay')
def index_2():
sleep(2)
return render_template('test.html')
@app.route('/tom')
def index_3():
sleep(2)
return render_template('test.html')
if __name__ == '__main__':
app.run(debug=True)
运行后,就可以进去自己的网站了
线程池:
所谓多线程,官方解释自行了解。
不过用我们通俗的话打比方就是: 多个人同时切菜。比起轮流切菜时间要短,效率要高!
线程池:打比方就是把这些人,这些工作放到一个厨房里,然后启用开始工作!
我们先来看下爬取刚才的Flask网站的 正常爬取步骤:
import time
import requests
from multiprocessing.dummy import Pool
urls = [
'http://127.0.0.1:5000/bobo',
'http://127.0.0.1:5000/jay',
'http://127.0.0.1:5000/tom'
]
def get_request(url):
page_text = requests.get(url=url).text
return len(page_text)
if __name__ == '__main__':
start = time.time()
for url in urls:
print(get_request(url))
print('总耗时:', time.time() - start)
上面就是单线程操作(轮流切菜模式),也叫做同步执行!我们来看下结果:
很显然,我们看到代码执行的时间是6秒左右,说明平均爬取一个网站的速度要2秒左右。
异步爬取:(多人同时切菜模式)
当爬取的网站越多,数据越大,耗时越长,这不是我们想要的。于是就有了多线程,多进程等
异步实现代码:
if __name__ == '__main__':
start = time.time()
pool = Pool(3)
result_list = pool.map(get_request, urls)
print(result_list)
print('总耗时:', time.time() - start)
pool.map 不理解的话,可以去看下 Python里的map 函数,类似的意思。
代码执行后,我们发现,总耗时才2秒!是不是提升了效率!
关注 Python涛哥!学习更多Python知识!
|