为何浏览器可访问Quizlet接口,JS/Python代码请求却返回403错误
问题根因
你遇到的403错误是Quizlet接入的Cloudflare反爬虫防护拦截导致的,该防护会识别请求发起端的特征,只有符合真实浏览器特征的请求才会放行,和你携带的固定Header、Cookie没有直接关系:
- 无痕模式能正常访问,是因为你用的是真实Chrome浏览器,请求的TLS指纹、HTTP2帧顺序、JS运行环境等特征完全符合Cloudflare的放行规则
- 用Burp内置浏览器访问被拦,是因为Burp代理会修改请求的TLS指纹,同时Cloudflare可识别到请求来自代理工具,直接触发拦截
- node-fetch、requests这类普通HTTP请求库的网络请求特征和真实浏览器差异极大,Cloudflare可直接识别拦截,你复制多少请求Header都没用,你代码里携带的Cookie也是抓包获取的临时有效Cookie,过期后完全失效
可行解决方案
方案1:使用带真实浏览器内核的请求工具(最稳定)
推荐用Playwright/Puppeteer这类自动化浏览器工具,调用真实Chromium内核发起请求,可直接绕过基础反爬。Python示例代码如下:
from playwright.sync_api import sync_playwright with sync_playwright() as p: browser = p.chromium.launch(headless=True) context = browser.new_context(user_agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.82 Safari/537.36") page = context.new_page() page.goto("https://quizlet.com/webapi/3.2/images/search?query=hello&perPage=2") # 直接获取接口返回的JSON数据 res = page.evaluate("() => document.body.innerText") print(res) browser.close()
方案2:使用专门绕过Cloudflare的HTTP库
Python生态下的cloudscraper库已经封装了Cloudflare基础验证的绕过逻辑,可直接替换requests使用,无需启动浏览器,性能更高:
import cloudscraper scraper = cloudscraper.create_scraper() params = {'query': 'hello', 'perPage': '2'} response = scraper.get('https://quizlet.com/webapi/3.2/images/search', params=params) print(response.status_code) print(response.json())
注意事项
- 不要短时间内发起高频请求,否则会触发Cloudflare的交互式验证码,此时需要额外接入打码服务才能继续访问
- 接口返回规则如果变动,需要及时调整请求逻辑
内容的提问来源于stack exchange,提问作者Duong Phan
相关产品推荐
相关产品推荐

