我试图解析网站,但我无法获得有关页面的全部信息。更确切地说,我必须在<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驾驶无头铬。