运行环境:python3.6
第三方库安装:pip install gevent
网络爬虫,这种io高密集型的应用由于大部分的时间在等待响应方面,所以CPU的使用率并不高,为了解决这些问题,我们使用异步的方式来进行爬虫程序。
gevent是python的第三方库,通过greenlet实现协程,其基本思想是:
当一个greenlet遇到IO操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继续执行。由于IO操作非常耗时,经常使程序处于等待状态,有了gevent为我们自动切换协程,就保证总有greenlet在运行,而不是等待IO。
下面是正常请求和试用协程请求的简单案例:
import gevent
import requests
import time
# 创建一个待爬的url列表
url_list = ["https://www.youkuaiyun.com", "https://www.jianshu.com", "https://www.baidu.com", "https://blog.youkuaiyun.com/t8116189520",
"https://www.baidu.com", "https://www.baidu.com", "https://ai.youdao.com", "https://www.163.com/",
"https://fanyi.baidu.com", "https://www.tmall.com/", "https://www.taobao.com/" ]
# 定义一个功能函数,输入url获取网页源码
def get_HTML(url):
resp=requests.get(url)
# 判断响应码是否为200
if resp.status_code==200:
res=resp.status_code
pass
else:
print(url,resp.status_code)
# 试用普通方法对url列表进行请求,并计算耗时
def common_method(url_list):
time_begin = time.time()
for i in url_list:
get_HTML(i)
print(time.time() - time_begin)
# 试用协程对url列表进行请求,并计算耗时
def gevent_method(url_list):
time_begin=time.time()
g_list=[]
for i in url_list:
s=gevent.spawn(get_HTML, i)
g_list.append(s)
gevent.joinall(g_list)
print(time.time()-time_begin)
print("begin common")
common_method(url_list)
print("begin gevent")
gevent_method(url_list)
运行结果如下:
ps:由于待爬的列表数量比较少,所以效率提升并不是很明显。