如何用Python的BeautifulSoup抓取URL无变化的多页表格数据?
解决无URL变化的分页表格抓取问题
当分页点击后URL不变化,说明表格数据是通过前端异步加载(比如AJAX、Fetch)获取的,BeautifulSoup只能解析初始页面的静态HTML,自然拿不到后续分页的数据。这里给你两种实用的解决思路:
方法一:直接抓取数据接口(推荐,效率更高)
这类网站的分页数据通常是通过后台API接口返回的,你可以直接请求接口拿到原始数据,不用处理前端渲染:
- 打开浏览器开发者工具(按F12),切换到「Network」标签页,勾选「XHR」或「Fetch」选项。
- 点击页面上的分页按钮,观察网络请求列表,找到返回表格数据的请求(通常URL里会有
page、offset这类参数,响应内容是JSON格式)。 - 复制该请求的URL、请求头(比如
User-Agent、Cookie,部分网站需要验证身份),用requests库直接请求接口,解析返回的JSON数据。
示例代码:
import requests headers = { "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", # 如果需要Cookie,从浏览器请求头里复制 "Cookie": "your_cookie_here" } # 假设找到的接口URL,page参数控制分页 for page in range(1, 10): # 假设共10页 url = f"https://example.com/api/table-data?page={page}&limit=10" response = requests.get(url, headers=headers) data = response.json() # 提取表格数据,比如data['list']或对应的字段 for item in data['list']: print(item)
方法二:用Selenium模拟浏览器操作
如果接口加密、难以找到,或者网站有复杂的反爬机制,就用Selenium模拟真实用户的点击行为,让浏览器渲染出完整页面后再抓取:
- 安装Selenium:
pip install selenium - 下载对应浏览器的驱动(比如ChromeDriver,要和浏览器版本匹配),放到Python可执行路径下。
- 编写代码模拟打开页面、点击分页、抓取表格数据的流程。
示例代码:
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 from bs4 import BeautifulSoup import time # 初始化浏览器(这里用Chrome,也可以用Firefox等) driver = webdriver.Chrome() driver.get("https://example.com/your-table-page") while True: # 等待表格加载完成,解析当前页面的表格 WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.TAG_NAME, "table"))) soup = BeautifulSoup(driver.page_source, "html.parser") table = soup.find("table") # 提取表格行数据 rows = table.find_all("tr")[1:] # 跳过表头 for row in rows: cols = [col.get_text(strip=True) for col in row.find_all("td")] print(cols) # 尝试点击下一页按钮,如果按钮不可用(比如最后一页),退出循环 try: next_btn = WebDriverWait(driver, 5).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.next-page"))) # 检查按钮是否是禁用状态(比如class里有disabled) if "disabled" in next_btn.get_attribute("class"): break next_btn.click() time.sleep(1) # 等待页面加载,可根据实际情况调整 except: # 找不到下一页按钮,说明到最后一页了 break driver.quit()
注意事项
- 抓取接口时,注意请求参数的规律(比如
page从1开始,limit是每页条数),有些网站可能用offset(偏移量)代替page。 - 使用Selenium时,尽量用显式等待(
WebDriverWait)代替固定睡眠,提高代码稳定性;同时注意网站的反爬机制,避免频繁操作被封禁。
内容的提问来源于stack exchange,提问作者FerryCarondelet
相关产品推荐
相关产品推荐

