基于Selenium的多同结构链接批量抓取及Excel多表导出优化咨询
Selenium批量抓取同结构多页面解决方案
完全可以实现,核心是通过函数封装重复逻辑+配置化管理抓取任务,无需反复复制代码,100个链接仅需添加对应配置行即可。
实现逻辑
- 把单页面的抓取、解析逻辑封装为可复用函数,仅需传入目标URL和对应工作表名作为参数
- 用字典统一管理所有抓取任务,键为预设的工作表名称,值为对应抓取链接,新增任务仅需修改该配置
- 全局仅初始化一次浏览器驱动、一次Excel写入对象,减少重复初始化的资源开销,运行效率更高
- 每次抓取完成后切回默认页面上下文,避免多页面切换时frame定位报错
优化后完整代码
from bs4 import BeautifulSoup import os from selenium import webdriver from selenium.webdriver.chrome.options import Options import time import pandas as pd from openpyxl import load_workbook # --------------- 仅需修改以下配置即可新增/修改抓取任务 --------------- SCRAPE_TASKS = { "FEUR": "https://www.morningstar.dk/dk/funds/snapshot/snapshot.aspx?id=F00000ZG2F&tab=3", # 新增任务直接按以下格式加一行即可,例: # "工作表名2": "对应URL2", # "工作表名3": "对应URL3", } EXCEL_PATH = r'/Users/karlemilthulstrup/Downloads/data.xlsx' # ------------------------------------------------------------------- # 初始化浏览器驱动(全局仅初始化一次) opts = Options() opts.add_argument("--headless") chrome_driver = os.getcwd() + "/chromedriver" driver = webdriver.Chrome(options=opts, executable_path=chrome_driver) driver.implicitly_wait(10) # 初始化Excel写入对象(全局仅初始化一次) book = load_workbook(EXCEL_PATH) writer = pd.ExcelWriter(EXCEL_PATH, engine='openpyxl') writer.book = book def scrape_single_page(url: str, sheet_name: str): """单页面抓取函数""" try: driver.get(url) driver.switch_to.frame(1) driver.find_element_by_xpath("//button[contains(@class,'show-table')]//span").click() # 提取表头 table_headers = driver.find_elements_by_xpath("//div[contains(@class,'sal-mip-factor-profile__value-table')]/table//tr/th") header = [tab.text for tab in table_headers] # 提取表体 table_body = driver.find_elements_by_xpath("//div[contains(@class,'sal-mip-factor-profile__value-table')]/table//tbody/tr") data = [header] for tab in table_body: row = [con.text for con in tab.find_elements_by_tag_name("td")] data.append(row) df = pd.DataFrame(data) # 写入对应工作表 df.to_excel(writer, sheet_name=sheet_name) print(f"[{sheet_name}] 抓取完成") except Exception as e: print(f"[{sheet_name}] 抓取失败,错误信息:{str(e)}") finally: # 切回默认上下文,避免下一次frame定位出错 driver.switch_to.default_content() # 批量执行所有抓取任务 for sheet_name, url in SCRAPE_TASKS.items(): scrape_single_page(url, sheet_name) # 全部执行完成后统一保存Excel、关闭资源 writer.save() writer.close() driver.quit()
使用说明
- 提前在
EXCEL_PATH指定路径创建空白的data.xlsx文件即可运行 - 新增抓取链接仅需在
SCRAPE_TASKS字典中添加一行配置,无需修改其他代码 - 内置异常捕获逻辑,单个链接抓取失败不会中断整体任务,错误信息会在控制台打印
内容的提问来源于stack exchange,提问作者Karl Emil Thulstrup
相关产品推荐
相关产品推荐

