网页爬取返回空DataFrame问题求助(附运行代码)
问题诊断与解决方案
你的代码执行无报错但DataFrame为空,核心原因是目标网站的产品列表是通过JavaScript动态渲染的:
requests.get()只能获取页面的静态HTML源码,而该网站的产品数据是页面加载完成后,通过异步请求从后端拉取并渲染到页面上的,所以静态HTML里根本不存在.product-name类的元素。- 因此
soup.select(".product-name")返回空列表,最终生成的DataFrame自然没有数据。
解决方法
方法一:用Selenium模拟浏览器加载动态内容(适合新手)
Selenium会模拟真实浏览器打开页面,等待JS渲染完成后再抓取内容:
- 先安装依赖:
pip install selenium webdriver-manager
- 替换原代码的核心部分:
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接口,直接请求接口获取数据(不需要启动浏览器):
- 打开目标页面,按F12打开开发者工具,切换到「Network」标签。
- 刷新页面,在「XHR」或「Fetch」分类下,找到返回产品列表的请求(通常URL包含
product或catalog关键词)。 - 复制该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
相关产品推荐
相关产品推荐

