使用Python/requests爬取时遭遇403 Forbidden问题求助
解决requests.Session()请求返回403 Forbidden的问题
几个可尝试的修复点
1. 删除多余的请求头字段
你手动添加了authority、path、scheme、method这些字段,其实requests库会自动处理这些内容,硬塞进去反而容易被服务器判定为异常请求,直接删掉即可。
2. 避免重复传递参数
你在URL里已经拼接了page={i},同时又通过params传递path参数,这可能导致请求参数混乱。先查看浏览器中实际请求的参数结构,再决定是否保留params。
3. 检查Cookie有效性
你复制的Cookie可能已过期,或者其中的会话ID与当前Session不兼容。建议:
- 重新从浏览器获取最新的Cookie(注意不要包含过期的会话标识)
- 让Session自动管理Cookie:先请求一次首页,让服务器返回新的会话Cookie,后续请求复用该Session即可,无需手动设置Cookie。
4. 放慢请求速度
虽然你设置了0.25秒等待,但可以延长到1-2秒,避免触发频率限制。另外,首次请求可先访问首页,模拟真实用户的访问流程。
修复后的示例代码
import requests import time session = requests.Session() # 先访问首页获取有效会话Cookie session.get('https://www.arrow.com/en') headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36', 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7', 'accept-encoding': 'gzip, deflate, br', 'accept-language': 'en-US,en;q=0.9', 'cache-control': 'max-age=0', 'sec-ch-ua': '"Chromium";v="112", "Google Chrome";v="112", "Not:A-Brand";v="99"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'sec-fetch-dest': 'document', 'sec-fetch-mode': 'navigate', 'sec-fetch-site': 'none', 'sec-fetch-user': '?1', 'upgrade-insecure-requests': '1' } for i in range(1, 401): url = f'https://www.arrow.com/en/categories/capacitors/fixed-capacitors/capacitor-ceramic-multilayer?page={i}' response = session.get(url, headers=headers) print(url) print(response.status_code) # 可打印部分响应内容确认是否正常 # print(response.text[:500]) time.sleep(1) # 测试第一页的话保留break,正式爬取时删除 # break
其他解决方向
如果以上方法都无效,大概率是服务器使用了Cloudflare这类反爬机制,此时可以尝试cfscrape库,或者直接用Selenium模拟真实浏览器操作。另外,不要一次性爬取400页,分批次进行并设置随机间隔,降低被封禁的风险。
内容的提问来源于stack exchange,提问作者Vladislav
相关产品推荐
相关产品推荐

