BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / python / #9159同步于 2015/10/22
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Python机器人发帖

【已解决】 异步io抓标题告诉我bad yield,怎么解决啊

w153409018
2015/10/22镜像同步14 回复
搜半天找不到问题 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就好了,给大家添麻烦啦
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
w153409018机器人#1 · 2015/10/22
顶一下,这种问题真的不会解决啊
nuanyangyang机器人#2 · 2015/10/23
如果crawl本身内部并不是并发执行的(看逻辑只是用一个循环串行地寻找各个title),就不需要用asyncio.coroutine修饰。 另外,要不要试试async和await语法呢?这东西语意和generator很不一样。
w153409018机器人#3 · 2015/10/23
谢谢暖神,我去看看async(貌似是3.5新加入的...)。可是用按你说的移除还是同样的问题:task got bad yield。你知道是什么错误吗? 【 在 nuanyangyang 的大作中提到: 】 : 如果crawl本身内部并不是并发执行的(看逻辑只是用一个循环串行地寻找各个title),就不需要用asyncio.coroutine修饰。 : 另外,要不要试试async和await语法呢?这东西语意和generator很不一样。
nuanyangyang机器人#4 · 2015/10/23
【 在 w153409018 的大作中提到: 】 : 谢谢暖神,我去看看async(貌似是3.5新加入的...)。可是用按你说的移除还是同样的问题:task got bad yield。你知道是什么错误吗? 改成 for title in crawl(url): print(title) 试试看
w153409018机器人#5 · 2015/10/23
太感谢了,成功了,您能解释一下吗 【 在 nuanyangyang 的大作中提到: 】 : 改成 : [code=python] : ................... 发自「贵邮」
w153409018机器人#6 · 2015/10/23
不过好像不是异步的啊 【 在 nuanyangyang 的大作中提到: 】 : 改成 : [code=python] : ................... 发自「贵邮」
nuanyangyang机器人#7 · 2015/10/23
【 在 w153409018 的大作中提到: 】 : 太感谢了,成功了,您能解释一下吗 : 发自「贵邮」 asyncio想提供的是类似“future”的功能:一个“有可能因为要将控制交给别的‘线程’而暂停,但将来早晚要返回一个值的函数”。事实上它确实也提供asyncio.Future这个类 但是python的generator提供的是“可以不断返回很多值的类似迭代器的东西”。 你想并发非阻塞地抓网页(前者),同时对于每个网页,又想迭代式地返回多个结果(后者),所以两者都要用啦。 只不过Python的asyncio是用generator做基础来实现的(尽管我认为Ruby可以做得更好),会发生混淆,大概就是这样了。
nuanyangyang机器人#8 · 2015/10/23
【 在 w153409018 的大作中提到: 】 : 不过好像不是异步的啊 : 发自「贵邮」 Python的generator本来就不是异步的,它的控制流程是完全确定的。和asyncio想达到的目的不同。当然应用场景也不同。
w153409018机器人#9 · 2015/10/23
那要用异步io抓网页应该怎么实现呢,我去学一下 【 在 nuanyangyang 的大作中提到: 】 : asyncio想提供的是类似“future”的功能:一个“有可能因为要将控制交给别的‘线程’而暂停,但将来早晚要返回一个值的函数”。事实上它确实也提供asyncio.Future这个类 : : ................... 发自「贵邮」