在 Python 中发出 POST 请求并抓取 JS 生成的内容

问题描述 投票:0回答:1

因此,要抓取 vue-app 标签中动态生成的页面内容,我首先需要使用凭据登录,这是通过 POST 请求完成的。问题是,为了成功登录,我需要提供 CSRF 令牌,据我所知,它与会话绑定,这反过来要求访问目标页面的客户端与最初访问登录页面以获取 CSRF 令牌的客户端相同。简而言之,我需要一个客户端来执行登录 POST 请求和 JS 生成的代码抓取。

对于后者,我通常会使用 Selenium Web-driver,但是,它默认不支持 POST 请求。尝试使用 selenium-requests 驱动程序也对我没有帮助,因为令牌由于某种原因不同(可能是因为 selenium-requestsrequests 的纯粹副本,并且没有真正集成到 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 selenium-webdriver web-scraping post selenium-chromedriver
1个回答
0
投票

要在 Python 中发出 POST 请求并抓取 JavaScript 生成的内容,请使用 requests 等库来发送带有数据负载的 POST 请求。为了处理动态内容,请使用 Selenium 或 BeautifulSoup 与 requests-html 来解析 JavaScript 执行后渲染的 HTML,从而能够从页面源中提取所需的数据。

© www.soinside.com 2019 - 2024. All rights reserved.