如何抓取目标网站异步请求的API响应并嗅探网络流量?
抓取异步加载内容的解决方案
方法1:用Playwright模拟真实浏览器(最贴合你的需求)
这个工具会启动真实浏览器,自动等待页面异步请求完成,还能捕获所有网络请求。步骤如下:
- 先安装依赖:
pip install playwright,然后运行playwright install安装对应浏览器 - 示例代码:
from playwright.sync_api import sync_playwright from bs4 import BeautifulSoup with sync_playwright() as p: # 启动浏览器,headless=True可切换为后台运行 browser = p.chromium.launch(headless=False) page = browser.new_page() # 监听所有XHR/Fetch类型的异步请求 captured_requests = [] def record_request(request): if request.resource_type in ("xhr", "fetch"): captured_requests.append(request.url) page.on("request", record_request) # 打开目标页面,等待网络空闲(500ms内无新请求即停止等待) page.goto("http://target.tld", wait_until="networkidle") # 也可手动等待固定时长:page.wait_for_timeout(10000) # 等待10秒 # 打印捕获到的异步请求URL for url in captured_requests: print(url) # 获取包含异步加载内容的页面源码,用BeautifulSoup解析 final_html = page.content() soup = BeautifulSoup(final_html, "html.parser") browser.close()
方法2:直接调用后端API接口(效率更高)
如果能找到异步加载内容的接口,直接调用接口比模拟浏览器更高效:
- 打开浏览器开发者工具(F12),切换到「网络」标签后刷新页面
- 筛选XHR/Fetch类型的请求,定位到加载目标内容的接口
- 用
requests直接调用该接口,示例代码:
import requests # 替换为你找到的真实API地址 api_url = "http://api.target.tld/get-data" # 请求头从浏览器网络请求中复制,比如User-Agent、Cookie、Referer等 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", "Referer": "http://target.tld" } response = requests.get(api_url, headers=headers) # 如果返回JSON格式数据,直接解析处理 data = response.json()
方法3:用Selenium捕获网络请求
和Playwright原理类似,通过模拟浏览器实现请求捕获,示例代码:
from selenium import webdriver from selenium.webdriver.chrome.options import Options from bs4 import BeautifulSoup options = Options() options.add_experimental_option("excludeSwitches", ["enable-logging"]) driver = webdriver.Chrome(options=options) # 开启网络日志捕获 driver.execute_cdp_cmd("Network.enable", {}) captured_requests = [] def log_response(event): if "response" in event: url = event["response"]["url"] # 过滤目标API域名 if "api.target.tld" in url: captured_requests.append(url) driver.execute_cdp_cmd("Network.responseReceived", log_response) driver.get("http://target.tld") # 等待10秒让异步请求完成 driver.implicitly_wait(10) for url in captured_requests: print(url) final_html = driver.page_source soup = BeautifulSoup(final_html, "html.parser") driver.quit()
注意点
- 多数网站有反爬机制,需设置合理请求头,避免短时间内频繁请求
- 若目标内容需要登录权限,Playwright/Selenium可模拟登录流程,
requests则需携带登录后的Cookie
内容的提问来源于stack exchange,提问作者Mr. B.
相关产品推荐
相关产品推荐

