无法抓取JS动态生成的多页网页表格数据,请求技术支援
问题:动态加载多页表格抓取失败,导出空CSV文件
尝试抓取https://admissions.nic.in/admiss/admissions/orcrjacd/105012321的JavaScript动态生成多页表格数据,使用Selenium+ChromeDriver编写代码后,仅导出含“S.No.”的空文件;抓包方法在此网址也失效,无法获取有效数据。
问题根源
- 原代码仅等待表格元素存在,但表格可能已渲染但数据未加载完成,或页面存在多个无关表格(比如空表头表格),导致抓取了错误的表格。
- 未处理分页逻辑,仅抓取了初始页面(甚至是空状态)的内容,没有遍历所有分页数据。
修正后的解决方案代码
from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import pandas as pd from selenium.common.exceptions import TimeoutException, ElementClickInterceptedException def scrape_table(url): service = Service('chromedriver.exe') # 确保路径与本地ChromeDriver一致 driver = webdriver.Chrome(service=service) driver.get(url) dfs = [] while True: try: # 等待表格数据行加载(定位非表头的有效数据行) WebDriverWait(driver, 30).until( EC.presence_of_element_located((By.XPATH, "//table//tr[td and not(contains(@style, 'background-color:#ccc'))]")) ) # 精准定位目标数据表格,避免抓取无关表格 target_table = driver.find_element(By.XPATH, "//table[contains(@border, '1') and .//td[text()='S.No.']]/following-sibling::table") df = pd.read_html(target_table.get_attribute('outerHTML'))[0] dfs.append(df) # 点击下一页按钮,处理可能的遮挡问题 next_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.XPATH, "//a[text()='Next']")) ) driver.execute_script("arguments[0].click();", next_btn) except (TimeoutException, ElementClickInterceptedException): # 无下一页或无法点击时终止循环 break driver.quit() return pd.concat(dfs, ignore_index=True) def export_to_csv(df, filename): df.to_csv(filename, index=False) def scrape_and_export(url, filename): df = scrape_table(url) export_to_csv(df, filename) print(f"数据已导出到 {filename}") # 执行抓取 url = 'https://admissions.nic.in/admiss/admissions/orcrjacd/105012321' filename = 'output.csv' scrape_and_export(url, filename)
核心改进点
- 等待逻辑优化:不再仅等待表格元素,而是等待表格内的有效数据行出现,确保数据已完全加载。
- 精准表格定位:通过XPath定位真实数据表格,避免抓取页面上的空表头或其他无关表格。
- 分页自动遍历:循环点击下一页按钮,直到无法点击为止,实现多页数据的完整抓取。
- 异常容错处理:捕获超时、点击拦截等异常,避免程序崩溃,同时判断分页结束条件。
额外注意事项
- 确保ChromeDriver版本与本地Chrome浏览器版本严格匹配,否则会出现加载异常。
- 若网站存在反爬限制,可在分页点击后添加
time.sleep(2)的短暂等待,避免触发频率限制。 - 抓包方法失效通常是因为网站使用了会话验证或加密请求,Selenium模拟真实浏览器行为是更可靠的解决方案。
内容的提问来源于stack exchange,提问作者Abhinay
相关产品推荐
相关产品推荐

