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

使用BS4抓取WSL网站新闻URL时POST请求报408错误求助

解决WSL新闻页面POST请求408超时问题

首先,408请求超时的核心原因是你的请求缺少必要的表单数据,同时部分请求头配置有误,导致服务器无法正确处理你的请求。下面是具体的修复步骤:

1. 补充POST请求的表单数据(必填)

你当前的代码只发送了请求头,没有传递application/x-www-form-urlencoded类型的表单数据。服务器在等待你提交过滤参数时超时,所以返回408。

你需要从浏览器Network面板的Form Data里复制所有参数,转成Python字典。比如从目标请求里,你能看到类似这些参数(具体以浏览器实际抓取的为准):

form_data = {
    'tx_wslfilter_filter[filter][categories]': '',
    'tx_wslfilter_filter[filter][keywords]': '',
    'tx_wslfilter_filter[filter][fromDate]': '',
    'tx_wslfilter_filter[filter][toDate]': '',
    'tx_wslfilter_filter[page]': '1',  # 页码,默认第一页
    'tx_wslfilter_filter[sorting]': 'newest',
    'tx_wslfilter_filter[itemsPerPage]': '100'  # 可以设大一点一次性抓更多
}

2. 修正请求头配置

你的请求头里有几个错误:

  • Content-Length: 手动设置的长度和实际表单数据长度不匹配时,会导致服务器解析失败。应该删掉这个头,让requests自动计算并添加。
  • Server-Timing: 这是服务器返回的响应头,不是请求头,不需要放在请求里。
  • 缺少User-Agent: 很多网站会验证请求的客户端标识,加上这个头可以模拟浏览器请求,避免被拦截。

修正后的请求头如下:

headers = {
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'en-GB,en-US;q=0.9,en;q=0.8',
    'Connection': 'keep-alive',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Host': 'www.wsl.ch',
    'Origin': 'https://www.wsl.ch',
    'Referer': 'https://www.wsl.ch/de/ueber-die-wsl/news/alle-news.html',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-origin',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}

3. 完整的修复代码

把表单数据和修正后的请求头结合,完整代码如下:

import requests
from bs4 import BeautifulSoup

url = 'https://www.wsl.ch/de/ueber-die-wsl/news/alle-news.filter.html?tx_wslfilter_filter%5Baction%5D=ajax&tx_wslfilter_filter%5Bcontroller%5D=Filter&cHash=88a50dfb12c7c7e03ce68f244dbfda20'

# 从浏览器复制的表单数据
form_data = {
    'tx_wslfilter_filter[filter][categories]': '',
    'tx_wslfilter_filter[filter][keywords]': '',
    'tx_wslfilter_filter[filter][fromDate]': '',
    'tx_wslfilter_filter[filter][toDate]': '',
    'tx_wslfilter_filter[page]': '1',
    'tx_wslfilter_filter[sorting]': 'newest',
    'tx_wslfilter_filter[itemsPerPage]': '100'
}

headers = {
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'en-GB,en-US;q=0.9,en;q=0.8',
    'Connection': 'keep-alive',
    'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Host': 'www.wsl.ch',
    'Origin': 'https://www.wsl.ch',
    'Referer': 'https://www.wsl.ch/de/ueber-die-wsl/news/alle-news.html',
    'Sec-Fetch-Dest': 'empty',
    'Sec-Fetch-Mode': 'cors',
    'Sec-Fetch-Site': 'same-origin',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
}

# 发送POST请求,传递表单数据
response = requests.post(url, headers=headers, data=form_data)
print(f"响应状态码: {response.status_code}")

if response.status_code == 200:
    soup = BeautifulSoup(response.content, 'html.parser')
    # 提取所有新闻链接
    news_links = soup.find_all('a', href=True)
    for link in news_links:
        # 拼接完整URL(如果href是相对路径)
        full_link = 'https://www.wsl.ch' + link['href']
        print(full_link)
else:
    print(f"请求失败: {response.text}")

额外建议:用浏览器的Copy as cURL快速生成请求

如果还是遇到问题,你可以在浏览器Network面板里找到目标POST请求,右键选择Copy > Copy as cURL (bash),然后用本地工具把cURL命令转成Python requests代码,这样能完全复刻浏览器的请求,避免参数遗漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:33:42