一、前言
很多时候我们写了一个爬虫,实现了需求后会发现了很多值得改进的地方,其中很重要的一点就是爬取速度。本文就通过代码讲解如何使用多进程、多线程、协程来提升爬取速度。注意:我们不深入介绍理论和原理,一切都在代码中。
二、同步
首先我们写一个简化的爬虫,对各个功能细分,有意识进行函数式编程。下面代码的目的是访问300次百度页面并返回状态码,其中parse_1
函数可以设定循环次数,每次循环将当前循环数(从0开始)和url传入parse_2
函数。
import requests
def parse_1():
url = 'https://www.baidu.com'
for i in range(300):
parse_2(url)
def parse_2(url):
response = requests.get(url)
print(response.status_code)
if __name__ == '__main__':
parse_1()
性能的消耗主要在IO请求中,当单进程单线程模式下请求URL时必然会引起等待
示例代码就是典型的串行逻辑,parse_1
将url和循环数传递给parse_2
,parse_2
请求并返回状态码后parse_1
继续迭代一次,重复之前步骤
三、多线程
因为CPU在执行程序时每个时间刻度上只会存在一个线程,因此多线程实际上提高了进程的使用率从而提高了CPU的使用率
实现多线程的库有很多,这里用concurrent.futures
中的ThreadPoolExecutor
来演示。介绍