You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

网页爬取返回空DataFrame问题求助(附运行代码)

问题诊断与解决方案

你的代码执行无报错但DataFrame为空,核心原因是目标网站的产品列表是通过JavaScript动态渲染的:

  • requests.get()只能获取页面的静态HTML源码,而该网站的产品数据是页面加载完成后,通过异步请求从后端拉取并渲染到页面上的,所以静态HTML里根本不存在.product-name类的元素。
  • 因此soup.select(".product-name")返回空列表,最终生成的DataFrame自然没有数据。

解决方法

方法一:用Selenium模拟浏览器加载动态内容(适合新手)

Selenium会模拟真实浏览器打开页面,等待JS渲染完成后再抓取内容:

  1. 先安装依赖:
pip install selenium webdriver-manager
  1. 替换原代码的核心部分:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup
import pandas as pd

url = "https://www.thestudio.com/product-catalog/"

# 初始化Chrome浏览器(自动下载对应驱动)
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get(url)

# 隐式等待10秒,确保页面动态内容加载完成
driver.implicitly_wait(10)

# 获取渲染后的页面源码
page_source = driver.page_source
# 关闭浏览器
driver.quit()

# 解析页面并提取产品名称
soup = BeautifulSoup(page_source, "html.parser")
product_names = [item.text.strip() for item in soup.select(".product-name")]

# 生成DataFrame并保存
df = pd.DataFrame({"Product Names": product_names})
df.to_excel("product_catalog.xlsx", index=False)

# 验证结果
print(df)

方法二:直接调用后端API(效率更高)

通过浏览器开发者工具找到网站加载产品的API接口,直接请求接口获取数据(不需要启动浏览器):

  1. 打开目标页面,按F12打开开发者工具,切换到「Network」标签。
  2. 刷新页面,在「XHR」或「Fetch」分类下,找到返回产品列表的请求(通常URL包含product或catalog关键词)。
  3. 复制该API的URL,用requests直接请求,拿到JSON数据后转成DataFrame。

示例代码(假设找到的API为https://www.thestudio.com/api/products,实际需以开发者工具中看到的为准):

import requests
import pandas as pd

api_url = "https://www.thestudio.com/api/products"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36"
}

response = requests.get(api_url, headers=headers)
if response.status_code == 200:
    # 假设返回的JSON是包含产品列表的数组,每个元素有name字段
    products = response.json()
    product_names = [item["name"] for item in products]
    df = pd.DataFrame({"Product Names": product_names})
    df.to_excel("product_catalog.xlsx", index=False)
    print(df)
else:
    print("请求API失败,状态码:", response.status_code)

排查技巧

以后遇到类似问题,先右键页面→「查看页面源代码」,搜索目标选择器(比如.product-name),如果找不到,基本可以确定是动态加载问题。

内容的提问来源于stack exchange,提问作者Olumide Olaoye

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 12:07:36