You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python请求dsbmobile.de仅获部分内容,如何获取完整页面?

解决dsbmobile.de内容获取不全的问题

核心问题分析

你的代码存在两个关键错误:

  • __VIEWSTATE和__EVENTVALIDATION是ASP.NET页面动态生成的验证参数,硬编码成#VIEWSTATE和#EVENTVALIDATION会导致登录请求无效,无法获取后续内容。
  • 登录后重复请求登录页面而非目标内容页,且文件写入代码缩进错误,会触发变量未定义的报错。

此外,若修复后仍无法获取内容,大概率是目标内容由JavaScript动态渲染,仅靠requests无法执行JS解析动态内容。

解决步骤与修正代码

方案1:修复requests请求(适配静态加载内容)

先获取登录页面的动态验证参数,再提交登录请求,最后访问目标内容页:

import requests
from bs4 import BeautifulSoup

def main(username, password):
    login_url = "https://www.dsbmobile.de/Login.aspx"
    with requests.session() as session:
        # 1. 获取登录页面,提取动态验证参数
        initial_resp = session.get(login_url)
        soup = BeautifulSoup(initial_resp.text, "html.parser")
        
        viewstate = soup.find("input", {"id": "__VIEWSTATE"})["value"]
        viewstate_gen = soup.find("input", {"id": "__VIEWSTATEGENERATOR"})["value"]
        event_validation = soup.find("input", {"id": "__EVENTVALIDATION"})["value"]
        
        # 2. 构建合法登录payload
        payload = {
            '__LASTFOCUS': '',
            '__VIEWSTATE': viewstate,
            '__VIEWSTATEGENERATOR': viewstate_gen,
            '__EVENTTARGET': '',
            '__EVENTARGUMENT': '',
            '__EVENTVALIDATION': event_validation,
            'txtUser': username,
            'txtPass': password,
            'ctl03': 'Anmelden'
        }
        
        # 3. 提交登录请求
        session.post(login_url, data=payload)
        
        # 4. 访问替换计划所在页面(需替换为实际登录后跳转的目标URL)
        target_url = "https://www.dsbmobile.de/Home.aspx"
        content_resp = session.get(target_url)
        
        # 保存完整内容
        with open("index.html", "w", encoding="utf-8") as f:
            f.write(content_resp.text)

# 替换为你的账号密码后调用
main("your_username", "your_password")

方案2:模拟浏览器渲染(适配JS动态加载内容)

若方案1仍无法获取完整内容,说明内容由JS动态生成,需用selenium模拟浏览器执行JS:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

def main(username, password):
    # 初始化Chrome浏览器(需提前安装对应版本的ChromeDriver)
    driver = webdriver.Chrome()
    driver.get("https://www.dsbmobile.de/Login.aspx")
    
    # 输入账号密码并登录
    driver.find_element(By.ID, "txtUser").send_keys(username)
    driver.find_element(By.ID, "txtPass").send_keys(password)
    driver.find_element(By.ID, "ctl03").click()
    
    # 等待页面及动态内容加载完成
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "content"))
    )
    time.sleep(2)
    
    # 获取完整页面源码
    page_source = driver.page_source
    
    # 保存内容
    with open("index.html", "w", encoding="utf-8") as f:
        f.write(page_source)
    
    driver.quit()

# 替换为你的账号密码后调用
main("your_username", "your_password")

注意事项

  • 方案1需确认登录后的目标页面URL,可通过浏览器登录后查看地址栏地址替换target_url。
  • 方案2需安装selenium库及对应浏览器驱动,确保驱动版本与浏览器版本匹配。

内容的提问来源于stack exchange,提问作者JoJo369

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 13:40:10