如何使用grequests 异步IO批量请求

python grequests 库的使用记录

  • 简介:

    对于大名鼎鼎的request库相信大家都已经非常熟悉了,不过他有个不好的缺点就是阻塞性IO,在你使用request.get()获取所需要的网页时,除非这个网页下载完成,不然不能进行对新网页的获取;而cup的处理速度远比IO读写的速度快多了,为了充分利用cpu,加快网页爬取速度,这里讲介绍使用异步IO获取网页的grequests库的使用。这两个库都是 kennethreitz开发的,用法非常相似。

  • 安装install
    pip install grequests

  • 基础用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#要爬取的url集合
urls = [
url = 'https://www.zhihu.com/people/excited-vczh/following',
url = 'https://www.zhihu.com/people/liaoxuefeng/following',
url = 'https://www.zhihu.com/people/hellolin-30/following'
]
#同时将上述请求发送
rs = (grequests.get(u) for u in urls)
#查看发送请求的响应状态码和响应结果:
respond_html=[]
for resp in grequests.map(rs, exception_handler=exception_handler):
# grequests.map可以查看异步io么一个请求返回的状态码200 500
# print('status:{0} url:{1}'.format(resp, resp.url))
if resp is not None:
respond_html.append(resp.text)
else:
continue
  • 异常的处理
1
2
def exception_handler(request, exception):
print('got exception request: {0}, exception {1}'.format(request, exception))
  • 异步IO实际运用效果的反思:

     a.原本毕设在做一个基于python的知乎用户信息特征爬虫系统的,为了加快爬取速度思考使用异步IO,主要思路:                  
    1 对用户信息的的请求入口使用异步IO(grequests)请求多个url地址        
     2 每一个用户关注人又有多个分页,对分页进行异步IO请求。
     原先未使用grequests库,由于阻塞IO的影响,每次只能爬取一个用户信息,再爬取每一用户第一页下的关注人url地址(实际未爬全所有该用户关注的用户);速度爬取相对较快;使用grequests后去爬取某个用户所有分页下的关注人url后,速度开始变慢,主要原因是:在爬取这个用户后,接着要全部爬完和解析所有分页的html(基本爬全所有关注的用户);比如某个用户关注上万人,系统爬取该用户下所有关注人都要耗费大把时间。所以异步IO提速还需要看实际的运用情况和环境。比如本身网络带宽限制,机器硬件限制等等都会影响到整体的速度。
     b.爬取过程的问题:
     虽然该系统只是爬取用户的关注人,不爬取被关注人信息。所以不存在关注和被关注的关系,当是存在 多个人关注同一个人的情况,所以如果爬取所有每个人的关注人,仍然存在爬取了很多重复性爬过的过户,特别是爬取解析分页网页(某个用户关注人特别多的情况);耗费资源时间却做很多无用功。
    个人解决方法:控制爬取的分页数(实际爬去的分页数还需算法和大数据理论支撑),概率性爬取关注人的url(分页下)。存在多人关注同一人的关系便存在概率性爬取到此用户的可能。
     缺点:部分概率爬取不到关注用户;爬取的用户数据不全。
    

    grequets使用代理

    1
    2
    proxies = {'http': 'http://219.148.108.126:8998'}
    s = (grequests.get(u, proxies=proxies) for u in urls)
  • 参考