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

Javascript 如何打开网站上的隐藏信息,javascript,python,parsing,web-scraping,Javascript,Python,Parsing,Web Scraping,我试图解析这个网站,但我无法获得关于这个页面的全部信息。更准确地说,我必须拥有和之间的所有信息,但没有任何信息。我怎样才能修好它 从bs4导入美化组 导入urllib3 http=urllib3.PoolManager() url='1〕https://pub.fsa.gov.ru/ral/view/8/applicant' response=http.request('GET',url) soup=BeautifulSoup(response.data) 印花(汤) 您可以模拟GET请求。此信

我试图解析这个网站,但我无法获得关于这个页面的全部信息。更准确地说,我必须拥有
之间的所有信息,但没有任何信息。我怎样才能修好它

从bs4导入美化组
导入urllib3
http=urllib3.PoolManager()
url='1〕https://pub.fsa.gov.ru/ral/view/8/applicant'
response=http.request('GET',url)
soup=BeautifulSoup(response.data)
印花(汤)

您可以模拟GET请求。此信息来自加载页面时在dev tools,F12,Network选项卡中观察到的web流量。授权和会话id可能有时间限制。您可以使用会话来处理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)

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

位于
https://pub.fsa.gov.ru/ral/view/8/applicant
,在加载javascript文件,此文件负责动态内容加载

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

一个解决办法是使用。它将允许您以编程方式与浏览器(如chrome或firefox)交互,这些浏览器实际上会呈现结果

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

用法示例 您应该调整此代码以刮取希望刮取的数据

#导入
从selenium导入webdriver
从selenium.webdriver.chrome.options导入选项
从selenium.webdriver.common.by导入
从selenium.webdriver.support.ui导入WebDriverWait
从selenium.webdriver.support将预期的_条件导入为EC
从selenium.common.exceptions导入TimeoutException
#常数
URL='1〕https://pub.fsa.gov.ru/ral/view/8/applicant'
元素_XPATH='/html/body/fgis root/div/fgis ral/fgis card view/div/div/fgis view applicator/fgis card block/div/div[2]'
def main():
选项=选项()
options.headless=True
driver=webdriver.Chrome(options=options)
获取驱动程序(URL)
尝试:
元素=WebDriverWait(驱动程序,10)。直到(
EC.presence_of_element_located((By.XPATH,element_XPATH))
)
打印(element.text)
除TimeoutException外:
打印(“找不到所需的元素”)
最后:
driver.quit()
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
main()

由于您要查找的内容是从javascript生成的,因此您需要模拟浏览器。您可以使用来执行此操作:

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")
还可以查看所有可用的方法来定位页面中的元素。

信息不是“隐藏的”,而是通过JavaScript动态生成的。这可以通过在浏览器开发工具的元素检查器中比较“视图源”和DOM来确认

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

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


若您必须使用Python,这里有一个很好的入门教程:。

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