使用Scrapy(已配置User Agent)仍被网站拦截的问题求助
爬取业余体育网站时Scrapy请求被拦截,持续返回429状态码
- 目标网站:
avaldsnes.spoortz.no - 问题现象:已配置User Agent(包括Google Bot和普通浏览器UA),但所有请求均返回429 Unknown Status,无一次200成功响应;浏览器可正常访问该网站,确认IP未被封禁。
用户提供的代码
import scrapy from scrapy.spiders import Rule, CrawlSpider from scrapy.linkextractors import LinkExtractor class QuoteSpider(CrawlSpider): name = "Quote" allowed_domains = ["avaldsnes.spoortz.no"] start_urls = ["https://avaldsnes.spoortz.no/portal/arego/club/7"] rules = (Rule(LinkExtractor(allow="")),) custom_settings = {"USER_AGENT": "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"} def parse(self, response): print(response.request.headers)
解决建议
1. 降低请求频率,添加延迟
429状态码本质是请求过于频繁触发了反爬限制,先通过Scrapy配置降低请求密度:
custom_settings = { "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", "DOWNLOAD_DELAY": 2, # 每次请求间隔2秒,可根据实际情况调整 "CONCURRENT_REQUESTS_PER_DOMAIN": 1 # 每个域名同时仅发送1个请求 }
2. 补充完整浏览器请求头
浏览器访问时会携带更多字段,仅设置User Agent不够,手动添加常用请求头:
def start_requests(self): headers = { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Language": "en-US,en;q=0.5", "Referer": "https://avaldsnes.spoortz.no/", "Upgrade-Insecure-Requests": "1" } for url in self.start_urls: yield scrapy.Request(url, headers=headers, callback=self.parse)
3. 先禁用自动链接提取,测试单页请求
当前Rule配置会提取页面所有链接,短时间内触发大量请求。先注释掉规则,仅测试起始URL的请求,确认能拿到200响应后再逐步扩展:
# rules = (Rule(LinkExtractor(allow="")),)
4. 模拟浏览器会话Cookie
浏览器访问时会生成会话Cookie,尝试复制浏览器中该网站的Cookie添加到请求头:
headers = { # 其他请求头字段... "Cookie": "复制浏览器开发者工具中该网站的Cookie内容" }
内容的提问来源于stack exchange,提问作者aman merz
相关产品推荐
相关产品推荐

