本文主要是介绍Python爬虫从入门到精通:(16)线程池_Python涛哥,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
线程池
我们暂时用自己的服务器进行爬取(Flask的基本使用)
Flask的基本使用:
-
环境安装:
pip install flask
-
创建一个py源文件
-
详细代码看
FlaskServer.py
#!/usr/bin/env python3 # -*- coding: utf-8 -*- from flask import Flask, render_template from time import sleep# 实例化一个app 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__':# debug=True表示开启调试模式:服务器端代码被修改按下保存键会自动重启服务器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).textreturn 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) # 3 表示开启线程的数量# 难点:pool.map。表示一个函数,依次调用参数,然后返回# 使用get_request作为回调函数,需要基于异步的形式对urls列表中的每一个列表元素进行操作# 保证回调函数必须要有一个参数和返回值result_list = pool.map(get_request, urls)print(result_list)print('总耗时:', time.time() - start)
pool.map
不理解的话,可以去看下 Python里的map
函数,类似的意思。
代码执行后,我们发现,总耗时才2秒!是不是提升了效率!
关注 Python涛哥!学习更多Python知识!
这篇关于Python爬虫从入门到精通:(16)线程池_Python涛哥的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!