gevent简介
- gevent是一个python的并发库,它为各种并发和网络相关的任务提供了整洁的API。
- gevent中用到的主要模式是greenlet,它是以C扩展模块形式接入Python的轻量级协程。 greenlet全部运行在主程序操作系统进程的内部,但它们被协作式地调度。
实战
通过用gevent把异步访问得到的数据提取出来。
在有道词典搜索框输入“hello”按回车。观察数据请求情况观察有道的url构建。
分析url规律
#url构建只需要传入word即可
url = "http://dict.youdao.com/w/eng/{}/".format(word)
解析网页数据
def fetch_word_info(word):
url = "http://dict.youdao.com/w/eng/{}/".format(word)
resp = requests.get(url,headers=headers)
doc = pq(resp.text)
pros = ''
for pro in doc.items('.baav .pronounce'):
pros+=pro.text()
description = ''
for li in doc.items('#phrsListTab .trans-container ul li'):
description +=li.text()
return {
'word':word,'音标':pros,'注释':description}
因为requests库在任何时候只允许有一个访问结束完全结束后,才能进行下一次访问。无法通过正规途径拓展成异步,因此这里使用了monkey补丁
- 猴子补丁
requests库是阻塞式的,为了将requests同步更改为异步。只有将requests库阻塞式更改为非阻塞,异步操作才能实现。
而gevent库中的猴子补丁(monkey patch),gevent能够修改标准库里面大部分的阻塞式系统调用。这样在不改变原有代码的情况下,将应用的阻塞式方法,变成协程式的(异步)。
同步代码
import requests
from pyquery import PyQuery as pq
import gevent
import time
import gevent.monkey
gevent.monkey.patch_all()
words = ['good','bad','cool',
'hot'