添加Chrome开发者工具获取的请求头后Python Requests仍返回403错误,请求访问指定Phosphosite URL的可行方案
解决Cloudflare拦截下Python访问目标站点的问题
遇到Cloudflare拦截导致403是很常见的情况——毕竟单纯复制Chrome的请求头远远不够,Cloudflare的反爬机制会检查更多维度的信息:比如JavaScript执行能力、浏览器指纹、动态生成的验证Cookie,甚至请求时序这些细节。
直接用Requests库可行吗?
理论上可以,但手动模拟Cloudflare的验证流程难度极高:你需要解析Cloudflare的挑战页面、执行其中的JavaScript生成验证参数、处理Cookie的动态更新,而且Cloudflare的验证规则会频繁升级,刚写好的逻辑可能很快就失效。所以不推荐直接用原生Requests硬刚,性价比太低。
可行的替代方案
这里给你两个实用的解决思路:
1. 使用专门的Cloudflare绕过库:cloudscraper
这个库是对Requests的封装,内部会自动模拟浏览器执行Cloudflare的验证逻辑,用法和Requests几乎一致,上手成本很低。
首先安装依赖:
pip install cloudscraper
然后修改你的代码:
from bs4 import BeautifulSoup import cloudscraper url = 'https://www.phosphosite.org/proteinAction.action?id=5848&showAllSites=true' # 创建一个模拟浏览器的scraper实例 scraper = cloudscraper.create_scraper() result = scraper.get(url) print(result.status_code) # 正常情况下应该返回200,接下来就可以用BeautifulSoup解析内容了 soup = BeautifulSoup(result.text, 'html.parser')
2. 使用真实浏览器模拟工具:Playwright/Selenium
如果cloudscraper失效(比如Cloudflare升级了防护),用真实浏览器模拟是最稳妥的方案——它完全模拟人类操作浏览器的行为,能绕过几乎所有基于JS的反爬验证。这里以Playwright为例(比Selenium更轻量、API更友好):
首先安装依赖和浏览器:
pip install playwright playwright install chromium
然后编写代码:
from bs4 import BeautifulSoup from playwright.sync_api import sync_playwright with sync_playwright() as p: # 启动无头浏览器(headless=False可以打开可视化窗口查看过程) browser = p.chromium.launch(headless=True) page = browser.new_page() # 访问目标页面,Playwright会自动处理Cloudflare的验证 page.goto(url) # 等待页面核心内容加载完成(这里可以根据页面实际元素调整等待条件) page.wait_for_selector('body') # 获取页面HTML html = page.content() browser.close() # 解析页面内容 soup = BeautifulSoup(html, 'html.parser')
注意事项
- 无论用哪种方法,都要严格遵守目标站点的
robots.txt和使用条款,控制请求频率,避免给服务器造成不必要的压力。 - Cloudflare的防护策略会动态调整,如果某一种方案失效,可以尝试切换另一种。
内容的提问来源于stack exchange,提问作者dkh32




