如何使用Python requests.get跳过站点首次返回的加载页响应
可行解决方案
根据你遇到的场景,分两类情况给出可直接落地的解决方法:
场景1:站点仅做请求上下文校验(无JS渲染逻辑)
这种情况是站点首次返回加载页的同时会种下必要的校验Cookie/请求标识,只有同上下文的后续请求才会返回真实内容,使用requests的Session对象复用连接和上下文即可解决:
- 代码示例:
import requests # 初始化会话,自动维护Cookie、保持长连接 session = requests.Session() # 模拟浏览器请求头,可替换为你自己浏览器的对应请求头值 session.headers.update({ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2" }) # 第一次请求获取加载页,同时拿到站点要求的校验Cookie session.get(target.url) # 同一会话发起第二次请求,直接获取真实内容 resp = session.get(target.url) write_to_disk(resp.text)
如果是Cloudflare 5秒盾这类拦截场景,可以直接使用cloudscraper库替换原生requests,自动处理校验逻辑。
场景2:站点内容由前端JS动态渲染
如果第一次请求返回的加载页包含JS逻辑,需要浏览器执行JS、异步拉取接口数据后才会渲染真实内容,requests本身不支持JS执行,需要用无头浏览器模拟真实浏览器行为:
推荐使用Playwright实现,代码示例:
from playwright.sync_api import sync_playwright with sync_playwright() as p: # 启动无头模式的Chromium浏览器 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/118.0.0.0 Safari/537.36") # 访问目标地址,等待页面网络空闲(所有异步请求加载完成) page.goto(target.url, wait_until="networkidle") # 也可以指定等待真实内容对应的元素加载完成,按需替换为你要抓取内容的CSS选择器 # page.wait_for_selector("#real_content", timeout=10000) # 获取渲染完成的完整页面内容 full_content = page.content() write_to_disk(full_content) browser.close()
效率优化提示
可以通过浏览器F12控制台的网络面板,过滤XHR/fetch请求,查看真实内容对应的后端接口,直接调用接口拿结构化数据,比抓取页面解析效率高很多。
内容的提问来源于stack exchange,提问作者Hellconnon
相关产品推荐
相关产品推荐

