【问题标题】:Python requests_html render runs forever on certain URLsPython requests_html 渲染在某些 URL 上永远运行
【发布时间】:2020-06-14 21:05:01
【问题描述】:

我正在尝试编写一个简单的脚本,给定任意 URL 将返回该网站的标题标签。因为我要解析的许多 URL 都需要启用 JavaScript,所以我需要使用 requests_html 的渲染函数之类的东西来执行此操作。但是,我遇到了一个库问题,下面的示例 URL 永远不会终止。我已经尝试了渲染调用的超时参数,但它不起作用。谁能帮我弄清楚如何让它正确超时或其他一些解决方法以确保它不会卡住?

这是我当前没有终止的代码(它卡在渲染调用上):

from requests_html import HTMLSession

session = HTMLSession()
r = session.get('http://shan-shui-inf.lingdong.works/')
# render with JS
r.html.render(sleep = 1, keep_page=True)
# Also does not work: r.html.render(sleep = 1, keep_page=True, timeout = 3)


title = r.html.find('title', first=True).full_text

我已经尝试过类似的解决方案:Timeout on a function callPython timeout decorator 仍然没有足够奇怪地超时。

注意:我在 Windows 10 上使用 Python 3.7.4 64 位。

【问题讨论】:

  • 我遇到了类似的问题,对我来说,它会渲染某些 URL 30 次,然后挂起但从不超时。
  • 你找到解决办法了吗?
  • 这发生在我身上以及不同的网址。我认为问题出在 _async_render 方法上,特别是在捕获到 TimeoutError 时。在这种情况下,尝试执行永远不会返回的await page.close()。可能与此issue 有关

标签: python-3.x web-scraping python-requests-html


【解决方案1】:

我建议把 r.session.close() 放在最后。这对我有用。

【讨论】:

  • 能否显示两个结果,一个添加了r.session.close() ,另一个没有?
  • 这是after 我在循环结束时关闭会话。和before,它只是在某个循环后挂起。
  • 我无法访问您的链接。它要求我“请求访问”。是否可以将其发布在对所有人开放的地方?
  • 我认为它现在可以工作了。我已更改隐私以通过链接查看所有人。我只是将 r.session.close 放在循环的末尾,经过一些迭代后它停止挂起。
猜你喜欢
  • 1970-01-01
  • 2017-12-02
  • 1970-01-01
  • 2017-09-30
  • 2014-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多