Javascript Python Web抓取数据';它不是硬编码到HTML中的

Javascript Python Web抓取数据';它不是硬编码到HTML中的,javascript,python,html,Javascript,Python,Html,我正试图从insight.com获取定价数据。这是一个例子 从那一页,我想拉一下价格表。我以前在requests和BeautifulSoup中也这样做过,但是在那些情况下,价格会直接在HTML中,所以很容易取出。然而,Insight似乎是从“webProduct.prices[0].price”中获取此价格数据的,我假设它是一个javascript对象 下面是确切的HTML元素: <p class="ips-price-contract">List price</p>&

我正试图从insight.com获取定价数据。这是一个例子

从那一页,我想拉一下价格表。我以前在requests和BeautifulSoup中也这样做过,但是在那些情况下,价格会直接在HTML中,所以很容易取出。然而,Insight似乎是从“webProduct.prices[0].price”中获取此价格数据的,我假设它是一个javascript对象

下面是确切的HTML元素:

 <p class="ips-price-contract">List price</p><p class="prod-price">{{- webProduct.prices[0].currency }}&nbsp;{{= numeral(webProduct.prices[0].price).format(InsightUtil.GetCurrencyFormat()) }}</p>

标价

{{-webProduct.prices[0].currency}{{=numeric(webProduct.prices[0].price).格式(InsightUtil.GetCurrencyFormat())}

有没有办法用Python获取这些定价数据

编辑:下面的解决方案

多亏了下面哈伦·埃尔居尔的解决方案,我才得以实现这一目标。首先,我使用应用程序“邮递员”让帖子在那里运行。以下是完成的帖子的外观:


为了将json负载转换为python,我首先将其格式化为python dict(例如,将'null'替换为'None','true'和'false'替换为'true'和'false',等等),然后使用data=json发出请求。转储(data)

处理启用javascript的页面的最佳方法是与浏览器一起使用(所有现实世界的浏览器,如chrome、firefox等,甚至无头浏览器,如phantomjs,都有驱动程序)。此堆栈将获取您的页面并运行与该页面相关的所有javascript。然后您可以获取处理过的源代码并从中提取数据(从现在开始
{-webProduct.prices[0].currency}{{=numeric)(webProduct.prices[0].price.format(InsightUtil.GetCurrencyFormat())}
将被实际价格替换)


或者,您可以在实际浏览器中检查页面,监视其网络活动,找出页面为获取必要数据而发出的api请求,并使用请求库复制这些请求。

此网站对价格提出额外请求。您应该模拟相同的请求。您可以在chrome network xhr选项卡下找到它。



不要使用selenium解决方案,因为它需要花费时间来废弃大量数据。

price由javascript提供。但应该有一种方法。我试图找出@HarunErgül提到的,如果这确实是一个一次性脚本,那么直接向api发出请求就足够了,而且速度要快得多。不过,selenium是一个非常有用的工具er instrumentation framework建立在w3c webdriver协议之上。如果您对该领域感兴趣,我肯定会建议您学习如何使用它。我也在使用selenium。它是一个非常有用的工具。但是对于大型数据集,它非常慢。太棒了,这正是我想要的。谢谢!我实际上只是在看一个在回顾Giannis的上述回答之后。我不确定的是如何通过请求包复制此请求。我看到它正在访问url“”,但我不确定我还应该添加什么。您是否有一个示例或引用,我可以在其中阅读更多内容以了解如何复制此请求?您可以看到图片中有Headers选项卡。在这一部分中,您将看到“request Headers”。您应该在请求中包含此标头信息。一些“特定于访问”的标头信息(如Set Cookie)和“ADRUM”标头(其中一些内容看起来像客户id)如何实际上,这一部分在大多数情况下都会变得很困难。你必须尝试。我认为请求api会处理cookies。ADRUM在响应标题下。也许你不必在get请求中使用ADRUM数据。我注意到,如果标题中有“Content Length”:“614”,我会得到503响应。如果我去掉它,它会工作,但这就是问题所在已转换:{“更改”:[],“引用者”:“已修改/content/insight web/en_US/buy/product”}
driver.get(page)
page_source = driver.source