专栏名称: Python开发者
人生苦短,我用 Python。伯乐在线旗下账号「Python开发者」分享 Python 相关的技术文章、工具资源、精选课程、热点资讯等。
目录
相关文章推荐
51好读  ›  专栏  ›  Python开发者

python : 利用 asyncio 进行快速抓取

Python开发者  · 公众号  · Python  · 2017-01-04 20:47

正文

请到「今天看啥」查看全文


loop . run_until_complete ( print_page ( 'http://example.com' ))


一个有用的方法是asyncio.wait,通过它可以获取一个协同程序的列表,同时返回一个将它们全包括在内的单独的协同程序,所以我们可以这样写:


loop . run_until_complete ( asyncio . wait ([ print_page ( 'http://example.com/foo' ),

print_page ( 'http://example.com/bar' )]))


另一个是asyncio.as_completed,通过它可以获取一个协同程序的列表,同时返回一个按完成顺序生成协同程序的迭代器,因此当你用它迭代时,会尽快得到每个可用的结果。


数据抓取


现在我们知道了如何做异步HTTP请求,因此我们可以来写一个数据抓取器了。我们仅仅还需要一些工具来读取html页面,我使用了beautifulsoup来做这个事情,其余的像 pyquery或lxml也可以实现。


在这个例子中,我们会写一个小数据抓取器来从海盗湾抓取一些linux distributions的torrent 链路(海盗湾(英语:The Pirate Bay,缩写:TPB)是一个专门存储、分类及搜索Bittorrent种子文件的网站,并自称“世界最大的BitTorrent tracker(BT种子服务器)”,提供的BT种子除了有自由版权的收集外,也有不少被著作人声称拥有版权的音频、视频、应用软件与电子游戏等,为网络分享与下载的重要网站之一–译者注来自维基百科)


首先,需要一个辅助协同程序来获取请求:


@ asyncio . coroutine

def get ( * args , ** kwargs ) :

response = yield from aiohttp . request ( 'GET' , * args , ** kwargs )

return ( yield from response .







请到「今天看啥」查看全文