同一URL对应两个页面,Python+Selenium爬取Sofascore赛事数据遇阻
解决Sofascore赛事URL跳转问题,爬取指定历史赛事数据
问题核心
Sofascore的短格式对阵URL(比如https://www.sofascore.com/arsenal-tottenham-hotspur/IsR)是动态匹配机制,会优先指向最新或未来的同对阵赛事,所以直接访问会跳转到非目标的历史场次。
可行解决方法
用赛事唯一ID构建固定URL
Sofascore每一场赛事都有唯一数字ID,这个ID对应的URL不会跳转。你可以从日期页面的元素里提取这个ID:- 先通过Selenium访问目标日期页面
https://www.sofascore.com/football/2022-05-12 - 定位到热刺对阵阿森纳的赛事卡片,提取卡片上的
data-event-id属性值(这就是该场赛事的唯一ID) - 用ID拼接成固定URL:
https://www.sofascore.com/event/{赛事ID},访问这个地址就能直接进入目标历史赛事页面
- 先通过Selenium访问目标日期页面
保留会话上下文跳转
不要直接输入短URL,而是模拟正常用户操作流程:- 先打开日期页面,再用Selenium模拟点击赛事卡片进入详情页,这样网站会话会记录你是从历史日期入口进入的,不会跳转到未来赛事
添加页面日期验证
不管用哪种方式进入页面,都可以加一步验证:- 提取页面上的赛事日期文本,和目标日期
2022-05-12对比 - 如果不匹配,说明页面跳转了,重新通过日期页面入口进入即可
- 提取页面上的赛事日期文本,和目标日期
代码示例(基于Selenium)
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() # 1. 访问日期页面获取赛事唯一ID driver.get("https://www.sofascore.com/football/2022-05-12") # 等待赛事卡片加载,定位热刺vs阿森纳的赛事卡片 event_card = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, "//div[contains(text(), 'Tottenham Hotspur') and contains(text(), 'Arsenal')]/ancestor::div[@data-event-id]")) ) event_id = event_card.get_attribute("data-event-id") # 2. 用唯一ID访问固定URL fixed_url = f"https://www.sofascore.com/event/{event_id}" driver.get(fixed_url) # 可选:验证页面日期是否正确 match_date = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "sc-12foipm-0")) ).text if "12 May 2022" in match_date: print("成功进入目标赛事页面") # 此处编写爬取数据的逻辑 else: print("页面跳转,重新获取赛事ID") driver.quit()
内容的提问来源于stack exchange,提问作者Kwinten
相关产品推荐
相关产品推荐

