如何检查服务器接收的Payload值?Tapology爬虫调试求助
问题描述
我正在开展一项研究项目,需从tapology.com网站解析数据,需通过发送带Payload的POST请求获取所需数据。现有实现代码如下:
import requests from bs4 import BeautifulSoup payload = {'group':'all','shedule':'results','sport':'mma','region':''} url = 'https://tapology.com/fightcenter' with requests.Session as s: s.headers.update({'Content-Type' : 'application/x-www-form-urlencoded; charset=UTF-8','Accept-Language':'en-US,en;q=0.9,ru-RU;q=0.8,ru;q=0.7','Content-Length':'161','Host':'www.tapology.com','Origin':'https://www.tapology.com','Referer':'https://www.tapology.com/fightcenter','sec-ch-ua':'"Not:A-Brand";v="99", "Chromium";v="112"','sec-ch-ua-mobile':'?1','sec-ch-ua-platform':'"Android"','Sec-Fech-Dest':'empty','Sec-Fetch-Mode':'cors','Sec-Fetch-Site':'same-origin','User-Agent':'Mozilla/5.0 (Linux; Android 11; SM-M127F) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36','X-Requested-Width':'XMLHttpRequest'}) soup = BeautifulSoup(response.content, 'html.parser') payload['authenticity_token'] = soup.select_one("input[name='authenticity_token']")['value'] x = payload['authenticity_token'] s.headers.update({'X-CSRF-Token': str(x)}) data_source = 'https://www.tapology.com/fightcenter_events' res = s.post(data_source, data = payload) item = soup.find_all('section',class_='fcListing') for i in item: sport = i.select('span.sport') print(sport)
我在Payload中指定sport字段值为mma,期望print(sport)输出结果均为MMA,但实际得到MMA、Boxing等混合结果,推测Payload未被服务器正确接收或识别。请问如何检查服务器实际接收的数据,以及该如何调试此问题?
调试与检查方法
一、检查服务器实际接收的数据
开启requests调试日志,查看完整请求详情:
在代码开头添加以下代码,会打印出发送的请求头、Payload内容以及服务器响应的状态码和头信息,确认sport=mma是否被正确发送:import logging import http.client http.client.HTTPConnection.debuglevel = 1 logging.basicConfig() logging.getLogger().setLevel(logging.DEBUG) requests_log = logging.getLogger("requests.packages.urllib3") requests_log.setLevel(logging.DEBUG) requests_log.propagate = True打印POST请求的响应内容:
在res = s.post(...)之后添加:print(res.text)直接查看服务器返回的内容,判断返回数据是否已经过滤出仅MMA的赛事。如果返回内容仍包含其他运动,说明服务器未处理筛选条件;如果返回内容正确,则问题出在后续的解析环节。
二、修复代码中的明显错误
- Session创建错误:原代码
with requests.Session as s缺少括号,应改为with requests.Session() as s,否则无法正确创建会话对象。 - 缺失初始页面请求:原代码直接使用
response.content但未定义response,需先通过会话获取初始页面:response = s.get(url) soup = BeautifulSoup(response.content, 'html.parser') - 解析对象错误:筛选后的赛事数据在POST请求的响应
res中,需用res.content创建新的BeautifulSoup对象:res_soup = BeautifulSoup(res.content, 'html.parser') item = res_soup.find_all('section', class_='fcListing') - 请求头拼写错误:
X-Requested-Width应为X-Requested-With,拼写错误会导致服务器无法识别AJAX请求类型。 - 移除手动设置的Content-Length:该字段由requests自动计算,手动设置可能与实际Payload长度不匹配,直接删除即可。
三、模拟浏览器请求的额外验证
- 对比浏览器请求详情:打开Chrome开发者工具(F12),在Network标签下找到对应的POST请求,将浏览器发送的Form Data和请求头与代码中的内容逐一比对,确保所有参数、头信息完全一致(包括大小写、参数名拼写)。
- 验证authenticity_token有效性:确认从初始页面获取的
authenticity_token是否正确传递,服务器可能通过该令牌验证请求合法性,令牌无效会导致筛选条件被忽略。
内容的提问来源于stack exchange,提问作者AdilAkavov
相关产品推荐
相关产品推荐

