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

