当前位置: 首页 > article >正文

Backend - Python 爬取网页数据并保存在Excel文件中

目录

一、导入依赖

二、前端爬取页面数据

1. html 中

2. js 中 

三、后端获取数据,并存储到 Excel 文件中

1. 后端接收数据

 2. 后端存储数据

(1)系统代码固定存储位置

(2)用户可选择文件对话框的存储位置


一、导入依赖

        存储 Excel 文件所需依赖:xlwt

        使用 pypi 下载依赖后,安装命令:

pip install xlwt-1.3.0-py2.py3-none-any.whl

pypi 的使用教程,可参考文章:Backend - PyPI 使用教程-CSDN博客

二、前端爬取页面数据

1. html 中

<input type="button" id="id_down_btn" value="Down" />
<table id="tb_book">
       <thead></thead> <tbody></tbody>
</table>

2. js 中 

// 获取table中所有thead标题行的值,返回一维列表
function get_thead_data(tb_id) {
    var thead_list = [];
    var tb_id = '#' + tb_id;
    $(tb_id)
        .find('tr')
        .each(function () {
            $(this)
                .find('th')
                .each(function () { // 遍历标题行的th单元格
                    thead_list.push($(this).find('div').html());
                });
        });
    return thead_list
}

// 获取table中所有tbody内容行的值,返回二维列表
function get_tbody_data(tb_id) {
    var rows_list = [];
    var tb_id = '#' + tb_id;
    $(tb_id)
        .find('tr')
        .each(function () { // 遍历每行
            var onerow_list = []; // 单行
            $(this)
                .find('td')
                .each(function () { // 遍历每行的td单元格
                    var onerow_text = $(this).html();  // 先判断tbody内容是否为空
                    if (onerow_text == 'No data available in table') {
                        return false
                    } else {
                        onerow_list.push($(this).html()) // 单行存储每个单元格
                    }
                });
            if (onerow_list.length > 0) {
                rows_list.push(onerow_list) // 整个二维列表存储每行
            }
        });
    return rows_list
}

// 执行下载
$("#id_down_btn").click(function () {
     let thead_list = get_thead_data("tb_book"); // 获取标题(一维列表)
     let tbody_list = get_tbody_data("tb_book"); // 获取内容(二维列表)
     tbody_list.unshift(thead_list)  // 将标题列表插入到内容列表开头
     $.ajax({
         url: window.location.pathname, // 获取当前路由
         type: 'POST',
         data:{
             'tb_data': JSON.stringify(tbody_list)
         },
         success: function(reply){
             if(reply.res){
                 console.log(reply.data);
             }
         }
      })
});

三、后端获取数据,并存储到 Excel 文件中

1. 后端接收数据

get_post_data = request.POST
tb_data = json.loads(get_post_data['tb_data'])
down_excel(tb_data, '工作表名', 'D:/Excel文件名.xls')

 2. 后端存储数据

(1)系统代码固定存储位置
import xlwt # 导入xlwt模块
def down_excel(rows_data, sheet_name='sheet1', save_url=None):
    '''
        创建工作簿
        @rows_data 存储的内容 [['AAA', 'BBB', 'CCC', 'DDD'], ['AAA', 'BBB', 'CCC', 'DDD']] 
        @sheet_name 表名 '书籍表'
        @save_url 存储的文件路径,若无值则弹窗提示用户自定义选择位置,若有值则传入格式为字串的值,如 'D:/savefile.xls' 
    '''
    try:
        if save_url: # 若设好文件存储位置
            wbook = xlwt.Workbook(encoding='utf-8') # 创建工作簿
            sheet1 = wbook.add_sheet(sheet_name, cell_overwrite_ok=False) # 创建sheet对象,给工作簿添加一个表,cell_overwrite_ok设置True,作用是覆盖单元格,避免重复编辑同个单元格而报错
            for i in range(0,len(rows_data)): # 先遍历每行
                for j in range(0,len(rows_data[i])): # 再遍历每列
                    sheet1.write(i, j, rows_data[i][j]) # 第一个参数:行数,第二个参数:列数,第三个参数:写入单元格数据
            wbook.save(save_url) # 保存工作簿,微软用xls后缀
    except Exception as e:
        print("异常报错信息: " + str(e))
(2)用户可选择文件对话框的存储位置
import xlwt # 存储Excel
import easygui # 打开文件对话框
from datetime import datetime

def down_excel(rows_data, sheet_name='工作表1', save_url=None):
   
    '''
        创建工作簿
        @rows_data 存储的内容 [['AAA', 'BBB', 'CCC', 'DDD'], ['AAA', 'BBB', 'CCC', 'DDD']] 
        @sheet_name 表名 '书籍表'
        @save_url 存储的文件路径,若无值则弹窗提示用户自定义选择位置,若有值则传入格式为字串的值,如 'D:/savefile.xls' 
    '''
    try:
        if not save_url: # 设置存储文件位置
            default_filename = 'D:\\{}_{}'.format(sheet_name, datetime.now().strftime('%Y%m%d')) # 组合方式:D盘路径+工作表1的名称+当天日期
            save_url = easygui.filesavebox(title="请选择文件", default=default_filename, filetypes = ["*.xls"]) # 打开文件对话框(default设置默认打开的文件夹目录,filetypes设置文件后缀下拉选项)
        if save_url: # 若设好存储位置
            wbook = xlwt.Workbook(encoding='utf-8') # 创建工作簿
            sheet1 = wbook.add_sheet(sheet_name, cell_overwrite_ok=False) # 创建sheet对象,给工作簿添加一个表,cell_overwrite_ok设置True,作用是覆盖单元格,避免重复编辑同个单元格而报错
            for i in range(0,len(rows_data)): # 先遍历每行
                for j in range(0,len(rows_data[i])): # 再遍历每列
                    sheet1.write(i, j, rows_data[i][j]) # 第一个参数:行数,第二个参数:列数,第三个参数:写入单元格数据
            wbook.save(save_url+'.xls') # 保存工作簿,微软用xls后缀
    except Exception as e:
        print("异常报错信息: " + str(e))

http://www.kler.cn/a/383190.html

相关文章:

  • 汽车IVI中控开发入门及进阶(46):FFmpeg
  • pm面试题
  • vscode 快速切换cangjie版本
  • 入侵他人电脑,实现远程控制(待补充)
  • Qt:QMetaObject::connectSlotsByName实现信号槽自动关联
  • Python读取Excel批量写入到PPT生成词卡
  • 【React】JSX规则
  • 产品经理必备秘籍:打造有效的产品 Roadmap
  • 原生鸿蒙应用市场:赋能开发者全生命周期服务体验
  • GAN的基本原理
  • Linux学习笔记之vim入门
  • 【数据结构】二叉树——层序遍历
  • HTML5+css3(伪类,动态伪类,结构伪类,否定伪类,UI伪类,语言伪类,link,hover,active,visited,focus)
  • 网络优化如何利用改IP软件解除地域限制
  • VBA02-初识宏——EXCEL录像机
  • Windows核心编程笔记——DLL基础
  • 【AI视频换脸整合包及教程】AI换脸新星:Rope——让换脸变得如此简单
  • LeetCode题练习与总结:O(1) 时间插入、删除和获取随机元素 - 允许重复--381
  • Air780E基于LuatOS编程开发
  • web实操3——servlet
  • 短剧APP系统开发,数字化微短剧时代
  • SpringBoot框架学习总结 及 整合 JDBC Mybatis-plus JPA Redis 我的学习笔记
  • 《Qwen2-VL》论文精读【下】:发表于2024年10月 Qwen2-VL 迅速崛起 | 性能与GPT-4o和Claude3.5相当
  • 《Java 实现选择排序:原理剖析与代码详解》
  • 手动切换python版本
  • yolov8涨点系列之Concat模块改进