正文
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
.