如何抓取实时计算的值

时间:2018-11-12 23:37:08

标签: python web-scraping python-requests

我正在尝试从在线计算器中获取一个值,这里我想要的值5.1已被计算:CVSS 3 Calculator。事情是当我写以下内容

page = requests.get('https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator?vector=AV:A/AC:H/PR:L/UI:R/S:C/C:L/I:L/A:L')
print(page.content)

我看到以下代码段:

<dd id="cvss-overall-score-cell">{{vm.overallScore}}</dd>\r\n

我相信这意味着仍然需要进行一些计算。但是,如果我打开chrome的开发工具,则会发现以下内容:

enter image description here

其中一些文字似乎没有翻译,但是我对这些东西还很陌生,因此我不确定是否正确使用了请求(我也使用BeautifulSoup,但没有看到它的用法这里)。我猜想页面需要一秒钟的时间来加载触发计算的字符串。就像现在一样,我认为我正在抓取未填充的数据,该页面需要一秒钟才能加载。那么我可以暂停请求或类似的操作,还是有更好的方法呢?

2 个答案:

答案 0 :(得分:3)

您看到的是一个模板表达式,稍后将被Javascript替换。看起来像AngularJS模板代码(尽管语法在各种框架中非常普遍)。

由于您不是在执行Javascript,而是仅下载HTML,因此不会显示该值。

实际值可能是通过其他方式获得的,例如HTTPRequest。打开浏览器开发工具,然后查看“网络”标签。另请查看源代码。您寻找的值应该沿着页面中的Javascript,或者通过单独的HTTP请求从服务器动态获取。

答案 1 :(得分:2)

You can use selenium and a CSS selector to grab the same value from the chart.

Each value on the right can be grabbed from the charts on the left. Example here showing Overall CVSS Score:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options  

chrome_options = Options()  
chrome_options.add_argument("--headless")  
url ="https://nvd.nist.gov/vuln-metrics/cvss/v3-calculator?vector=AV:A/AC:H/PR:L/UI:R/S:C/C:L/I:L/A:L"

d = webdriver.Chrome(chrome_options=chrome_options)
d.get(url)
print(d.find_element_by_css_selector("#cvss-overall-score-chart > div.jqplot-point-label.jqplot-series-0.jqplot-point-0").text)
d.quit()