无法爬取JS动态加载数据的网站,求非Selenium解决方案
可行爬取方案
方案1:提取页面预加载的JSON数据
很多单页应用会把初始渲染所需的数据嵌入到HTML的<script>标签中(比如window.__INITIAL_STATE__、window.__NEXT_DATA__这类变量),你可以尝试:
- 用
requests获取原始HTML文档 - 用正则表达式匹配包含目标数据的script内容
- 提取JSON字符串并解析成Python字典
示例代码:
import requests import re import json url = "https://app.microacquire.com/startup/BoHpuALvJmNoNWkXY8qtxVMwTyO2/sy8mcXmDyu4LGyXADT11" response = requests.get(url) # 匹配可能的预加载数据,需根据实际页面源码调整正则 match = re.search(r'window\.__INITIAL_STATE__ = (.*?);\s*</script>', response.text, re.DOTALL) if match: raw_data = match.group(1) data = json.loads(raw_data) # 此处处理解析后的数据 print(data)
提示:打开页面源码,搜索root附近的script标签,确认数据存储的变量名,再调整正则表达式。
方案2:使用Playwright无头模式
Playwright是轻量级自动化工具,支持无头浏览器模式,部署到AWS(Lambda/EC2)的复杂度低于Selenium:
- 安装依赖:
pip install playwright,再运行playwright install chromium(可在部署脚本中自动执行) - 用无头模式加载页面,等待JS渲染完成后提取内容
示例代码:
from playwright.sync_api import sync_playwright url = "https://app.microacquire.com/startup/BoHpuALvJmNoNWkXY8qtxVMwTyO2/sy8mcXmDyu4LGyXADT11" with sync_playwright() as p: browser = p.chromium.launch(headless=True) page = browser.new_page() page.goto(url, wait_until="networkidle") # 等待网络空闲确保数据加载完成 root_content = page.inner_html("#root") # 也可直接提取特定元素内容,比如startup名称:page.text_content(".startup-name-selector") browser.close() print(root_content)
AWS部署提示:可使用Playwright官方Docker镜像,或在Lambda中使用预构建的Playwright层,避免手动安装浏览器依赖。
方案3:使用Pyppeteer
Pyppeteer是Python版的Puppeteer,基于Chrome DevTools协议,支持无头模式,适合轻量JS渲染页面爬取:
- 安装依赖:
pip install pyppeteer - 代码示例:
import asyncio from pyppeteer import launch async def scrape_page(): url = "https://app.microacquire.com/startup/BoHpuALvJmNoNWkXY8qtxVMwTyO2/sy8mcXmDyu4LGyXADT11" browser = await launch(headless=True) page = await browser.newPage() await page.goto(url, waitUntil="networkidle2") root_content = await page.querySelectorEval("#root", "(element) => element.innerHTML") await browser.close() print(root_content) asyncio.get_event_loop().run_until_complete(scrape_page())
内容的提问来源于stack exchange,提问作者saharsh solanki
相关产品推荐
相关产品推荐

