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

Scrapy爬虫爬取Futbin网站触发429错误及爬虫报错问题咨询

解决Futbin爬虫的429限流与页面爬取报错问题

首先,你遇到的429错误是网站的速率限制机制在阻止你的高频请求,而部分站点报错大概率是因为硬编码的XPATH不够健壮,或者请求触发了反爬机制。咱们一步步来修复:

1. 解决429 Too Many Requests错误

网站检测到短时间内大量集中请求,就会返回429,这时候需要调整Scrapy的请求节奏:

  • 添加下载延迟与并发控制:在settings.py里配置以下参数,降低请求频率,模拟真人浏览节奏:
DOWNLOAD_DELAY = 2  # 每个请求间隔2秒,可根据网站宽松程度调整
CONCURRENT_REQUESTS_PER_DOMAIN = 2  # 同一域名同时发起的请求数
AUTOTHROTTLE_ENABLED = True  # 开启自动速率调整
AUTOTHROTTLE_START_DELAY = 1
AUTOTHROTTLE_MAX_DELAY = 5
  • 避免一次性发起所有请求:不要直接在start_urls里生成20个页面URL,改用逐页请求的方式——爬完当前页再请求下一页,这样请求更平缓,不容易触发限流。

2. 修复XPATH导致的页面爬取报错

你的XPATH存在两个明显问题:

  • 错误使用了"这种HTML转义字符,Scrapy的XPATH里直接用双引号/单引号即可,不需要转义;
  • 硬编码了行号range(1,31)和固定路径,如果页面结构变动(比如某页球员不足30个,或者元素ID调整),就会直接报错。

建议改用更健壮的XPATH写法,通过遍历元素而非硬编码索引:

def parse(self, response):
    # 遍历所有球员行,不管当前页有多少条数据
    for player_row in response.xpath('//*[@id="repTb"]/tbody/tr'):
        yield {
            'name': player_row.xpath('./td[1]/div[2]/div[1]/a/text()').get(),
            'team': player_row.xpath('./td[1]/div[2]/div[2]/span/a[1]/@data-original-title').get(),
            'country': player_row.xpath('./td[1]/div[2]/div[2]/span/a[2]/@data-original-title').get(),
            'position': player_row.xpath('./td[3]/text()').get(),
            'base stats': player_row.xpath('./td[17]/text()').get()
        }

这样不管页面有多少个球员条目,都能正常遍历,不会因为索引超出范围报错。

3. 其他优化建议

  • 不要在类定义里直接操作文件:你写的with open('items.json', 'w') as file: pass会在爬虫启动时清空文件,但Scrapy本身支持通过命令行导出数据(比如scrapy crawl futbin -o items.json),或者用Item Pipeline处理数据持久化,更符合框架设计规范。
  • 添加请求头模拟浏览器:在settings.py里配置真实的USER_AGENT,减少被识别为爬虫的概率:
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36'
  • 正确处理页面翻页:如果要爬多页,建议在parse方法里提取下一页的URL,再发起请求,配合速率控制效果更好:
def parse(self, response):
    # 先爬取当前页数据
    for player_row in response.xpath('//*[@id="repTb"]/tbody/tr'):
        # 生成数据项...
    
    # 提取下一页URL并发起请求
    next_page = response.xpath('//a[@class="page-link" and contains(text(), "Next")]/@href').get()
    if next_page:
        next_page_url = response.urljoin(next_page)
        yield scrapy.Request(next_page_url, callback=self.parse)

这样爬虫会一页一页地递进爬取,配合下载延迟,能大大降低触发限流的概率。

内容的提问来源于stack exchange,提问作者Lenner Coutinho Pereira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 23:13:12