【问题标题】:Is there a way to get information about elements from the inspect menu in a website?有没有办法从网站的检查菜单中获取有关元素的信息?
【发布时间】:2019-05-11 13:43:56
【问题描述】:

我试图从这个网站获取世界人口:https://www.worldometers.info/world-population/ 但我只能得到html代码,而不是实际数字的数据。

我已经尝试找到我尝试从中获取数据的对象的子对象。我也尝试列出整个对象,但似乎没有任何效果。

'''只是导入东西'''

import urllib.request

import requests

from bs4 import BeautifulSoup

'''从网站获取html到文本'''

r = requests.get('https://www.worldometers.info/world-population/')

soup = BeautifulSoup(r.text,'html.parser')

'''这里它只找到下面列出的一个对象'''

current_population = soup.find('div',{'class':'maincounter-number'}).find_all('span', recursive=False)

print(current_population)

这是存储信息的对象:

(span class="rts-counter" rel="current_population">retrieving data... </span>

在“检查模式”中你可以看到:

(span class="rts-counter" rel="current_population">(span class="rts-nr-sign"></span>(span class="rts-nr-int rts-nr-10e9">7</span>(span class="rts-nr-thsep">,</span>(span class="rts-nr-int rts-nr-10e6">703</span>(span class="rts-nr-thsep">,</span>(span class="rts-nr-int rts-nr-10e3">227</span><span class="rts-nr-thsep">,</span>(span class="rts-nr-int rts-nr-10e0">630</span></span>

我总是只得到第一个,但想从'inspect-mode'中得到第二个。

Here 是检查模式的图片。

【问题讨论】:

  • 本网站所依赖的 API 已获得许可。一定会有公共 api 有这些数据。

标签: python html web-scraping


【解决方案1】:

您将需要一种让 javascript 运行的方法,例如 selenium,因为此数字是通过此脚本中生成的计数器设置的:https://www.realtimestatistics.net/rts/RTSp.js

from selenium import webdriver

d = webdriver.Chrome()
d.get('https://www.worldometers.info/world-population/')
print(d.find_element_by_css_selector('[rel="current_population"]').text)

您可以尝试编写您自己的 javascript 脚本版本,但我不建议这样做。

我不需要 selenium 脚本的 explicit wait 条件,但可以添加。

【讨论】:

  • 谢谢!这种方法不是很快,但我认为没有什么可以改进的,对吧?无论如何谢谢你的回答:)
  • 不客气。除非有更快的专用 API。
【解决方案2】:

您正在抓取的网站是一个 JavaScript 网络应用程序。您在检查模式下看到的元素内容是在填充该元素的页面下载后运行一些 JavaScript 代码的结果。在 JavaScript 运行之前,该元素仅包含文本“正在检索数据...”,这就是您在 Python 代码中看到的内容。 Python requests 库和 BeautifulSoup 都不会在下载的 HTML 中运行 JavaScript —— 它们只下载和解析 HTML,这就是为什么您的代码只能看到初始文本。

你有两个选择:

  1. 检查 JavaScript 代码或网站调用,找出页面调用的 HTTP URL 以检索它放入该元素的值。让您的 Python 代码改为获取该 URL,并从该 URL 的响应中解析值。
  2. 使用完整的浏览器引擎。这个 StackOverflow 答案提供了一个解决方案:Web-scraping JavaScript page with Python

【讨论】:

    【解决方案3】:

    Javascript 在 DOM 上呈现,因此 Beautiful Soup 无法按您的意愿工作。

    您必须制作一些让 javascript 运行的东西(例如:浏览器),这样您就可以使用 QT4 或类似的东西制作自己的浏览器。 Sentdex 在这里有一个很好的教程:

    https://www.youtube.com/watch?v=FSH77vnOGqU

    否则,您可以使用 Selenium:

    from selenium import webdriver
    import time
    
    drive = webdriver.Firefox()
    drive.get('https://www.worldometers.info/world-population/')
    time.sleep(5)
    html = driver.page_source
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-15
      • 2017-11-01
      • 2014-09-13
      • 2021-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多