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

时间:2019-07-05 23:50:14

标签: javascript python parsing web-scraping

我试图解析网站,但是我无法获得有关页面的全部信息。更准确地说,我必须拥有I have tried using jquery slideToggle() but it display the metadata outside the table $("displayRowDetails").click(function(){ $("rowMetaData").slideToggle(); }); <html> <body onload="tablemetaData()"> <div id="divTable"> </div> <div id="rowMetaData"> City Description; Population: Reference: </div> </body> </html> <fgis-root>之间的所有信息,但是没有任何信息。我该如何解决?

</fgis-root>

4 个答案:

答案 0 :(得分:2)

由于您要查找的内容是由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在页面中定位元素。

答案 1 :(得分:1)

您可以模仿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)

答案 2 :(得分:1)

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

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

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

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

对于要从该网站上抓取的信息,您并不确定,我的建议是使用明确的等待,直到您要查找的元素出现在DOM中。您可以在硒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()

答案 3 :(得分:0)

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

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

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

如果必须使用Python,下面是一个很好的入门指南:Driving Headless Chrome with Python