【问题标题】:Export data from dynamic website with BS4 + Python:使用 BS4 + Python 从动态网站导出数据:
【发布时间】:2020-09-04 05:34:47
【问题描述】:

我想将以下网站的所有商店数据导出到 excel 文件中: https://www.ybpn.de/ihre-parfuemerien

问题:地图是“动态的”,因此当您输入邮政编码时会加载所需的数据。

需要的数据存储在 div-class "storefinder__list-item" 中,在 data-"storefinder-reference" div-class 中具有唯一引用,例如:data-storefinder-reference="132"

我试过了:

soup.find("div", {"data-storefinder-reference": "132"})

但是输出是:NONE

我认为这个问题是由于页面是动态的,因此当您输入邮政编码时会加载所需的数据。因此,当我搜索参考 ID“132”时,它的“那里”,但未加载到网站上,bs4 无法找到此 ID。

有改进代码的想法吗?

【问题讨论】:

  • 我认为你可以只使用请求。你能分享一个你希望得到的邮政编码和数据的例子吗?
  • 邮政编码:10365 然后我得到 5 个“storefinder__list-item storefinder__list-item--active” div-classes,在每个 div-class 中都是我需要的数据的子类,例如:storefinder- item__title 或 storefinder-item__adress。但问题是该页面仅加载 5 个结果,超过 1000 个 - 我需要完整列表:/
  • 您的任务称为web-scraping。因此,我强烈推荐使用 Scrapy 来实现这一点。基本上,Scrapy 的工作方式类似于 BS4 + Python 请求,但更健壮和成熟。如果您需要处理动态元素,Scrapy-Splash 也会为您提供帮助。检查这个Scrapy-Splash Introduction
  • 谢谢!是的,我实际上在使用 bs4 + selenium 时遇到了一些问题。尝试你的方式可能会更好。

标签: python beautifulsoup


【解决方案1】:

为此,您可能需要查看 selenium 和/或“firefox-headless”等工具。

特别是 selenium 允许您使用 Python “远程控制”网页

这里有教程:https://realpython.com/modern-web-automation-with-python-and-selenium/

【讨论】:

  • 所以我必须用 selenium 来“模拟”用户“输入邮政编码”的操作——也许是基于一个包含德国所有邮政编码的文本文件来自动执行此操作?
  • 是的。那就是这样做的方法。
  • 但是当我使用 selenium 时,如果网站/ddos 保护注意到它不是“人类”,可能会阻止该操作,或者?使用“睡眠”命令?我认为我们得到了整个德国的很多邮政编码,因此脚本必须执行许多操作才能获得完整列表。
  • 这是可能的,但不太可能。为了安全起见,您可以在每次通话中添加随机延迟的睡眠。但更重要的是“用户代理”请求标头。当您在 chrome/firefox 中执行请求时,您将在请求标头中看到该值。只需复制/粘贴该值并将其作为请求标头添加到您的应用程序中。这将使它“看起来”像人。
  • 听起来不错。我会用 selenium 和 sleep/user-agent 来试试。谢谢!
【解决方案2】:

如果问题是等待页面加载,您可以使用 selenium 来解决。

`result = driver.execute_script('var text = document.title ; return text')`

如果页面上有jquery,肯定有

result=driver.execute_script("""
       $(document).ready({
          var $text=$('yourselector').text()
           return $text
           })
          """)

注意:对于 selenium,您可以查看 here

【讨论】:

  • 是的,我认为我必须尝试使用​​ selenium。我不知道他们是否使用 jquery。 ://
【解决方案3】:

您可以只用 chrome 或 ff 打开页面,打开 Web 调试控制台并查询元素。如果您看到它们,它们就在 dom 中,因此是可查询的。但这将在 javascript 中完成。如果你幸运的话,他们会使用 jquery。

【讨论】:

  • 是的,我做到了。但是只有一些“项目”,而不是整个列表。在“storefinder__info”-class 中有一个带有信息的字符串:“12 results”。我认为他们使用 javascript,如何确定他们是否使用 jquery?
  • 我猜有 ajax 请求对列表项进行分页。您还可以在开发工具的请求选项卡中查看这些内容。也许他们发送一个定义数字或结果的参数。无论如何,您也可以手动请求所有这些。
猜你喜欢
  • 1970-01-01
  • 2011-10-23
  • 2019-02-23
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 2019-01-18
  • 2015-11-21
  • 1970-01-01
相关资源
最近更新 更多