协程实现爬虫的例子主要优势在于充分利用IO时间去请求其他的url
# 分别使用urlopen和requests两个模块进行演示 # import requests # 需要安装的 # from urllib.request import urlopen # # url = 'http://www.baidu.com' # # # res1 = urlopen(url) # urlopen,获取到页面请求对象 # res2 = requests.get(url) # requests.get获取到请求对象 # print(res1) # print(res2) # print(res1.read().decode('utf-8')) # 获取到页面源码,有缩进的 # print(res2.content.decode('utf-8')) # 获取到页面源码,无缩进的 # 协程实现爬虫的例子 # 这里只去处理请求过程中的IO等待,这样请求一个URL的时候,在URL还未返回的这个阶段就发生了IO事件,此时就会发生协程切换去获取另外一个URL,如此协程就充分巧妙利用了程序任务中的IO时间 from gevent import monkey monkey.patch_all() # 打猴子补丁,使IO操作能被协程发现,从而使得协程能够协程切换工作 import gevent from urllib.request import urlopen def get_url(url): response = urlopen(url) content = response.read().decode('utf-8') return len(content) if __name__ == '__main__': url_list = ['http://www.baidu.com', 'http://www.sogou.com', "http://www.cnblogs.com"] g_lst = [] for url in url_list: g = gevent.spawn(get_url, url) g_lst.append(g) gevent.joinall(g_lst) # 阻塞等待协程任务执行结束 for g in g_lst: print(g.value) # 协程对象.value能得到任务的返回值