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))