Python BeautifulSoup html.parser解析网页无法获取实际页面数据
问题根因
你拿不到数据是因为目标站点是JS动态渲染的单页应用。requests只能请求到服务器返回的初始静态HTML文件,这部分内容只有页面基础骨架,你看到的最新成交列表数据,是浏览器加载完HTML之后,执行前端JavaScript代码、向后端接口异步拉取数据再填充到页面里的。你现在拿到的soup里根本没有渲染后的交易数据节点,当然调用find方法匹配不到目标内容。
可行解决方法
优先选:直接调用后端数据接口
这是效率最高的方案,不需要加载整个页面的静态资源、也不用跑浏览器环境。操作步骤:- 打开目标网页,按F12调出开发者工具,切换到「网络」面板,筛选
Fetch/XHR类型的请求 - 刷新页面,在请求列表里找返回成交数据的接口,一般接口响应是JSON格式,能直接看到价格、交易时间、交易双方这些字段
- 直接用
requests请求这个接口,带上必要的请求头(至少要加正常的User-Agent和Referer,避免被反爬策略拦截),拿到JSON数据后直接结构化处理,不需要解析HTML,最后用pandas导出成CSV即可。
基础代码框架:
import requests import pandas as pd # 替换成你在开发者工具里找到的实际数据接口地址 api_url = "你的接口地址" headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36", "Referer": "https://www.fancraze.com/marketplace/sales/mornemorkel1?tab=latest-sales" } resp = requests.get(api_url, headers=headers) resp.raise_for_status() sale_data = resp.json() # 根据接口实际返回的结构提取需要的字段,组装成DataFrame df = pd.DataFrame(sale_data["data"]["list"]) # 导出CSV,用utf-8-sig编码避免中文乱码 df.to_csv("latest_sales.csv", index=False, encoding="utf-8-sig")- 打开目标网页,按F12调出开发者工具,切换到「网络」面板,筛选
备选方案:用自动化工具获取渲染后的页面源码
如果你不想花时间找接口,可以用支持JS渲染的工具模拟浏览器加载页面,等数据全部渲染完成后再拿源码给BeautifulSoup解析。常用的工具是playwright,比selenium配置更简单:- 先安装依赖:
pip install playwright pandas beautifulsoup4,然后执行playwright install chromium下载浏览器内核 - 参考代码:
from bs4 import BeautifulSoup from playwright.sync_api import sync_playwright import pandas as pd target_url = "https://www.fancraze.com/marketplace/sales/mornemorkel1?tab=latest-sales" with sync_playwright() as p: # headless=True代表无界面运行,不需要弹出浏览器窗口 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/126.0.0.0 Safari/537.36") page.goto(target_url) # 等待成交列表的元素加载完成,选择器替换成你实际要找的列表元素的class或标签 page.wait_for_selector(".sale-record-item", timeout=15000) # 拿到JS渲染完成后的完整页面HTML page_html = page.content() browser.close() soup = BeautifulSoup(page_html, "html.parser") # 这时候再调用find/find_all就能正常匹配到列表数据了 sale_records = soup.find_all("div", class_="sale-record-item") # 后续自行提取字段、转成DataFrame导出CSV即可- 先安装依赖:
提示:爬取前请先确认站点的robots规则和数据使用条款,不要违规抓取受版权保护的内容。
内容的提问来源于stack exchange,提问作者showd
相关产品推荐
相关产品推荐

