Python使用requests爬取黄页网站发送POST请求返回404错误咨询
POST请求返回404的排查思路与修复方案
核心问题排查点
- 错误的
authority请求头:当前请求头中authority设置为www.google-analytics.com,与实际请求的目标域名www.yellowpages.vu不符,多数站点会校验该字段,匹配错误直接拒绝请求返回404 - 重复无效的请求头:代码中重复定义了
User-Agent、Referer、Origin三个字段,可能导致服务器解析头信息异常 - 错误的
Content-Type与content-length设置:当前Content-Type设为text/plain,表单提交的标准值应为application/x-www-form-urlencoded;同时手动设置content-length: 0,但实际请求携带了表单数据,会导致服务器认为请求体为空,路由匹配失败返回404 - 硬编码的动态参数:代码中的
cookie、ssid、以及data内的6f7efb93929c56901a56bdeab2f7e50c(CSRF令牌字段)都是和会话绑定的动态值,硬编码的过期参数会触发服务器的安全校验,直接拒绝访问 - 请求路径校验:需要确认浏览器端实际发起搜索请求的路径是否为
https://www.yellowpages.vu/search/index.php,路径拼写错误会直接返回404
修复方案
调整后代码示例
import requests # 初始化会话自动管理cookie,无需手动硬编码 session = requests.Session() # 先请求搜索页获取动态参数和有效cookie search_page = session.get('https://www.yellowpages.vu/search/results') # 从返回的HTML中提取最新的ssid、csrf令牌(6f7efb93929c56901a56bdeab2f7e50c),替换后续硬编码参数 headers = { 'authority': 'www.yellowpages.vu', 'cache-control': 'max-age=0', 'sec-ch-ua': '"Chromium";v="94", "Google Chrome";v="94"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'upgrade-insecure-requests': '1', 'origin': 'https://www.yellowpages.vu', # 修正Content-Type为表单提交标准类型 'content-type': 'application/x-www-form-urlencoded', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36', 'accept': '*/*', 'sec-fetch-site': 'same-origin', 'sec-fetch-mode': 'cors', 'sec-fetch-dest': 'empty', 'referer': 'https://www.yellowpages.vu/search/results', 'accept-language': 'en-US,en;q=0.9,pt;q=0.8' # 移除手动设置的content-length,requests会自动计算正确值 } params = ( ('reset', '1'), ) # 以下动态参数需要替换为从search_page中提取的最新值 data = { 'xt_search_for': 'car', 'to_sid_list_1': '', 'field_city': '', 'ssid': '替换为提取到的最新ssid', 'sid': '1', 'task': 'search.search', 'option': 'com_sobipro', 'Itemid': '187', '6f7efb93929c56901a56bdeab2f7e50c': '替换为提取到的最新csrf令牌', 'sectionid': '1', 'default_query': '', 'field_categories': '', 'sp_search_for': 'car' } response = session.post('https://www.yellowpages.vu/search/index.php', headers=headers, params=params, data=data) print(response.status_code) print(response.text)
额外注意事项
- 所有动态生成的参数不要硬编码,每次请求前先从站点页面中提取最新值
- 优先使用
requests.Session()管理会话,自动处理cookie的更新与携带 - 若调整后依然返回404,可通过浏览器开发者工具的网络面板,对比自身请求与浏览器正常请求的差异,逐一排查头信息、参数的不同点
内容的提问来源于stack exchange,提问作者Alfred George
相关产品推荐
相关产品推荐

