gpt4 book ai didi

python - 使用 pyppeteer 与 asyncio 关联来抓取内容

转载 作者:行者123 更新时间:2023-12-01 08:35:01 24 4
gpt4 key购买 nike

我用 python 结合 pyppeteerasyncio 编写了一个脚本,从其登陆页面抓取不同帖子的链接,并最终获得每个帖子的标题通过跟踪通向其内页的 url 来发布。我这里解析的内容不是动态的。不过,我利用 pyppeteerasyncio 来了解它异步执行的效率。

以下脚本在某些时候运行良好,但随后遇到错误:

File "C:\Users\asyncio\tasks.py", line 526, in ensure_future
raise TypeError('An asyncio.Future, a coroutine or an awaitable is '
TypeError: An asyncio.Future, a coroutine or an awaitable is required

这是我到目前为止所写的内容:

import asyncio
from pyppeteer import launch

link = "https://stackoverflow.com/questions/tagged/web-scraping"

async def fetch(page,url):
await page.goto(url)
linkstorage = []
elements = await page.querySelectorAll('.summary .question-hyperlink')
for element in elements:
linkstorage.append(await page.evaluate('(element) => element.href', element))
tasks = [await browse_all_links(link, page) for link in linkstorage]
results = await asyncio.gather(*tasks)
return results

async def browse_all_links(link, page):
await page.goto(link)
title = await page.querySelectorEval('.question-hyperlink','(e => e.innerText)')
print(title)

async def main(url):
browser = await launch(headless=True,autoClose=False)
page = await browser.newPage()
await fetch(page,url)

if __name__ == '__main__':
loop = asyncio.get_event_loop()
future = asyncio.ensure_future(main(link))
loop.run_until_complete(future)
loop.close()

我的问题:如何消除该错误并异步执行操作?

最佳答案

问题出在以下几行:

tasks = [await browse_all_links(link, page) for link in linkstorage]
results = await asyncio.gather(*tasks)

任务的目的是成为可等待对象的列表,例如协程对象或 future。该列表将传递给gather,以便可等待项可以并行运行,直到它们全部完成。然而,列表推导式包含一个 await,这意味着它:

  • 串行而不是并行执行每个browser_all_links以完成;
  • browse_all_links 调用的返回值放入列表中。

由于 browse_all_links 不返回值,因此您将 None 对象的列表传递给 asyncio.gather,它提示说没有获得可等待的对象。

要解决此问题,只需从列表理解中删除 await 即可。

关于python - 使用 pyppeteer 与 asyncio 关联来抓取内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53769321/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com