Python脚本爬取路透社文章遭遇HTTP 401错误求助
解决路透社爬虫401问题的方案
核心原因分析
路透社近期升级了反爬机制,不再接受普通HTTP请求(即使补全请求头),而是要求请求来自能执行JavaScript的真实浏览器环境,同时会检测广告拦截工具特征,你的脚本被识别为非合法请求,因此返回401状态码。
具体解决步骤
- 改用JS渲染工具:放弃直接用
requests发送请求,换成playwright或selenium模拟真实浏览器,它们能自动执行页面JS,绕过这类环境检测。推荐playwright,配置更简单且自带浏览器驱动。 - 模拟真实浏览器指纹:即使使用渲染工具,也要确保请求头、浏览器参数和真实用户一致。比如设置最新的user-agent,禁用
webdriver标识(避免被识别为爬虫)。 - 规避广告拦截检测:模拟浏览器时不要加载广告拦截扩展,同时可以通过脚本禁用页面的广告拦截检测逻辑。
- 控制请求频率:如果请求过于频繁,IP可能被临时封锁,建议每次请求后加10-30秒的随机延迟,必要时使用代理IP轮换。
示例代码(Playwright版本)
from playwright.sync_api import sync_playwright import time import random def get_reuters_html(url): with sync_playwright() as p: # 启动无头Chrome,模拟真实浏览器 browser = p.chromium.launch(headless=True) page = browser.new_page( user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36" ) # 隐藏webdriver标识,避免被检测 page.add_init_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})") # 禁用页面的广告拦截检测(部分网站会通过JS检查) page.add_init_script("window.__adblock = false;") # 访问页面,等待网络空闲后再获取内容 page.goto(url, wait_until="networkidle") # 随机延迟,模拟用户阅读行为 time.sleep(random.randint(5, 10)) html_content = page.content() browser.close() return html_content # 使用示例 target_url = "https://www.reuters.com/articles/your-target-article" article_html = get_reuters_html(target_url) # 后续可以继续处理HTML内容,传给AWS Polly
注意事项
- 安装依赖:先执行
pip install playwright,再运行playwright install chromium安装浏览器。 - 定期更新user-agent:可以从浏览器开发者工具复制最新的user-agent字符串,避免因版本过旧被拦截。
- 若遇到Cloudflare人机验证:这种情况需要额外处理,比如使用支持验证码自动识别的服务,或者手动验证一次后保存cookie复用。
内容的提问来源于stack exchange,提问作者ttffkk
相关产品推荐
相关产品推荐

