Python爬虫遭遇Service Worker页面,如何获取目标网页响应?
解决requests爬取返回Service Worker安装页面的问题
你用requests.get请求目标URL时,返回的始终是Service Worker安装页面,哪怕加了请求头也没用。从你提供的页面代码能看出,这个网站的逻辑是:首次访问(不管请求哪个资源)都会返回这个安装页面,页面里的JS会注册Service Worker,然后自动刷新页面,这时候网站才会返回真实内容。
但requests是纯HTTP请求工具,不会执行JS,也没有浏览器的Service Worker环境,所以网站一直判定你是首次访问,反复返回安装页面。下面给两种解决方法:
方法一:用支持JS渲染的工具模拟浏览器访问
这是最靠谱的方案,因为只有真实浏览器环境能完成Service Worker的注册流程,让网站认为你已经完成首次访问。比如用Playwright:
- 先安装Playwright和浏览器驱动:
pip install playwright playwright install chromium
- 编写代码:
from playwright.sync_api import sync_playwright with sync_playwright() as p: # 启动无头浏览器(要可视化可加headless=False) browser = p.chromium.launch(headless=True) page = browser.new_page() # 访问目标URL page.goto(base_url) # 等待页面加载完成(networkidle表示网络请求基本停止) page.wait_for_load_state("networkidle") # 获取页面内容 content = page.content() print(content) browser.close()
Playwright会自动执行页面里的JS,完成Service Worker注册,页面刷新后就能拿到真实的目标内容。
方法二:模拟已完成注册的请求状态
网站可能用Cookie来标记用户是否已经完成Service Worker注册,你可以试试从浏览器里复制Cookie带到requests请求中:
- 打开Chrome/Firefox,访问目标URL,等页面加载完成后按F12打开开发者工具;
- 切换到「Application」标签,找到「Cookies」,复制所有Cookie的键值对,拼成Cookie字符串;
- 在requests请求中带上Cookie和完整的浏览器请求头:
headers = { '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', 'Cookie': '这里填你从浏览器复制的Cookie字符串' } response = requests.get(base_url, headers=headers) if response.status_code == 200: content = response.content.decode('utf-8') print(content)
这种方法的缺点是Cookie可能过期,或者网站还有其他验证逻辑(比如SessionStorage的标记),不一定能长期生效。
内容的提问来源于stack exchange,提问作者QQmian
相关产品推荐
相关产品推荐

