使用Python Scrapy爬取coinmarketcap时如何避免触发429 HTTP状态码?
Scrapy爬取CoinMarketCap 429报错解决方案
1. 优化基础配置
你当前开启的自动限速用的是默认宽松参数,无法满足反爬严格站点的要求,在settings.py中补充如下配置:
# 自动限速优化 AUTOTHROTTLE_ENABLED = True AUTOTHROTTLE_START_DELAY = 2 # 初始请求延迟2秒 AUTOTHROTTLE_MAX_DELAY = 10 # 被限制时最大延迟10秒 AUTOTHROTTLE_TARGET_CONCURRENCY = 0.5 # 降低单IP并发量 # 全局并发控制 CONCURRENT_REQUESTS = 2 # 从默认16压到2以内,大幅降低请求频率 # 重试规则优化 RETRY_TIMES = 10 # 提高429请求的重试次数,临时限制可通过重试解决 RETRY_HTTP_CODES = [429, 500, 502, 503, 504, 408] # 明确将429加入重试列表 # 请求头伪装,避免被识别为爬虫 DEFAULT_REQUEST_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': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8', 'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.3', 'Referer': 'https://coinmarketcap.com/' }
2. 代理池优化
你当前使用的免费公共代理池可用性极低,大部分IP已经被CoinMarketCap拉黑,可按以下方案调整:
- 更换为付费高匿代理池,保证IP纯度和可用性,避免同一IP短时间发送大量请求被封
- 若继续使用免费代理,调高代理池无效IP的剔除阈值,加快IP刷新频率
3. 爬虫逻辑增加随机延迟
在请求详情页之前增加随机等待,避免固定间隔的请求被反爬规则识别:
import random import time # 调整parse_front方法 def parse_front(self, response): slugs = response.css('tr > td:nth-of-type(3) a::attr(href)').extract() newSearch = ['https://coinmarketcap.com' + i for i in slugs] for url in newSearch: # 每次请求前随机等待1-3秒 time.sleep(random.uniform(1,3)) yield response.follow(url = url, callback = self.parse_pages)
4. 低请求量方案(推荐)
你当前逐个请求详情页的方式会产生200+次请求,实际上所有需要的字段在关注列表页的表格中已经全部提供,直接从列表页解析数据即可,总请求量仅1次,完全规避429限制:
- 关注列表页的表格自带名称、市值、交易量、关注人数所有目标字段,无需跳转详情页
- 若列表是滚动加载的,可以直接抓列表对应的后端接口,返回JSON格式数据,解析成本更低
内容的提问来源于stack exchange,提问作者jackcannelloni
相关产品推荐
相关产品推荐

