You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何我的网页爬虫脚本在特定网站失效?求原因与解决方案

问题分析与解决办法

明确结论:是反爬机制导致的问题

bovada.lv存在严格的反爬策略:

  • 直接用requests.get请求API时,服务器会拦截未通过验证的请求(比如缺少合法请求头、无会话标识),返回非JSON内容(如验证码页面、403响应),因此触发JSONDecodeError。
  • 逐行运行webdriver能成功,但整脚本运行失败,是因为自动化工具的特征(如执行速度过快、浏览器指纹异常)被检测到。

可行解决办法

1. 优化requests请求,模拟合法浏览器行为

给请求添加完整的请求头,必要时复用浏览器的会话Cookie:

import requests
import json

headers = {
    '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',
    'Accept': 'application/json, text/plain, */*',
    'Referer': 'https://www.bovada.lv/sports/basketball',
    # 可从浏览器开发者工具中复制当前会话的Cookie、Origin等字段
}

response = requests.get(
    'https://www.bovada.lv/services/sports/event/v2/events/A/description/basketball',
    headers=headers
)

# 先验证响应内容
print(response.status_code)
print(response.text[:500])  # 查看返回是否为JSON格式

if response.status_code == 200:
    try:
        source = response.json()
        # 后续数据处理逻辑
    except json.JSONDecodeError:
        print("请求被拦截,返回内容非JSON")

2. 优化Selenium配置,规避自动化检测

针对整脚本运行失败的问题,需要隐藏webdriver的自动化特征,模拟人类操作节奏:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
import random

options = Options()
# 隐藏自动化标识
options.add_argument('--disable-blink-features=AutomationControlled')
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
# 模拟正常窗口尺寸
options.add_argument('--window-size=1920,1080')
# 自定义User-Agent
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')

browser = webdriver.Chrome(options=options)
# 移除navigator.webdriver标识
browser.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")

# 模拟正常用户路径:先访问主页,再跳转API页面
browser.get('https://www.bovada.lv/sports/basketball')
time.sleep(random.uniform(2,4))  # 随机延迟,模拟浏览
browser.get('https://www.bovada.lv/services/sports/event/v2/events/A/description/basketball')
time.sleep(random.uniform(1,2))  # 等待页面加载

page_source = browser.page_source
# 解析页面中的JSON内容

3. 关键注意事项

  • 控制请求频率,避免短时间内大量请求导致IP封禁。
  • 定期更新请求头和webdriver配置,网站反爬规则会持续迭代。
  • 严格遵守网站服务条款和robots.txt规则,非法爬取可能引发法律风险。

内容的提问来源于stack exchange,提问作者timmy_pickens

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 02:05:07