前言
网络爬虫是一种高IO密集型任务,所以传统的进程或者多进程并不适合网络爬虫。虽然由于CPython中全局解释器锁GIL的存在,无法真正意义上的实现多线程,但这种“不完美的多线程”依然可以大大提高爬虫效率,当然在提高爬虫效率方面还有大家所熟知的协程。
多线程与协程的简单介绍
比较官方的介绍我就不说了,毕竟瞅了一眼一大串,这个快节奏的时代相信也没有多少人看到下去,哈哈。
简单的讲,如果把一个进程看成一个空间,那么多进程就是多个可以互相隔离的并行空间,而多线程则是在一个进程空间中开辟出多个并行的线程,这也就意味着多个线程间是共享资源的,因此多线程相比于多进程的数据安全性更低,这也是CPython引入GIL的原因。那么如何理解协程呢,事实上,多线程的本质是在一个进程的基础上实现高并发,而协程则是在一个线程的基础上实现高并发,协程的调度是通过代码来实现的,而不是CPU。(还是写了一大串哈)
一言不合上代码
下面以访问百度关于"爬虫"关键字为例,获取其前6页并解析相关信息。抓取时间已在代码中展出。
from gevent import monkey;monkey.patch_all()
from lxml import etree
from concurrent.futures import ThreadPoolExecutor
import requests
import time
import gevent
def wrapper_statistics_time(func):
"""设置一个计算函数运行时间的装饰器"""
def inner(*args, **kwargs