如何使用Pandas读取点击下一页后URL无更新的动态HTML表格数据
问题解决方法
原因说明
你遇到的是典型的动态分页站点爬取问题:网站的下一页内容是通过AJAX异步加载的,点击下页时浏览器不会跳转整个页面,URL自然不会变化,而pandas.read_html()只能获取单次HTTP请求返回的静态HTML内容,自然只能拿到第一页数据。
可行实现方案
这里给两种常用的解决路径,你可以根据自己的需求选择:
方案1:用Selenium模拟浏览器交互(上手简单)
直接模拟真人点击下页的操作,拿到每一页渲染完成后的完整HTML,再交给Pandas解析即可。
依赖安装
首先安装需要的库和浏览器驱动:
pip install selenium # 注意还要下载和你Chrome版本对应的ChromeDriver,放到系统路径或者脚本同级目录
示例代码
import pandas as pd import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 初始化浏览器 driver = webdriver.Chrome() driver.get('https://www.wowprogress.com/') all_dfs = [] max_page = 10 # 你需要爬取的最大页码,按需修改 for page in range(max_page): # 等待表格加载完成 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.TAG_NAME, 'table')) ) # 解析当前页表格 current_html = driver.page_source current_tables = pd.read_html(current_html) # 取第一个你需要的表格 all_dfs.append(current_tables[0]) # 找下一页按钮,判断是否可点击 try: # 实际的选择器可以打开F12自己定位下页按钮调整 next_btn = driver.find_element(By.CSS_SELECTOR, 'a[rel="next"]') if 'disabled' in next_btn.get_attribute('class') or not next_btn.is_displayed(): break next_btn.click() # 留足加载时间,避免爬取太快被封 time.sleep(2) except: # 找不到下页按钮说明到最后一页了,退出循环 break # 合并所有页的数据 final_df = pd.concat(all_dfs, ignore_index=True) print(final_df) driver.quit()
方案2:直接抓异步请求接口(效率更高)
不需要启动浏览器,直接通过浏览器开发者工具抓取下页触发的AJAX请求,构造参数批量获取数据即可,速度比Selenium快很多。
操作步骤:
- 打开目标页面,按F12调出开发者工具,切换到「网络」标签,筛选「XHR/ fetch」类型的请求
- 点击页面上的下一页按钮,观察新出现的请求,一般请求参数里会包含
page、p这类页码参数 - 模仿这个请求的头信息和参数,直接用
requests库构造请求,拿到返回的HTML后交给pd.read_html()解析即可
注意事项
- 控制爬取频率,每次请求间隔至少1-2秒,避免给站点服务器造成压力,也防止你的IP被临时封禁
- 爬取前确认站点的robots规则,确保你的爬取行为符合站点要求
内容的提问来源于stack exchange,提问作者user18139
相关产品推荐
相关产品推荐

