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
相关产品推荐
相关产品推荐

