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

如何自动抓取不定期更新网站的表格?Selenium使用问题求助

问题描述

我需要抓取某网站的表格数据,希望能在表格新增数据时自动抓取,避免手动操作导致数据遗漏。另外遇到一个Selenium使用问题:

  • 直接调用 driver.find_elements_by_xpath 无返回结果
  • 使用 WebDriverWait(driver, 100).until(EC.presence_of_all_elements_located()) 却能正常获取元素

以下是我的代码:

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

website = "https://play.pakakumi.com/"
path = r'D:\chromedriver_win32\chromedriver.exe'
driver = webdriver.Chrome(path)
driver.get(website)

page = driver.page_source
soup = BeautifulSoup(page, 'html.parser')

'''
k =driver.find_elements_by_xpath('/html/body/div/div[2]/div[2]/div/div[1]/div/div[3]/div/div[2]/div/table/tbody/tr/td[1]')

for item in k:
    print(item.text)
'''
foo = WebDriverWait(driver, 100).until(EC.presence_of_all_elements_located((By.XPATH, '/html/body/div/div[2]/div[2]/div/div[1]/div/div[3]/div/div[2]/div/table/tbody/tr/td[1]')))
for b in foo:
    print(b.text)
#print(foo)
解决方案

一、Selenium元素定位问题分析

直接调用driver.find_elements_by_xpath无结果的核心原因是页面元素异步加载:

  • 执行driver.get(website)后,浏览器仅完成页面框架加载,表格这类动态渲染的元素尚未生成
  • 此时直接触发元素查找,自然无法定位到目标节点
  • WebDriverWait结合EC.presence_of_all_elements_located会等待指定元素全部加载完成后再返回,因此能正常获取结果

建议后续所有动态元素查找都使用显式等待,避免依赖time.sleep()这类不稳定的等待方式。另外,你使用的绝对XPath路径过长,易因页面结构微调失效,推荐改用更稳定的相对定位,示例:

foo = WebDriverWait(driver, 100).until(
    EC.presence_of_all_elements_located(
        # 假设表格有标识性class,用相对路径定位
        (By.XPATH, '//table[contains(@class,"target-table")]/tbody/tr/td[1]')
    )
)

二、新增数据自动抓取实现

可以采用定时轮询+数据对比的方案,实现新增数据自动捕获:

  1. 先抓取初始表格数据,存入集合或数据库
  2. 每隔固定时间重新抓取当前表格数据
  3. 对比新、旧数据,提取新增条目并处理

示例代码片段:

# 存储已抓取的数据(用集合去重)
existing_data = set()

# 初始抓取数据
foo = WebDriverWait(driver, 100).until(
    EC.presence_of_all_elements_located((By.XPATH, '/html/body/div/div[2]/div[2]/div/div[1]/div/div[3]/div/div[2]/div/table/tbody/tr/td[1]'))
)
for b in foo:
    existing_data.add(b.text)
    print(b.text)

# 定时轮询检查新增数据
while True:
    time.sleep(10)  # 每隔10秒检查一次,可根据需求调整
    # 重新抓取当前表格数据
    current_items = WebDriverWait(driver, 20).until(
        EC.presence_of_all_elements_located((By.XPATH, '/html/body/div/div[2]/div[2]/div/div[1]/div/div[3]/div/div[2]/div/table/tbody/tr/td[1]'))
    )
    # 对比并输出新增数据
    for item in current_items:
        text = item.text
        if text not in existing_data:
            print(f"新增数据:{text}")
            existing_data.add(text)

若目标网站采用WebSocket实时推送数据,可通过监听网络请求实现更高效的实时抓取,但实现复杂度较高,定时轮询是更易上手的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 13:05:19