写在前面
也许坚持一件事,一年、两年后会有很大收获吧。
上周一朋友让帮忙写个爬虫,抓取某网站的商品列表。写完之后又不知道怎么给他,导出文件吧,可能每次要的时候又来找我。发代码吧,又怕他没有python环境。所以干脆写成一个GUI页面,再做成exe文件直接给他,他爱怎么玩就怎么玩。
文章包含内容
本篇文章包含的东西挺多。为了缩短写文章的时间。这里我直接省略了爬虫代码的编写。因为关于爬虫我也写了不少文章。python 爬取彩票网站,爬取某东网站机票
所以文章包含以下内容
- 导出csv文件
- 使用xlsxwriter导出excel文件
- xlsxwriter导出url图片到文件
- 使用Tkinter 生成GUI程序
- 使用pyinstaller生成windows程序
下面就分成这5部分来说明。
导出csv文件
csv文件是一种通过’,’来分割的字符串。所以在导出前,先要拼接好字符串。
1
2
3
4
5
6
7
8
#写入csv文件处理方法
def write_csv(list):
product_text = open('download/'+str(file_name)+'.csv', 'a')
# 设置csv文件编码
# product_text.write(codecs.BOM_UTF8)
for tmp in list:
product_text.write(tmp + 'n')
product_text.close()
需要注意的是product_text.write(codecs.BOM_UTF8)
当存在中文时,必须要加上这一行,否则生成的文件内容都是乱码。
生成excel文件
第2、3条一起说明。这里我使用的是xlsxwriter,只能生成excel文件,不能读取。当然也可以选择别的包来生产excel文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#写入excle文件处理方法
def write_xlsx(list,rows):
#开始行数
i = (rows-1)*24
global sheet
book = xlsxwriter.Workbook('download/'+str(file_name)+'.xlsx')
sheet = book.add_worksheet('Richie')
sheet.set_column('B:B', 23)
row_index = int(i)
for tmp in list:
sheet.write('A'+str(row_index+1), tmp['product_name'])
try:
# 图片写入
url = tmp['url']
image_data = BytesIO(urlopen(url).read())
sheet.set_row(row_index, 120)
sheet.insert_image('B' + str(row_index + 1), url, {'image_data': image_data})
except BaseException:
text.insert(END, '第'+str(row_index+1)+'行的图片写入出错,将继续下载...n')
text.update()
sheet.write('C' + str(row_index + 1), tmp['product_price'])
sheet.write('D' + str(row_index + 1), tmp['product_save'])
row_index = row_index + 1
book.close()
这里需要特别说明的有
- 因为xlsxwriter只能写不能读,所以如果是一个循环的程序生成,可以把实例化变量提到循环外面,再通过global来调用。
- 因为xlsxwriter不支持URL直接写入。所以需要转成二进制后再写入单元格。
image_data = BytesIO(urlopen(url).read())
代码里我有一个捕获异常代码段。因为我的程序抓取的是一个外国网站,可变性比较大,比较出错影响代码继续进行。 - 因为图片是浮在表格上方,为了美观。可以先把单元格的宽度,高度设置一下。
sheet.set_row(row_index, 120) sheet.set_column('B:B', 23)
- 需要注意比较重要的问题。在xlsxwriter里,配置单元格时。如果使用的是excel的形式如“B2”,安装excel格式就好。如果使用的是数字形式来表达单元格。行和列都是从0开始。
使用Tkinter 生成GUI程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
def main():
root = Tk() # 创建窗口对象的背景色
root.title("Australia daigou") #窗口标题
# 窗口大小
width, height = 450, 450
# 窗口居中显示
root.geometry('%dx%d+%d+%d' % (
width, height, (root.winfo_screenwidth() - width) / 2, (root.winfo_screenheight() - height) / 2))
# 窗口最大值
root.maxsize(600, 600)
# 窗口最小值
root.minsize(400, 400)
# 顶部标签
label = Label(root, text="Please enter the URL address")
label.pack()
# 全局变量,用于接收对话框输入的值。
global input_text
input_text = StringVar()
# 中部输入框
entry = Entry(root, textvariable=input_text, width=100)
input_text.set('http://www.baidu.com')
entry.pack()
#单选框
global radio_value
radio_value = StringVar()
radio_value.set('csv')
Radiobutton(root,variable = radio_value, text='csv(no image)', value = 'csv').pack()
Radiobutton(root,variable = radio_value, text='xlsx(incloud image. very slow)', value ='xlsx' ).pack()
# body部按钮
button = Button(root, text="Download file", command=dell) #创建按钮
button.pack()
# 底部返回信息
global text
text = Text(root)
s = Scrollbar(root)
s.pack(side=RIGHT, fill=Y)
text.pack(side=LEFT, fill=Y)
s.config(command=text.yview)
text.config(yscrollcommand=s.set)
root.mainloop()
代码里的注释都很详细,就不多解释了。不过也有几个地方需要注意
- 单选框这里,和web程序一样。要保证单选框为一个组(两者只能选其一)。需要设置一样的
variable = radio_value,
值 button = Button(root, text="Download file", command=dell)
按钮后面绑定的是调用方法。dell方法。- 如何要做一个有滚动条的文本框,需要创建一个组合的组件。代码中“# 底部返回信息” 因为是参考网上的,不详细说了。
- 要保证每次刷新出新的数据都在滚动条最底部,需要配置。
text.see(END)
- 如果要执行过程中输入数据。要记得使用update,否则不会输出。
1
2
text.insert(END, '正在下载第'+str(once)+'页...n')
text.update()
图片为以上代码的GUI界面
使用pyinstaller生成windows程序
使用pyinstaller生成windows非常简单。这也许也是我越来越喜欢python的原因。使用什么工作,只需要引入一个包就可以直接使用。而且几行代码搞定。
同样使用 pip安装 pip install pyinstaller
安装成功后,cmd 进入要打包的.py 文件目录下。 只需要执行
1
pyinstaller test.py
然后等待打包完成就好了。会在目录下生产两个文件夹 dist文件下有个exe可执行文件。一切搞定。
在使用pyinstaller 之前我还算使用了py2exe包来生产。对比之后还是觉得pyinstaller比较好用。因为py2exe生产过程比pyinstaller步骤要多一些。pip安装也不能直接安装。最可恨的是py2exe生成的exe没有把我的xmlx包引入进去…
尽可能缩减内容,但是写完文章还是花了1小时….
最后
以上就是微笑羽毛最近收集整理的关于python写一个爬虫GUI程序并生成windows程序的全部内容,更多相关python写一个爬虫GUI程序并生成windows程序内容请搜索靠谱客的其他文章。
发表评论 取消回复