如何在网站上打开隐藏信息



我试图解析网站,但我无法获得有关页面的全部信息。更确切地说,我必须在<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生成的,因此您需要模仿浏览器。您可以使用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")

在此处还要在此处签出selenium提供的所有可用方法,以在页面中找到元素。

您可以模仿请求。此信息来自Dev Tools, f12 ,加载页面时网络选项卡中观察到的网络流量。授权和会话ID可以是时间限制。您可以在同一会话中首先向以前的URL提早请求来处理cookie零件。

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)

您遇到的问题是Web刮擦中的常见问题。

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

问题的根源是python中的Urllib3,请求或任何其他HTTP客户端不会在该网页中呈现JavaScript。因此,您只有服务器为您提供的初始响应,在许多情况下,该响应不包含所需的信息。

解决方案是使用硒。它将允许您与浏览器进行交互,例如 chrome firefox 以编程方式,这些浏览器实际上会呈现结果。

您对您试图从本网站上刮掉的信息并不具体,我的建议是使用明确的等待,直到您希望找到的元素存在于DOM中。您可以在此处找到有关Selenium等待的更多信息。

示例用法

您应该调整此代码以刮擦要刮擦的数据。

# 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()

信息不是"隐藏"的,而是用javaScript动态生成的。可以通过将"视图源"与浏览器开发工具的元素检查器中的DOM进行比较来确认。

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

有几个不同的无头浏览器,以及为更多语言编写的驱动程序。我更喜欢与nick.js javaScript驱动程序一起使用无头铬。您可以通过一些修改在其首页底部使用示例脚本。

如果您必须使用Python,这是一个开始的好教程:使用Python驾驶无头铬。

最新更新