因此,要抓取 vue-app 标签中动态生成的页面内容,我首先需要使用凭据登录,这是通过 POST 请求完成的。问题是,为了成功登录,我需要提供 CSRF 令牌,据我所知,它与会话绑定,这反过来要求访问目标页面的客户端与最初访问登录页面以获取 CSRF 令牌的客户端相同。简而言之,我需要一个客户端来执行登录 POST 请求和 JS 生成的代码抓取。
对于后者,我通常会使用 Selenium Web-driver,但是,它默认不支持 POST 请求。尝试使用 selenium-requests 驱动程序也对我没有帮助,因为令牌由于某种原因不同(可能是因为 selenium-requests 是 requests 的纯粹副本,并且没有真正集成到 selenium 本身中)。
from bs4 import BeautifulSoup
import seleniumrequests
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
# Chrome Options
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
# Web-driver on selenium-requests
driver = seleniumrequests.Chrome(service=Service('/usr/local/bin/chromedriver'), options=chrome_options)
# login url
login_url = 'https://example.com/login'
# target url
target_url = 'https://example.com/profile'
# csrf
driver.get(login_url)
html = driver.page_source
soup = BeautifulSoup(html, "html.parser")
csrf = soup.find('input', {'name':'user[_csrf_token]'}).get('value')
# payload
payload = {
'username': 'username',
'password': 'password',
'csrf': csrf
}
# POST-query
response = driver.request('POST', login_url, data=payload)
if response.status_code == 200:
try:
# Open target url
driver.get(target_url)
page_html = driver.page_source
print(page_html)
finally:
driver.quit()
else:
print(f"Failed to login. Status code: {response.status_code}")
我还尝试将登录凭据保存在cookie中,但这不起作用,然后我意识到该网站不支持cookie。
任何帮助表示赞赏。
要在 Python 中发出 POST 请求并抓取 JavaScript 生成的内容,请使用 requests 等库来发送带有数据负载的 POST 请求。为了处理动态内容,请使用 Selenium 或 BeautifulSoup 与 requests-html 来解析 JavaScript 执行后渲染的 HTML,从而能够从页面源中提取所需的数据。