如何自动抓取不定期更新网站的表格?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]') ) )
二、新增数据自动抓取实现
可以采用定时轮询+数据对比的方案,实现新增数据自动捕获:
- 先抓取初始表格数据,存入集合或数据库
- 每隔固定时间重新抓取当前表格数据
- 对比新、旧数据,提取新增条目并处理
示例代码片段:
# 存储已抓取的数据(用集合去重) 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
相关产品推荐
相关产品推荐

