Python抓取AJAX动态网页表格数据求助
解决PSE网页AJAX表格数据抓取问题
常见问题排查与解决方法
1. 补全关键请求头
多数网站会校验请求头的核心字段,缺失会导致返回空内容。必须带上的字段包括:
User-Agent:模拟真实浏览器标识Referer:标识请求来源页面X-Requested-With:标记为AJAX请求- 必要的Cookie:部分网站需要会话Cookie验证
示例代码:
import requests # 替换为你找到的AJAX请求URL target_api_url = "你的AJAX请求地址" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Referer": "https://www.pse.pl/dane-systemowe/funkcjonowanie-kse/raporty-godzinowe-z-funkcjonowania-rb/iteracje-obslugi-use-w-ramach-rbb", "X-Requested-With": "XMLHttpRequest", "Accept": "application/json, text/javascript, */*; q=0.01" } # 先访问原页面获取会话Cookie session = requests.Session() session.get("https://www.pse.pl/dane-systemowe/funkcjonowanie-kse/raporty-godzinowe-z-funkcjonowania-rb/iteracje-obslugi-use-w-ramach-rbb") # 发送AJAX请求 response = session.get(target_api_url, headers=headers) print(response.text)
2. 核对请求参数
对比浏览器F12面板中真实请求的参数,确保你构造的参数完全一致:
- 检查参数的大小写、格式(比如日期是否为
YYYY-MM-DD格式) - 确认分页、筛选等参数没有遗漏
3. 确认请求方式
部分AJAX请求使用POST而非GET,如果浏览器中显示请求方法是POST,需调整代码:
# 示例POST请求,参数放在json字段中 payload = { "date": "2024-05-20", "page": 1 } response = session.post(target_api_url, headers=headers, json=payload)
4. 处理动态生成参数
如果请求包含动态参数(如csrf-token、时间戳),需先从原页面HTML中提取:
from bs4 import BeautifulSoup # 获取原页面HTML page_html = session.get("https://www.pse.pl/dane-systemowe/funkcjonowanie-kse/raporty-godzinowe-z-funkcjonowania-rb/iteracje-obslugi-use-w-ramach-rbb").text soup = BeautifulSoup(page_html, "html.parser") # 提取页面中的csrf token(示例,根据实际页面结构调整) csrf_token = soup.find("meta", attrs={"name": "csrf-token"})["content"] # 将token加入请求头或参数 headers["X-CSRF-Token"] = csrf_token
5. 模拟浏览器加载(终极方案)
如果网站有复杂反爬机制,直接用Selenium模拟浏览器渲染页面:
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 driver = webdriver.Chrome() driver.get("https://www.pse.pl/dane-systemowe/funkcjonowanie-kse/raporty-godzinowe-z-funkcjonowania-rb/iteracje-obslugi-use-w-ramach-rbb") # 等待表格加载完成 table = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.TAG_NAME, "table")) ) # 提取表格数据 rows = table.find_elements(By.TAG_NAME, "tr") for row in rows: cols = row.find_elements(By.TAG_NAME, "td") print([col.text for col in cols]) driver.quit()
内容的提问来源于stack exchange,提问作者Nice Guy Eddie
相关产品推荐
相关产品推荐

