【问题标题】:How can I open hidden information on website如何打开网站上的隐藏信息
【发布时间】:2019-11-16 12:15:30
【问题描述】:

我试图解析网站,但我无法获得有关页面的全部信息。更准确地说,我必须拥有<fgis-root></fgis-root> 之间的所有信息,但没有任何信息。我该如何解决?

from bs4 import BeautifulSoup
import urllib3

http = urllib3.PoolManager()

url = 'https://pub.fsa.gov.ru/ral/view/8/applicant'
response = http.request('GET', url)
soup = BeautifulSoup(response.data)
print(soup)

【问题讨论】:

  • 如果页面使用 JavaScript 从服务器获取数据并添加到页面,那么您无法使用 BeautifulSoup 找到它,因为它无法运行 JavaScript。您可以尝试在 Chrome/Firefox 中使用 DevTool 来查找 JavaScript 用于读取数据的 URL,并将此 URL 与 urllib 一起使用。
  • 尝试在python中使用selenium模块。您可以使用不同的路径从您要抓取的页面中获取信息。如果selector 不起作用,请尝试xpath 等等。

标签: javascript python parsing web-scraping


【解决方案1】:

由于您要查找的内容是从 javascript 生成的,因此您需要模拟浏览器。你可以使用selenium 来做到这一点:

from selenium import webdriver

with webdriver.Firefox() as driver: # e.g. using Firefox webdriver
    driver.get('your_url_here')
    i = driver.find_elements_by_tag_name("fgis-root")

同时检查here selenium 提供的所有可用方法来定位页面中的元素。

【讨论】:

    【解决方案2】:

    您可以模仿 GET 请求。此信息来自加载页面时在开发工具、F12、“网络”选项卡中观察到的网络流量。授权和会话 ID 可能是有时间限制的。您可以使用 Session 来处理 cookie 部分,方法是在同一会话中首先向以前的 url 发出请求。

    import requests
    import urllib3; urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
    
    
    headers = {
        'Pragma': 'no-cache',
        'DNT': '1',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'en-US,en;q=0.9',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
        'lkId': '',
        'Accept': 'application/json, text/plain, */*',
        'Cache-Control': 'no-cache',
        'Authorization': 'Bearer eyJhbGciOiJIUzUxMiJ9.eyJpc3MiOiI5ZDhlNWJhNy02ZDg3LTRiMWEtYjZjNi0xOWZjMDJlM2QxZWYiLCJzdWIiOiJhbm9ueW1vdXMiLCJleHAiOjE1NjMyMzUwNjZ9.OnUcjrEXUsrmFyDBpgvhzznHMFicEknSDkjCyxaugO5z992H-McRRD9bfwNl7xMI3dm2HtdAPuTu3nnFzgCLuQ',
        'Connection': 'keep-alive',
        'Referer': 'https://pub.fsa.gov.ru/ral/view/8/applicant',
        'orgId': '',
    }
    
    with requests.Session() as s:
        r = s.get('https://pub.fsa.gov.ru/ral/view/8/applicant', verify = False)
        r = s.get('https://pub.fsa.gov.ru/api/v1/ral/common/companies/8', headers=headers).json()
        print(r)
    

    【讨论】:

      【解决方案3】:

      您遇到的问题是网页抓取中的常见问题。

      https://pub.fsa.gov.ru/ral/view/8/applicant的网页,加载https://pub.fsa.gov.ru/main.73d6a501bd7bda31d5ec.js的javascript文件,这个文件负责动态内容加载。

      问题的根源在于 urllib3、requests 或 python 中的任何其他 http 客户端不会在该网页中呈现 javascript。因此,您只有服务器提供给您的初始响应,在许多情况下不包含您需要的信息。

      一个解决方案是使用selenium。它将允许您以编程方式与诸如 chromefirefox 之类的浏览器进行交互,这些浏览器实际上会呈现结果。

      您没有具体说明您试图从该网站上刮取的信息,我的建议是使用显式等待,直到您希望找到的元素出现在 DOM 中。您可以在 selenium here 中找到有关等待的更多信息。

      示例用法

      您应该修改此代码以抓取您希望抓取的数据。

      # Imports
      from selenium import webdriver
      from selenium.webdriver.chrome.options import Options
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC
      from selenium.common.exceptions import TimeoutException
      
      # Constants
      URL = 'https://pub.fsa.gov.ru/ral/view/8/applicant'
      ELEMENT_XPATH = '/html/body/fgis-root/div/fgis-ral/fgis-card-view/div/div/fgis-view-applicant/fgis-card-block/div/div[2]'
      
      def main():
          options = Options()
          options.headless = True
          driver = webdriver.Chrome(options=options)
          driver.get(URL)
          try:
              element = WebDriverWait(driver, 10).until(
                  EC.presence_of_element_located((By.XPATH, ELEMENT_XPATH))
              )
              print(element.text) 
          except TimeoutException:
              print("Could not find the desired element")
          finally:
              driver.quit()
      
      if __name__ == '__main__':
          main()
      

      【讨论】:

        【解决方案4】:

        信息不是“隐藏的”,而是使用 JavaScript 动态生成的。这可以通过将“查看源代码”与浏览器开发工具的元素检查器中的 DOM 进行比较来确认。

        因此必须在 DOM 上执行 JavaScript 才能获得所需的信息。这可以通过使用无头浏览器来完成。无头浏览器将像真正的浏览器一样执行 JavaScript,并且可以通过编程方式控制它来检索所需的数据。

        有几种不同的无头浏览器,以及为更多语言编写的驱动程序。我更喜欢将无头 Chrome 与 Nick.js javascript 驱动程序一起使用。您可以使用他们主页底部的示例脚本并进行一些修改。

        如果您必须使用 Python,这里有一个很好的入门教程:Driving Headless Chrome with Python

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-15
          • 1970-01-01
          • 1970-01-01
          • 2011-09-22
          • 1970-01-01
          • 1970-01-01
          • 2013-10-11
          • 2016-04-20
          相关资源
          最近更新 更多