【Python办公】用 Selenium 自动化网页批量录入

目录

专栏导读

🌸 欢迎来到Python办公自动化专栏---Python处理办公问题,解放您的双手
🏳️‍🌈 个人博客主页:请点击------> 个人的博客主页 求收藏
🏳️‍🌈 Github主页:请点击------> Github主页 求Star⭐
🏳️‍🌈 知乎主页:请点击------> 知乎主页 求关注
🏳️‍🌈 CSDN博客主页:请点击------> CSDN的博客主页 求关注
👍 该系列文章专栏:请点击------>Python办公自动化专栏 求订阅
🕷 此外还有爬虫专栏:请点击------>Python爬虫基础专栏 求订阅
📕 此外还有python基础专栏:请点击------>Python基础学习专栏 求订阅
文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
❤️ 欢迎各位佬关注! ❤️

前言

本文介绍一个面向"上海区批量入账"的网页自动化小工具的核心脚本 auto_fill.py,如何在本地页面上自动点击"新增一行",并批量填充五列数据(默认 50 行),支持从 CSV 读取或使用内置示例数据补齐。
完整代码请点击我
完整代码请点击我
完整代码请点击我

为什么写这个工具

  • 背景:上海区批量入账场景,网页仅支持人工逐条录入,流程耗时、重复劳动多、易出错。
  • 目标:通过网页自动化录入,显著缩短入账耗时、提升准确率与一致性。
  • 人力与周期:整体人力耗时 2 个工作日,其中工具核心功能研发与联调约 5 小时。
  • 预期推广:通过 1 小时的集中培训完成安装与演示,让财务人员可独立使用;预计获得"业务分奖励/表扬信"等认可形式。

方案总览

  • 页面侧:index.html 提供动态表单,每行包含 5 个输入框,可点击 + 新增一行 增加行数,并支持导出多列 CSV
  • 自动化侧:auto_fill.py 使用 Selenium 自动打开页面、点击新增行到目标数量、并逐行填入 5 列数据。
  • 数据来源:优先读取同目录 input.csv 的前 50 行×5 列,若不足则按"演示行X-列Y"自动补齐。
  • 浏览器策略:优先连接已开启的 Chrome 远程调试端口 127.0.0.1:9222,回退到本地 Chrome→Edge→Firefox。

核心代码解析

数据准备:get_values

  • 位置:d:\I_LOVE_KUNKUN\11月\演示案例\auto_fill.py:14
  • 作用:读取 CSV 的前 rows_count 行(每行最多 5 列),不足的列与行用"演示行X-列Y"补齐,确保最终是 rows_count×5 的二维数据。
  • 关键逻辑:
    • 读取 csv_pathauto_fill.py:12)的内容并截取到指定行数(auto_fill.py:17auto_fill.py:24)。
    • 若行数不足则补齐(auto_fill.py:27auto_fill.py:33)。

浏览器驱动:create_driver

  • 位置:d:\I_LOVE_KUNKUN\11月\演示案例\auto_fill.py:36
  • 作用:优先使用已启动的 Chrome 远程调试端口连接;失败时回退到 Chrome/Edge/Firefox。
  • 关键逻辑:设置 Options().add_experimental_option('debuggerAddress', '127.0.0.1:9222')auto_fill.py:38auto_fill.py:40)。

自动化流程:run

  • 位置:d:\I_LOVE_KUNKUN\11月\演示案例\auto_fill.py:50
  • 步骤:
    • 打开本地页面 index.htmlauto_fill.py:52)。
    • 等待并获取"新增一行"按钮(auto_fill.py:54)。
    • 连续点击到目标行数(默认 count=50auto_fill.py:55auto_fill.py:58)。
    • 等待行渲染完成并拿到所有行节点(auto_fill.py:59auto_fill.py:61)。
    • 逐行填入五列数据(auto_fill.py:62auto_fill.py:66)。

使用步骤

  • 打开网页:双击 index.html
  • 运行自动录入:在当前目录执行:
    • python auto_fill.py
  • 可选(远程调试更稳定):先启动 Chrome 并开启端口,再运行脚本:
    • Windows:"C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe" --remote-debugging-port=9222
    • 然后执行:python auto_fill.py

完整代码

python 复制代码
from pathlib import Path
import os
import csv
import time
import subprocess
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

base = Path(__file__).resolve().parent
html_path = base / 'index.html'
csv_path = base / 'input.csv'

def find_chrome():
    candidates = [
        r"C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe",
        r"C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe",
        str(Path(os.getenv('LOCALAPPDATA', '')) / 'Google/Chrome/Application/chrome.exe'),
    ]
    for p in candidates:
        if p and Path(p).is_file():
            return p
    return None

def start_chrome_debug(port=9222, user_data_dir=None):
    exe = find_chrome()
    if not exe:
        return False
    if not user_data_dir:
        user_data_dir = str(base / 'chrome_profile')
    os.makedirs(user_data_dir, exist_ok=True)
    cmd = [exe, f'--remote-debugging-port={port}', f'--user-data-dir={user_data_dir}']
    try:
        subprocess.Popen(cmd)
        time.sleep(1.5)
        return True
    except Exception:
        return False

def get_values(rows_count, cols=5):
    vals = []
    try:
        with open(csv_path, 'r', encoding='utf-8-sig') as f:
            for row in csv.reader(f):
                r = []
                for j in range(cols):
                    r.append(row[j] if j < len(row) else '')
                vals.append(r)
                if len(vals) >= rows_count:
                    break
    except Exception:
        vals = []
    if len(vals) < rows_count:
        for i in range(len(vals) + 1, rows_count + 1):
            vals.append([f'演示行{i}-列{j}' for j in range(1, cols + 1)])
    for i in range(rows_count):
        for j in range(cols):
            if vals[i][j] == '':
                vals[i][j] = f'演示行{i + 1}-列{j + 1}'
    return vals

def create_driver():
    try:
        opts = Options()
        opts.add_experimental_option('debuggerAddress', '127.0.0.1:9222')
        return webdriver.Chrome(options=opts)
    except Exception:
        try:
            return webdriver.Chrome()
        except Exception:
            try:
                return webdriver.Edge()
            except Exception:
                return webdriver.Firefox()

def run():
    start_chrome_debug(9222, str(base / 'chrome_profile'))
    driver = create_driver()
    driver.get(html_path.as_uri())
    wait = WebDriverWait(driver, 10)
    add_btn = wait.until(EC.element_to_be_clickable((By.ID, 'addRowBtn')))
    count = 50
    for _ in range(count - 1):
        add_btn.click()
        time.sleep(0.02)
    wait.until(lambda d: len(d.find_elements(By.CSS_SELECTOR, '#rows .row')) >= count)
    rows = driver.find_elements(By.CSS_SELECTOR, '#rows .row')
    values = get_values(count, 5)
    for i in range(count):
        inputs = rows[i].find_elements(By.CSS_SELECTOR, '.value-input')
        for j in range(5):
            inputs[j].clear()
            inputs[j].send_keys(values[i][j])
    time.sleep(2)
    driver.quit()

if __name__ == '__main__':
    run()

CSV 数据规范

  • 文件名:input.csv(与脚本同目录)。

  • 列数:前 5 列有效;若不足 5 列则空位自动补齐为"演示行X-列Y"。

  • 示例:

    姓名,电话,地址,公司,备注
    张三,13800001234,上海浦东新区,某公司,备注A
    李四,13800004321,上海闵行区,某公司B,备注B

常见问题与排查

  • 无法启动浏览器/驱动报错:
    • 确认已安装 Chrome/Edge/Firefox 任一浏览器。
    • 若使用远程调试端口,确保端口 9222 已被 Chrome 打开。
  • 页面未渲染到 50 行:
    • 适当增大点击间隔(auto_fill.py:58time.sleep(0.02))。
    • 检查页面按钮 id 与行选择器是否与 index.html 保持一致。
  • input.csv 不存在或空:
    • 脚本会自动用"演示行X-列Y"补齐,不影响演示。

扩展方向

  • 读取 Excel(xlsx):可采用 openpyxlpandas 读取为二维数据后复用填充逻辑。
  • 表单字段校验与模板:在 index.html 增加列名映射与必填校验提示。
  • 更大批量与稳态优化:分批点击与分批填充,适当增加等待以提高稳定性。
  • 日志与异常处理:加入详细日志、截图与失败重试,便于问题定位。

结语

该工具围绕"批量入账"的刚性需求,利用 Selenium 将重复的人工录入流程自动化。在 2 个工作日的整体投入与约 5 小时的核心研发下,达成了可培训、可推广、可复用的自动化方案,有望在上海区获得"业务分奖励/表扬信"的认可,并为后续流程持续优化奠定基础。

结尾

希望对初学者有帮助;致力于办公自动化的小小程序员一枚
希望能得到大家的【❤️一个免费关注❤️】感谢!
求个 🤞 关注 🤞 +❤️ 喜欢 ❤️ +👍 收藏 👍
此外还有办公自动化专栏,欢迎大家订阅:Python办公自动化专栏
此外还有爬虫专栏,欢迎大家订阅:Python爬虫基础专栏
此外还有Python基础专栏,欢迎大家订阅:Python基础学习专栏
相关推荐
ouliten2 小时前
C++笔记:std::string_view
开发语言·c++·笔记
玫瑰花店2 小时前
万字C++中锁机制和内存序详解
开发语言·c++·算法
西幻凌云2 小时前
认识STL序列式容器——List
开发语言·c++·stl·list·序列式容器
诸神缄默不语2 小时前
如何用Python处理文件:Word导出PDF & 如何用Python从Word中提取数据:以处理简历为例
python·pdf·word
~无忧花开~3 小时前
JavaScript实现PDF本地预览技巧
开发语言·前端·javascript
vvoennvv3 小时前
【Python TensorFlow】 TCN-LSTM时间序列卷积长短期记忆神经网络时序预测算法(附代码)
python·神经网络·机器学习·tensorflow·lstm·tcn
靠沿3 小时前
Java数据结构初阶——LinkedList
java·开发语言·数据结构
4***99743 小时前
Kotlin序列处理
android·开发语言·kotlin