抓取数据遇403错误cloudscraper失效,有什么可行解决办法?
403错误绕过解决方案
你遇到的403错误是站点启用了Cloudflare反爬防护导致的,返回的英文拦截页翻译为:该网站正在使用安全服务保护自身免受网络攻击。
1 修正现有代码错误
你提供的cloudscraper版本代码存在导入调用不匹配问题:导入的是cloudscraper,调用时却用了cfscrape,首先修正为如下代码,同时补充完整请求头字段降低被识别概率:
import cloudscraper headers = { 'accept': 'application/json', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36', 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8', 'referer': 'https://www.brownsfashion.com/', 'sec-ch-ua': '"Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99"', 'sec-ch-ua-mobile': '?0', 'sec-ch-ua-platform': '"Windows"', 'sec-fetch-dest': 'empty', 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'same-origin' } scraper = cloudscraper.create_scraper(delay=10, browser={'browser': 'chrome', 'platform': 'windows', 'mobile': False}) url = 'https://www.brownsfashion.com/api/listing' r = scraper.get(url, headers=headers) print(r.text)
如果修正后仍然返回403,按以下方案依次尝试:
2 使用curl_cffi伪装TLS指纹
Cloudflare会校验请求的TLS JA3指纹,常规请求库的指纹特征明显容易被拦截,curl_cffi可以模拟真实浏览器的TLS指纹,绕过指纹校验:
from curl_cffi import requests headers = { 'accept': 'application/json', 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36', 'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8', 'referer': 'https://www.brownsfashion.com/', } r = requests.get('https://www.brownsfashion.com/api/listing', headers=headers, impersonate='chrome124') print(r.text)
3 使用带隐身能力的无头浏览器
如果上述接口请求的方式均无法绕过,直接使用Playwright模拟真实用户访问,会自动处理Cloudflare的JS校验、cookie生成、人机验证逻辑:
from playwright.sync_api import sync_playwright with sync_playwright() as p: # 调试阶段可以将headless改为False,直观看到校验过程 browser = p.chromium.launch(headless=True) context = browser.new_context(user_agent='Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36') page = context.new_page() page.goto('https://www.brownsfashion.com/') # 等待页面安全校验完成 page.wait_for_load_state('networkidle') # 调用目标接口 api_response = page.request.get('https://www.brownsfashion.com/api/listing', headers={ 'accept': 'application/json' }) print(api_response.text()) browser.close()
注意:请控制请求频率,避免高频访问被站点封禁IP。
内容的提问来源于stack exchange,提问作者strugglecity
相关产品推荐
相关产品推荐

