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

求助:使用BeautifulSoup与Puppeteer爬取网站表格返回空结果

爬取Bechtle商品页面"technical-table"表格失败的问题分析与解决建议

问题核心

你需要爬取页面https://www.bechtle.com/shop/lenovo-thinkpad-thunderbolt-3-dock-gen2--4310627--p中class为technical-table的表格,但当前Python/Node.js代码均返回空结果,仅Chrome控制台JS能成功获取。

现有代码问题分析

Python(BeautifulSoup)

  1. 选择器错误:代码中查找的是class="headline-container"的表格,而非目标的technical-table;
  2. 静态请求局限性:requests.get仅获取页面初始静态HTML,若表格是通过JavaScript动态渲染(比如AJAX加载后生成),静态爬取自然无法获取。

Node.js(Puppeteer)

  1. 选择器错误:使用#menu1 > div > table作为选择器,与目标technical-table不符;
  2. 返回值处理不当:page.evaluate中直接返回DOM元素会被序列化丢失,需返回可提取的文本/HTML;
  3. 未等待元素加载:页面跳转后未等待表格渲染完成就执行提取;
  4. 函数无返回值:scrape函数未返回page.evaluate的结果,导致后续then中value为undefined。

解决方案

先确认内容加载方式

打开页面后按Ctrl+U查看源码,搜索technical-table:

  • 若存在:说明是静态内容,只需修正选择器;
  • 若不存在:说明是动态加载,需用浏览器渲染工具或直接抓取数据接口。

Python 修复方案

方案1:用Selenium模拟浏览器渲染(适合动态内容)

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

url = 'https://www.bechtle.com/shop/lenovo-thinkpad-thunderbolt-3-dock-gen2--4310627--p'
driver = webdriver.Chrome()
driver.get(url)

# 等待表格加载完成(最长等待10秒)
table = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.CLASS_NAME, "technical-table"))
)

# 提取结构化表格数据
rows = table.find_elements(By.TAG_NAME, "tr")
table_data = []
for row in rows:
    cells = row.find_elements(By.TAG_NAME, ["td", "th"])
    table_data.append([cell.text.strip() for cell in cells])

print(table_data)
driver.quit()

方案2:抓取数据接口(效率更高)

打开Chrome开发者工具(F12)→ Network面板,刷新页面后筛选XHR/Fetch请求,找到返回表格数据的接口,直接用requests请求该接口获取JSON数据。

Node.js(Puppeteer)修复方案

const puppeteer = require('puppeteer');

let scrape = async () => {
    const browser = await puppeteer.launch({ 
        headless: "new", 
        args: ['--no-sandbox'] // 避免部分环境的无头检测
    });
    const page = await browser.newPage();
    
    // 设置浏览器UA,模拟真实请求
    await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36');
    
    // 等待页面加载完成(networkidle2表示网络请求基本停止)
    await page.goto('https://www.bechtle.com/shop/lenovo-thinkpad-thunderbolt-3-dock-gen2--4310627--p', { waitUntil: 'networkidle2' });

    // 等待目标表格出现
    await page.waitForSelector('.technical-table', { timeout: 10000 });

    // 提取结构化表格数据
    const tableData = await page.evaluate(() => {
        const table = document.querySelector('.technical-table');
        const rows = Array.from(table.querySelectorAll('tr'));
        return rows.map(row => Array.from(row.querySelectorAll('td, th')).map(cell => cell.textContent.trim()));
    });

    await browser.close();
    return tableData;
};

scrape()
.then(data => console.log(data))
.catch(err => console.error('爬取失败:', err));

额外注意事项

  • 反爬规避:部分网站会检测无头浏览器或异常请求头,可给Puppeteer添加--disable-blink-features=AutomationControlled参数,或使用puppeteer-extra-plugin-stealth插件隐藏自动化痕迹;
  • 选择器验证:在Chrome控制台用document.querySelector('.technical-table')确认选择器有效性,避免拼写错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 13:21:15