爬取Pinnacle.com的NBA赛事链接失败,求技术解决方案
问题原因分析
- 动态内容渲染:Pinnacle的NBA比赛数据是通过JavaScript动态加载的,
requests只能获取到页面的静态骨架HTML,里面没有实际的比赛链接和内容,自然找不到<a>标签。 - 反爬机制拦截:Pinnacle有严格的反爬策略,会检测请求的合法性:
- 缺少真实的请求头(比如
User-Agent)会被判定为爬虫,返回空内容或错误页面; - 直接使用Selenium可能会被识别出自动化工具特征(如
webdriver属性),导致页面无法正常加载;
- 缺少真实的请求头(比如
- URL锚点无效:原URL中的
#period:0:spread是前端路由参数,服务器返回的基础页面不会根据这个锚点直接返回对应内容,需要前端JS解析后再请求数据接口。
解决办法
针对Pinnacle的特性,推荐优化Selenium的使用方式,规避反爬并等待动态内容加载:
步骤1:配置Selenium规避检测
使用ChromeOptions隐藏自动化特征,模拟真实浏览器请求:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 配置Chrome选项 options = Options() options.add_argument("--disable-blink-features=AutomationControlled") # 禁用自动化检测 options.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36") # 设置真实UA options.add_argument("--start-maximized") # 最大化窗口模拟真实操作 # 初始化浏览器 driver = webdriver.Chrome(options=options)
步骤2:等待页面加载并提取链接
使用WebDriverWait等待比赛元素加载完成,再提取对应链接:
try: # 访问目标页面 url = 'https://www.pinnacle.com/en/basketball/nba/matchups/#period:0:spread' driver.get(url) # 等待比赛链接元素加载(根据页面实际元素调整选择器,这里示例用比赛卡片的a标签) wait = WebDriverWait(driver, 10) game_links = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "a[href*='/en/basketball/nba/matchups/']"))) # 提取并打印链接 urls = [] for link in game_links: href = link.get_attribute('href') if href not in urls: urls.append(href) print(href) finally: # 关闭浏览器 driver.quit()
额外注意事项
- 若仍被拦截,可尝试添加随机延迟(
time.sleep(random.uniform(1,3))),模拟人工操作间隔; - 避免频繁请求,防止IP被封禁;
- 定期检查页面元素选择器,网站更新后可能需要调整CSS选择器或XPath。
内容的提问来源于stack exchange,提问作者Ben Troutman
相关产品推荐
相关产品推荐

