爬虫遭遇Rate Limit限制?已试多种方法仍失败求解决方案
爬虫Rate Limit问题求助
爬取一批仅CODE参数不同的网页(共约1000个CODE),但爬取约100个后就触发网站的Rate Limit限制,已尝试以下方法均无效:
已尝试的无效方法
1. 设置固定浏览器User-Agent请求头
代码如下:
data = requests.get(url,headers=headers) for code in codes: url=url_partido.format(code) headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36'} data = requests.get(url,headers=headers) with open("nbadata/games22/{}.html".format(code),"w+") as f: f.write(data.text)
2. 添加固定时长的time.sleep(1)降低请求频率
3. 使用固定代理服务器列表切换IP
代码如下:
servers = ['95.216.194.46:1081', '45.174.87.18:999', ' 45.6.4.60:8080'] for code in codes: for server in servers: try: url = url_partido.format(code).replace('{server}', server) headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36'} data = requests.get(url,headers=headers) with open("nbadata/games22/{}.html".format(code),"w+") as f: f.write(data.text) break except Exception as e: print(f"Error {url}: {e}") continue
问题分析与解决思路
现有操作的问题
- UA单一固定:全程用同一个User-Agent,网站很容易识别出爬虫身份,进而针对该UA做频率限制。
- 请求间隔规律化:固定1秒的间隔过于机械,真实用户的访问间隔不会如此规整,容易被反爬机制捕捉。
- 代理使用错误:
- 代理列表仅3个,数量太少,轮用几次就会被网站标记;
- 代码中错误地将代理地址替换到URL里,根本没起到代理IP的作用,正确做法是通过
requests的proxies参数设置代理; - 公开免费代理大概率已经被网站拉黑,稳定性和可用性极低。
可行解决思路
随机切换UA:准备多组不同浏览器、设备的User-Agent,每次请求随机选取一个。可以手动维护UA列表,或者用工具库自动生成:
import random ua_list = [ 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 13_4) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/16.5 Safari/605.1.15', # 更多UA... ] headers = {'User-Agent': random.choice(ua_list)}随机化请求间隔:用随机时长替代固定sleep,比如设置1-5秒的随机间隔,模拟真实用户的访问节奏:
import time import random time.sleep(random.uniform(1, 5))正确使用代理:
- 更换高质量代理池,优先选择付费代理服务,或使用代理API自动获取可用代理;
- 修正代理设置代码,通过
proxies参数传递:proxies = { "http": f"http://{server}", "https": f"http://{server}" } data = requests.get(url, headers=headers, proxies=proxies) - 每次请求随机从代理池选取,避免顺序轮用的规律被识别。
处理Rate Limit状态码:当收到429响应时,采用指数退避策略重试,比如第一次等5秒,第二次10秒,第三次20秒,直到请求成功,同时暂时禁用当前IP/UA。
模拟真实浏览器行为:如果
requests效果不佳,改用selenium或playwright模拟浏览器操作,配合随机UA、代理和动作间隔(比如滚动页面、随机延迟),更难被反爬机制识别。
内容的提问来源于stack exchange,提问作者MVS99
相关产品推荐
相关产品推荐

