从UFC过往赛事页面爬取数据遇Ajax 404,如何获取全部赛事数据?
解决UFC过往赛事数据爬取的404问题
问题根源
你用的接口URL和请求方式不对,原接口需要POST请求并携带正确的视图参数,而且Accept头设置错误,导致服务器返回404。
修正方案
调整请求方式与Headers
- 把请求从
GET改为POST,UFC的加载更多接口需要提交表单数据; - 将
Accept头改为application/json, text/javascript, */*; q=0.01,匹配接口返回的数据格式; - 保留
User-Agent模拟浏览器请求,避免被拦截。
- 把请求从
添加必要的表单参数
接口需要以下核心参数(以第一页为例):view_name:event_list(指定视图名称)view_display_id:past_events(指定过往赛事视图)page:0(分页页码,从0开始递增)_drupal_ajax:1(标识Ajax请求)
完整代码示例
import requests headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/112.0', 'Accept': 'application/json, text/javascript, */*; q=0.01', 'X-Requested-With': 'XMLHttpRequest' } base_url = 'https://www.ufc.com/views/ajax' page_num = 0 all_events = [] while True: form_data = { 'view_name': 'event_list', 'view_display_id': 'past_events', 'page': str(page_num), '_drupal_ajax': '1' } response = requests.post(base_url, headers=headers, data=form_data) if response.status_code != 200: print(f"请求失败,状态码: {response.status_code}") break data = response.json() # 提取赛事HTML片段(返回结构中data字段为赛事列表的HTML) event_html = data[1]['data'] if len(data) > 1 else '' if not event_html.strip(): print("没有更多赛事数据") break # 可添加BeautifulSoup解析HTML提取具体赛事信息 # from bs4 import BeautifulSoup # soup = BeautifulSoup(event_html, 'html.parser') # 例如提取赛事标题:soup.find_all('h3', class_='c-card-event--result__headline') all_events.append(event_html) page_num += 1 print(f"已加载第 {page_num} 页数据") print(f"共加载 {len(all_events)} 页赛事数据")
额外注意
- 解析数据时用
BeautifulSoup处理返回的HTML片段,可提取赛事名称、日期、地点等核心信息; - 控制请求频率,每请求一次暂停1-2秒,避免触发反爬机制;
- 若后续接口参数变化,可通过浏览器F12「网络」面板查看真实请求的参数和Headers。
内容的提问来源于stack exchange,提问作者Артём Курилко
相关产品推荐
相关产品推荐

