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

如何修改Selenium代码提取网页双表格并追加至CSV?遇超时错误求解决

解决Google Colab中Selenium爬取IPIndia网站超时及双表格数据提取追加问题

一、解决TimeoutException超时问题

超时多由页面加载缓慢、元素等待策略不合理或反爬机制触发导致,按以下方式调整:

  • 优化等待策略:放弃固定time.sleep(),改用Selenium显式等待,针对目标元素设置30-60秒的超时阈值,确保元素完全加载后再执行操作:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    
    # 等待黄色标记表格加载完成,超时60秒
    target_table = WebDriverWait(driver, 60).until(
        EC.presence_of_element_located((By.XPATH, "//table[contains(@style, 'background-color: yellow')]"))
    )
    
  • 调整Chrome启动参数:在Colab中运行无头Chrome时,添加优化参数减轻加载负担、规避自动化检测:

    from selenium.webdriver.chrome.options import Options
    
    chrome_options = Options()
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--disable-dev-shm-usage')
    chrome_options.add_argument('--disable-gpu')
    chrome_options.add_argument('--disable-images')  # 禁用图片加载加速
    chrome_options.add_argument('--blink-settings=imagesEnabled=false')
    chrome_options.add_argument('--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')
    chrome_options.add_argument('--disable-blink-features=AutomationControlled')  # 规避反爬检测
    chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
    chrome_options.add_experimental_option('useAutomationExtension', False)
    
  • 分阶段加载触发:若页面存在动态渲染内容,先等待主框架加载完成,再滚动到目标表格区域触发加载:

    # 等待页面主内容加载
    WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.TAG_NAME, 'body')))
    # 滚动到目标表格位置
    driver.execute_script("arguments[0].scrollIntoView();", target_table)
    

二、双表格数据提取与CSV追加

假设你已实现第一个表格的提取,针对黄色标记表格执行以下操作:

  1. 定位目标表格:通过表格的样式特征或层级路径定位,示例:

    # 定位已成功提取的第一个表格(根据实际页面调整定位规则)
    table1 = driver.find_element(By.XPATH, "//table[@id='existing-table-id']")
    # 定位黄色标记的第二个表格
    table2 = WebDriverWait(driver, 60).until(
        EC.presence_of_element_located((By.XPATH, "//table[contains(@style, 'background-color: yellow')]"))
    )
    
  2. 提取表格数据:遍历行和列,将数据转为结构化列表:

    def extract_table_data(table):
        rows = table.find_elements(By.TAG_NAME, 'tr')
        data = []
        for row in rows:
            cols = row.find_elements(By.TAG_NAME, 'td')
            row_data = [col.text.strip() for col in cols]
            if row_data:  # 跳过空行
                data.append(row_data)
        return data
    
    # 提取两个表格的数据
    table1_data = extract_table_data(table1)
    table2_data = extract_table_data(table2)
    
  3. 追加到现有CSV:使用pandas实现追加,避免重复写入表头:

    import pandas as pd
    
    # 将第二个表格数据转为DataFrame
    table2_df = pd.DataFrame(table2_data)
    # 追加到现有CSV,header=False表示不写入表头(若文件已有表头)
    table2_df.to_csv('asian_paints_data.csv', mode='a', header=False, index=False)
    

三、完整Colab代码示例

# 安装依赖
!pip install selenium chromedriver-autoinstaller pandas

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import chromedriver_autoinstaller
import pandas as pd

# 自动安装ChromeDriver
chromedriver_autoinstaller.install()

# 配置ChromeOptions
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_options.add_argument('--disable-gpu')
chrome_options.add_argument('--disable-images')
chrome_options.add_argument('--blink-settings=imagesEnabled=false')
chrome_options.add_argument('--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')
chrome_options.add_argument('--disable-blink-features=AutomationControlled')
chrome_options.add_experimental_option('excludeSwitches', ['enable-automation'])
chrome_options.add_experimental_option('useAutomationExtension', False)

# 启动浏览器并访问目标网站
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://ipindiaservices.gov.in/PublicSearch/')

# 执行搜索"ASIAN PAINTS"的步骤(根据实际页面元素ID调整)
search_box = WebDriverWait(driver, 30).until(EC.presence_of_element_located((By.ID, 'applicantName')))
search_box.send_keys('ASIAN PAINTS')
search_btn = driver.find_element(By.ID, 'btnSearch')
search_btn.click()

# 等待搜索结果页面加载
WebDriverWait(driver, 40).until(EC.presence_of_element_located((By.TAG_NAME, 'table')))

# 定义表格数据提取函数
def extract_table_data(table):
    rows = table.find_elements(By.TAG_NAME, 'tr')
    data = []
    for row in rows:
        cols = row.find_elements(By.TAG_NAME, 'td')
        row_data = [col.text.strip() for col in cols]
        if row_data:
            data.append(row_data)
    return data

# 提取第一个表格数据(你已实现的逻辑)
table1 = driver.find_element(By.XPATH, "//table[contains(@class, 'table-bordered')]")
table1_data = extract_table_data(table1)

# 提取黄色标记的第二个表格数据
table2 = WebDriverWait(driver, 60).until(
    EC.presence_of_element_located((By.XPATH, "//table[contains(@style, 'background-color: yellow')]"))
)
table2_data = extract_table_data(table2)

# 追加第二个表格数据到CSV
table2_df = pd.DataFrame(table2_data)
table2_df.to_csv('asian_paints_data.csv', mode='a', header=False, index=False)

# 关闭浏览器
driver.quit()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:46:16