【问题标题】:python javascript scrape automaticallypython javascript自动抓取
【发布时间】:2018-02-23 21:25:52
【问题描述】:

这里是 Python 新手。

我正在尝试从Dutch Transparency Benchmark 网站上为许多不同的公司抓取公司信息,但我不知道如何让它发挥作用。我试过了

pd.read_html(https://www.transparantiebenchmark.nl/en/scores-0#/survey/4/company/793)

requests.get("https://www.transparantiebenchmark.nl/en/scores-0#/survey/4/company/793")

然后从那里开始工作。但是,数据似乎是动态生成/查询的,因此实际上并未包含在这些方法检索的 html 源代码中。

如果我转到浏览器的开发人员工具并复制“最终”html,如“元素”选项卡中所示,则整个信息都在其中。但是我想为几家公司重复这个过程,有没有办法自动化它?

或者,如果没有直接的方法从 html 中获取信息,则可能还有第二种可能性。该站点允许将信息下载为每个公司的 Excel 文件。是否可以以某种方式自动“单击”下载按钮并将文件保存在某处?然后我也许可以遍历所有我需要的公司。

如果这个问题措辞不好,请原谅,提前非常感谢您

图森塔克!

编辑:我也尝试过使用 BeautifulSoup,正如@pmkroeker 建议的那样。但我并不是很想如何让它工作,以便它首先运行所有的 javascript,以便站点实际包含数据。

【问题讨论】:

  • 你看过BeautifulSoup吗?
  • 您可以尝试使用selenium-python.readthedocs.io。该产品可以在浏览器中加载页面,然后找到按钮并按下它们。
  • 非常感谢您提供的链接,@BillBell,我不了解 Selenium。似乎这比我希望的要复杂一些,但是……也许这会加快学习过程:D
  • 不客气。如果您遇到困难,这里有很多人可以提供帮助。

标签: javascript python html scrape


【解决方案1】:

我认为您要么想要使用库来呈现页面。 This 答案似乎适用于 python。为了完整起见,我还将复制该答案中的代码。


您可以从命令行 pip install selenium,然后运行类似:

from selenium import webdriver
from urllib2 import urlopen

url = 'http://www.google.com'
file_name = 'C:/Users/Desktop/test.txt'

conn = urlopen(url)
data = conn.read()
conn.close()

file = open(file_name,'wt')
file.write(data)
file.close()

browser = webdriver.Firefox()
browser.get('file:///'+file_name)
html = browser.page_source
browser.quit()

我认为您可能会跳过文件写入并将其传递给 browser.get 调用,但我会留给您自己找出答案。

您可以做的另一件事是在浏览器开发工具中查找 ajax 调用。即当使用 chrome 时,三个点 -> 更多工具 -> 开发人员工具或按 F12 之类的东西。然后查看网络选项卡。会有各种各样的要求。您将需要单击一个,单击Preview 选项卡,然后遍历每个选项卡,直到找到看起来像 json 数据的响应。您正在有效地寻找他们用来获取数据以生成事物的 API 调用。找到后,单击Headers 选项卡,您将看到Request URL

即这个https://sa-tb.nl/api/widget/chart/survey/4/sector/38 有很多数据

这里的问题是它可能是可重复的,也可能是不可重复的(API 可能会改变,id 可能会改变)。仅 HTML 抓取可能会遇到类似的问题,因为 HTML 可以很容易地更改。

【讨论】:

  • 非常感谢,API 的东西似乎特别有趣。我需要像 sa-tb.nl/api/widget/overview/survey/4/company/793/category/… 这样的东西,但是虽然在“响应”下的开发人员选项卡中它似乎返回了一些东西,但当我手动输入该 URL 时会发生错误。
  • @I_love_Norway 看起来他们正在传递一个标头来告诉浏览器只接受来自其域的请求。这是标题Access-Control-Allow-Origin:https://www.transparantiebenchmark.nl 如果您使用 curl、wget 或其他任何东西来获取您应该找到的数据。即curl -XGET 'https://sa-tb.nl/api/widget/overview/survey/4/company/793?sort=&group=&filter='
  • 这是一个link 解释Access-Control-Allow-Origin 标头。
  • 感谢您提供更多见解。昨天早上,我使用 python 的 requests 模块让它工作,并实际粘贴了整个标题信息。但是很高兴知道哪个参数特别重要,并且感谢您提供的链接,我现在可以真正尝试了解这些事情是如何工作的。
  • @I_love_Norway 欢迎您!当直接在浏览器中点击 URL 时,标题(或类似的东西)似乎开始发挥作用,这让我感到惊讶。 Curl 至少可以在没有任何额外标题细节的情况下为我工作,所以它看起来很可能是浏览器正在处理的东西。如果解决了,请随时接受答案。我仍然会留意你的任何 cmet。
猜你喜欢
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-18
相关资源
最近更新 更多