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

如何用Python的BeautifulSoup抓取URL无变化的多页表格数据?

解决无URL变化的分页表格抓取问题

当分页点击后URL不变化,说明表格数据是通过前端异步加载(比如AJAX、Fetch)获取的,BeautifulSoup只能解析初始页面的静态HTML,自然拿不到后续分页的数据。这里给你两种实用的解决思路:

方法一:直接抓取数据接口(推荐,效率更高)

这类网站的分页数据通常是通过后台API接口返回的,你可以直接请求接口拿到原始数据,不用处理前端渲染:

  1. 打开浏览器开发者工具(按F12),切换到「Network」标签页,勾选「XHR」或「Fetch」选项。
  2. 点击页面上的分页按钮,观察网络请求列表,找到返回表格数据的请求(通常URL里会有page、offset这类参数,响应内容是JSON格式)。
  3. 复制该请求的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模拟真实用户的点击行为,让浏览器渲染出完整页面后再抓取:

  1. 安装Selenium:pip install selenium
  2. 下载对应浏览器的驱动(比如ChromeDriver,要和浏览器版本匹配),放到Python可执行路径下。
  3. 编写代码模拟打开页面、点击分页、抓取表格数据的流程。

示例代码:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:53:16