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

如何用Python实现网站Excel表格导出、按钮下载与多页面数据抓取?

解决网页表格导出与多页面抓取问题

一、处理需点击按钮下载的表格

针对这类场景,分两种情况给出具体实现方案:

1. 按钮直接触发下载接口(静态请求)

如果点击按钮后实际是向某个接口发送请求获取xlsx文件,可以通过抓包拿到接口信息后直接请求:

  • 打开浏览器开发者工具(F12)切换到Network标签
  • 点击下载按钮,筛选出响应类型为application/vnd.openxmlformats-officedocument.spreadsheetml.sheet的请求
  • 复制该请求的URL、请求头和必要参数,用Python直接请求保存

示例代码:

import requests

# 替换为抓包得到的下载接口URL
download_url = "https://example.com/api/export-table.xlsx"
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"
}

# 发送请求并保存到本地
response = requests.get(download_url, headers=headers)
with open("downloaded_table.xlsx", "wb") as f:
    f.write(response.content)

2. 按钮触发JS动态渲染表格后导出

如果按钮点击后是先在页面渲染表格再生成下载,需要用浏览器自动化工具模拟操作:

示例用Selenium实现(需提前安装selenium和对应浏览器驱动):

from selenium import webdriver
from selenium.webdriver.common.by import By
import pandas as pd

driver = webdriver.Chrome()
driver.get("https://www.runnersworld.com/races-places/a20823734/these-are-the-worlds-fastest-marathoners-and-marathon-courses/")

# 替换为下载按钮的实际选择器(XPath/CSS选择器)
download_button = driver.find_element(By.XPATH, "//button[contains(text(), '导出Excel')]")
download_button.click()

# 若需抓取渲染后的表格自行生成xlsx
page_source = driver.page_source
soup = BeautifulSoup(page_source, "html.parser")
table = soup.find("table")
df = pd.read_html(str(table))[0]
df.to_excel("extracted_table.xlsx", index=False)

driver.quit()

二、抓取多页面嵌入的表格

1. 静态分页(页面有明确分页链接)

遍历所有分页链接,逐个解析表格并合并数据:

import requests
from bs4 import BeautifulSoup
import pandas as pd

base_url = "https://example.com/table-page-"
all_data = []

# 假设共有5页,可根据实际分页逻辑调整
for page in range(1, 6):
    url = f"{base_url}{page}"
    response = requests.get(url)
    soup = BeautifulSoup(response.text, "html.parser")
    table = soup.find("table")
    df = pd.read_html(str(table))[0]
    all_data.append(df)

# 合并所有页面数据并保存
combined_df = pd.concat(all_data, ignore_index=True)
combined_df.to_excel("multi_page_table.xlsx", index=False)

2. 动态分页(AJAX加载,无明显分页链接)

用Selenium模拟点击下一页按钮,直到没有更多页面:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
import pandas as pd

driver = webdriver.Chrome()
driver.get("你的目标URL")
all_data = []

while True:
    # 提取当前页面表格数据
    page_source = driver.page_source
    soup = BeautifulSoup(page_source, "html.parser")
    table = soup.find("table")
    df = pd.read_html(str(table))[0]
    all_data.append(df)
    
    try:
        # 点击下一页按钮,替换为实际选择器
        next_button = driver.find_element(By.CSS_SELECTOR, ".next-page-btn")
        next_button.click()
        driver.implicitly_wait(3)  # 等待页面加载
    except NoSuchElementException:
        # 没有下一页时退出循环
        break

# 合并数据并保存
combined_df = pd.concat(all_data, ignore_index=True)
combined_df.to_excel("dynamic_multi_page.xlsx", index=False)
driver.quit()

三、数据存储到数据库

以SQLite为例,将提取的表格数据写入数据库:

import sqlite3

conn = sqlite3.connect("table_data.db")
# 将合并后的DataFrame写入指定表,若表存在则替换
combined_df.to_sql("marathon_data", conn, if_exists="replace", index=False)
conn.close()

内容的提问来源于stack exchange,提问作者mdl518

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 18:12:48