返回信息流搜半天找不到问题
from urllib import request
from lxml import etree
import asyncio
@asyncio.coroutine
def crawl(url):
req = request.Request(url)
req.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.71 Safari/537.36')
with request.urlopen(req) as f:
html=f.read().decode('utf-8','ignore')
page = etree.HTML(html)
title = page.xpath('//*[@id="productTitle"]/text()')
yield title
@asyncio.coroutine
def get(url):
title=yield from crawl(url)
print(title)
loop = asyncio.get_event_loop()
tasks = [get(host) for host in ['http://www.amazon.com/dp/B00006HAXW','http://www.amazon.com/dp/B00004CQT3']
loop.run_until_complete(asyncio.wait(tasks))
loop.close()
这是结果
原谅我的愚蠢,urllib是阻塞的,换成aiohttp就好了,给大家添麻烦啦
这是一条镜像帖。来源:北邮人论坛 / python / #9159同步于 2015/10/22
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖
【已解决】 异步io抓标题告诉我bad yield,怎么解决啊
w153409018
2015/10/22镜像同步14 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
如果crawl本身内部并不是并发执行的(看逻辑只是用一个循环串行地寻找各个title),就不需要用asyncio.coroutine修饰。
另外,要不要试试async和await语法呢?这东西语意和generator很不一样。
谢谢暖神,我去看看async(貌似是3.5新加入的...)。可是用按你说的移除还是同样的问题:task got bad yield。你知道是什么错误吗?
【 在 nuanyangyang 的大作中提到: 】
: 如果crawl本身内部并不是并发执行的(看逻辑只是用一个循环串行地寻找各个title),就不需要用asyncio.coroutine修饰。
: 另外,要不要试试async和await语法呢?这东西语意和generator很不一样。
【 在 w153409018 的大作中提到: 】
: 谢谢暖神,我去看看async(貌似是3.5新加入的...)。可是用按你说的移除还是同样的问题:task got bad yield。你知道是什么错误吗?
改成
for title in crawl(url):
print(title)
试试看
太感谢了,成功了,您能解释一下吗
【 在 nuanyangyang 的大作中提到: 】
: 改成
: [code=python]
: ...................
发自「贵邮」
不过好像不是异步的啊
【 在 nuanyangyang 的大作中提到: 】
: 改成
: [code=python]
: ...................
发自「贵邮」
【 在 w153409018 的大作中提到: 】
: 太感谢了,成功了,您能解释一下吗
: 发自「贵邮」
asyncio想提供的是类似“future”的功能:一个“有可能因为要将控制交给别的‘线程’而暂停,但将来早晚要返回一个值的函数”。事实上它确实也提供asyncio.Future这个类
但是python的generator提供的是“可以不断返回很多值的类似迭代器的东西”。
你想并发非阻塞地抓网页(前者),同时对于每个网页,又想迭代式地返回多个结果(后者),所以两者都要用啦。
只不过Python的asyncio是用generator做基础来实现的(尽管我认为Ruby可以做得更好),会发生混淆,大概就是这样了。
【 在 w153409018 的大作中提到: 】
: 不过好像不是异步的啊
: 发自「贵邮」
Python的generator本来就不是异步的,它的控制流程是完全确定的。和asyncio想达到的目的不同。当然应用场景也不同。
那要用异步io抓网页应该怎么实现呢,我去学一下
【 在 nuanyangyang 的大作中提到: 】
: asyncio想提供的是类似“future”的功能:一个“有可能因为要将控制交给别的‘线程’而暂停,但将来早晚要返回一个值的函数”。事实上它确实也提供asyncio.Future这个类
:
: ...................
发自「贵邮」