如何修改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追加
假设你已实现第一个表格的提取,针对黄色标记表格执行以下操作:
定位目标表格:通过表格的样式特征或层级路径定位,示例:
# 定位已成功提取的第一个表格(根据实际页面调整定位规则) 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')]")) )提取表格数据:遍历行和列,将数据转为结构化列表:
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)追加到现有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
相关产品推荐
相关产品推荐

