我试图解析网站,但是我无法获得有关页面的全部信息。更准确地说,我必须拥有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>
答案 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")
答案 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。