更新因JavaScript拦截失效的Python网页爬虫
NYTimes爬虫应对JS验证的轻量解决方案
一、高频调用下无需渲染JS的轻量方案
1. 挖掘隐藏API
很多新闻站点会为移动端APP、小程序提供无验证的内容接口,直接返回结构化JSON数据(包含完整文章内容)。你可以通过以下方式获取:
- 用抓包工具监控NYTimes官方APP的网络请求,过滤出返回文章内容的接口;
- 切换浏览器的移动端模拟器,查看Network面板中的XHR/Fetch请求,寻找返回完整文章数据的接口。
这类接口无需处理JS验证,直接用requests请求即可,效率远高于渲染JS。
2. 优化请求头与请求行为
如果找不到隐藏API,可通过模拟真实人类请求绕过基础JS验证:
- 完善请求头:使用最新版浏览器的
User-Agent,补充Accept、Accept-Language、Referer、Cookie(手动登录NYTimes后提取有效Cookie,用requests.Session保持会话); - 控制请求频率:添加1-3秒的随机延迟,避免固定间隔请求;用代理池轮换IP,防止因高频请求被标记;
- 尝试搜索引擎爬虫UA:使用Googlebot、Bingbot的UA(如
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)),部分站点会对搜索引擎爬虫开放无验证内容,但注意不要过度使用。
二、轻量JS渲染库推荐与实现方法
如果上述方案不可行,推荐以下资源占用低的JS渲染工具,适配轻量服务器:
1. Playwright(轻量配置版)
Playwright支持无头模式,通过资源拦截可大幅降低内存占用:
- 安装:
pip install playwright,再执行playwright install chromium(仅安装轻量Chromium内核); - 核心优化配置:启用无头模式、拦截非必要资源(图片、视频、CSS)、复用浏览器实例;
- 代码示例:
from playwright.sync_api import sync_playwright def fetch_nytimes_article(url): with sync_playwright() as p: browser = p.chromium.launch(headless=True, args=["--disable-gpu", "--no-sandbox"]) context = browser.new_context(viewport={"width": 1920, "height": 1080}) page = context.new_page() # 拦截非必要资源 page.route("**/*.{png,jpg,jpeg,css,mp4}", lambda route: route.abort()) page.goto(url, wait_until="domcontentloaded") page.wait_for_selector("article") content = page.inner_html("article") browser.close() return content
2. requests-html(轻量替代,虽已停更但仍可用)
requests-html基于Pyppeteer,封装简洁,资源占用低于完整Puppeteer:
- 安装:
pip install requests-html; - 代码示例:
from requests_html import HTMLSession session = HTMLSession() r = session.get(url) # 渲染JS(仅加载必要内容) r.html.render(scrolldown=0, sleep=1, timeout=10, keep_page=False) content = r.html.find("article", first=True).html session.close()
关键优化点
- 复用浏览器会话:不要每次请求都创建新的浏览器实例,通过全局变量或会话池保持实例复用;
- 限制并发数:轻量服务器建议控制并发在2-5以内,避免内存过载;
- 禁用不必要的浏览器特性:如GPU加速、沙箱模式(
--no-sandbox),进一步降低资源占用。
内容的提问来源于stack exchange,提问作者jay queue
相关产品推荐
相关产品推荐

