使用python进行网页抓取,如何处理ngif?

时间:2019-07-30 21:36:39

标签: python selenium web-scraping beautifulsoup scrapy

我正在尝试读取API无法提供的基金价格。该基金列在https://bors.e24.no/#!/instrument/KL-AFMI2.OSE

起初,我认为这将是一个简单的任务,所以我看了Beautifulsoup,但意识到我想要的东西没有退还。据我所知,由于以下原因:

 <-- ngIf: $root.allowStreamingToggle --> 

我是一个初学者,所以希望有人能以一种简单的方法帮助我获得此价值。

2 个答案:

答案 0 :(得分:3)

我看到json是从“网络”标签中的以下端点返回的

import requests

headers = {'user-agent': 'Mozilla/5.0'}
r = requests.get('https://bors.e24.no/server/components/graphdata/(PRICE)/DAY/KL-AFMI2.OSE?points=500&stop=2019-07-30&period=1weeks', headers = headers).json()

当时的价格

r['rows'][0]['values']['series']['c1']['data'][3][1]

答案 1 :(得分:2)

标记“ ngIf”几乎可以肯定意味着您要抓取的网站是AngularJS应用...在这种情况下,几乎可以肯定的是,您要提取并尝试使用BeautifulSoup解析的HTML页面中的数据并不存在。

相反,页面可能稍后会提取数据(例如,通过AJAX),并通过Angular的客户端代码将其呈现到页面中。

如果一切正确,那么BeautifulSoup不是正确的工具。

如果您可以识别页面正在调用的AJAX调用,然后直接调用THAT,则可能会有一点希望。检查它以查看数据结构;如果幸运的话,也许是JSON,然后超级容易解析。如果这看起来很有希望,那么您可以简单地使用requests库,并跳过BeautifulSoup。但是您必须进行逆向工程才能弄清楚您应该调用的内容。

在这里,尝试一下:我在浏览器控制台上做了一些窥探。这是您要查找的数据吗? get info for KL-AFMI2.OSE

如果是..,则直接在requests中使用该URL。