如何用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
相关产品推荐
相关产品推荐

