这几天帮朋友写一个爬虫程序,获取产品类目信息,过程中发现几个问题记录下来
文章目录
输出
写入CSV
开始直接用逗号拼接直接保存文本文件,后来发现数据中包含逗号,
这种输出方式会导致错误(有些数据分隔到了下一列)
写入csv文件
,且能处理数据包含逗号的情况,可以考虑csv
包
这样输出的文件用excel打开后可以正确显示
代码如下:
#!/usr/bin/python3
import csv
def output_csv(datas):
"""
将爬取的数据导出到csv
:return:
"""
# categories , description,url
with open('test.csv', 'w') as csvfile:
file = csv.writer(csvfile)
# 写入首行
file.writerow(['Sequence', 'Product Categories', 'Product SubCategories', 'Description', 'URL'])
for i in range(len(datas)):
key = datas[i]
sequence = i + 1
categories = key['categories']
subcategories = key['subcategories']
description = key['description']
url = key['url']
file.writerow([sequence, categories, subcategories, description, url])
# 构造测试数据列表,每条数据包含 类目,子类目,描述,url
categories_data = [{"categories": "test category A/B",
"subcategories": "",
"description": "Eco Foam Playing Puzzle, Mat in Geometry Shape 1",
"url": "https://www.baidu.com"},
{"categories": "test category A/B",
"subcategories": "",
"description": "Eco Foam Playing Puzzle Mat in Geometry Shape 2",
"url": "https://www.baidu.com"},
{"categories": "Eva Printing Mat",
"subcategories": "",
"description": '12"*12" New Design Triangle EVA Foam, Puzzle Interlocking Kids Mat',
"url": "https://www.baidu.com"
}]
output_csv(categories_data)
写入Excel
写入excel
可以使用python
的xlwt
包
excel里写入超链接
输出超链接的格式为:link = 'HYPERLINK("%s","%s")' % (url, [display word])
其中第一个参数是链接地址,第二个参数是显示文字
xlwt
输出超链接的代码:sheet.write(row, col, xlwt.Formula(link))
不只是超链接可以这样输出,Excel公式也可以用这种方式输出
输出超链接的两个问题
- sheet名不能包含特殊字符,注意对数据进行校验
如果必须按某个字段分割sheet,可以考虑在首页按此字段做链接,
每个sheet页名称用自增序列命名,
这样,在首页进行路由,跳转到不同sheet页面,
其它sheet页面首行可增加一个返回链接 - 超链接中包含
"
时需要特殊处理查找了好多博客和论坛,有说Excel里两个双引号代表一个双引号,
也有说三个或四个代表一个双引号,
经测试处理方法为:str.replace('"', '""')
在Linux上好像不管几个引号都不行,还没找到问题所在
代码如下:
import xlwt
def output_excel(datas):
wbk = xlwt.Workbook(encoding='utf-8')
for data in datas:
# 对 sheet 页名称数据需要校验处理
sheet_name = data['category'].replace('/', '')
sheet = wbk.add_sheet(sheet_name)
# 写入当前 sheet 页表头
sheet.write(0, 0, 'Sequence')
sheet.write(0, 1, 'Product SubCategories')
sheet.write(0, 2, 'Description')
row = 1 # 数据从第二行开始写入
for product in data['products']:
sheet.write(row, 0, row) # 序列号,和行号相同
sheet.write(row, 1, product['subcategories'])
link = 'HYPERLINK("%s","%s")\n' % (product['url'], product['description'].replace('"', '""'))
sheet.write(row, 2, xlwt.Formula(link))
row += 1
wbk.save('test.xls')
# 构造测试数据,多个类目,每个类目有多种产品,每个产品有若干属性
categories_data = {"category": "test category A/B",
"products": [{"subcategories": "",
"description": "Eco Foam Playing Puzzle Mat in Geometry Shape 1",
"url": "https://www.baidu.com"},
{"subcategories": "",
"description": "Eco Foam Playing Puzzle Mat in Geometry Shape 2",
"url": "https://www.baidu.com"}]
}, {
"category": "Eva Printing Mat",
"products": [{
"subcategories": "",
"description": '12"*12" New Design Triangle EVA Foam Puzzle Interlocking Kids Mat',
"url": "https://www.baidu.com"
}]
}
output_excel(categories_data)
UI界面显示
这里我使用了·python
的 tkinter
模块,
遇到的问题主要有
1. 控件间交互
2. 多线程并发
3. 界面与代码解耦
目前代码都写在一起,时间有限(只有周末),暂时先完成功能,
后面有时间再完善
tkinter实战一段时间后再发博客
程序打包
程序打包使用 pyinstaller
运行命令如下:
# 下载
pip install pyinstaller
# 打包
cd <dir:程序所在目录>
pyinstaller F -w -i=icon.ico Main.py
pyinstaller 命令参数说明
-F
表示生成单个可执行文件
-w
表示去掉控制台窗口,这在GUI界面时非常有用。不过如果是命令行程序的话那就把这个选项删除吧!
-p
表示你自己自定义需要加载的类路径,一般情况下用不到
-i
表示可执行文件的图标
pyinstaller 打包时的一些问题记录
包含第三方库的打包注意事项:
将第三方库复制到程序同目录中,再进行打包
无法定位程序输入点ucrtbase.terminate于动态链接库api-ms-win-crt-runtime-|1-1-0.dll 上。
给同学的程序报这个错,网上搜到很多解决办法,可参考以下链接:
https://blog.youkuaiyun.com/liweisnake/article/details/53055093
http://tieba.baidu.com/p/3848709732