实战 Python爬虫构建GUI程序打包这篇文章带你玩过瘾

2020-12-10 18:00 Python全家桶

点击上方Python全家桶星标或者置顶

重磅干货,第一时间送达

大家好,在之前的PySimpleGUI基础与进阶文章中,我们已经介绍了如何使用它构建GUI的基本方法,本文将进一步通过实战讲解如何利用PySimpleGUI与其他库结合,编写自己想要的GUI程序!

本文将带大家制作一个拥有一键爬取买车网数据到本地和舆情信息显示的图形交互程序,主要通过以下三个部分讲解:

项目主要涉及的Python模块:

  • PySimpleGUI
  • requests
  • pandas
  • re
  • urllib.parse

一、买车网爬虫

在选车过程中最重要的就是全面了解选车池中的基本面信息以及对应公司发布的一些“条文”,“套餐”,“福利”等。本文将在买车网上爬取汽车行情信息并放入TXT文件中以供读者全面了解汽车销售行业的基本概况。同时,爬取选车池中各爱车的基本面信息,为读者过滤图片、广告等干扰,阅读最精华的舆情。感兴趣的读者可以结合邮箱定时发送的项目进行实时舆情获取。

1.1 解构买车网网页与正则提取

此次项目我们需要获取汽车行业的行情与读者心目中的爱车信息,两者的获取方法类似,将以爱车信息为例子讲解,首先,先对网址URL做分析,当我们在输入框中输入法拉利,网址大概呈现如下图:

眼力尖的读者可以看到,输入框的内容就是URL中word=后面的那部分,那么问题就是能不能换成中文呢,我们可以尝试一下,得到图:图片

也就是说买车网的URL是识别不了中文字符串的,所以我们需要自行的将中文改为符合要求的编码方式。

这里给大家普及一下,INTERNET上的网址常用的汉字编码有UTF-8GB2312这两种,两种区别就是前者没有百分号,而后者是百分号后加两位数字字母组成。

所以在Python中我们也需要将输入的汉字转为百分号形式的GB2312形式,这里需要用到urllib库,代码如下:

##变成网页URL上的GB2312编码
import urllib.parse
name = '法拉利'
name = name.encode('gb2312')
name = urllib.parse.quote(name)

解决了汉字编码问题,URL上还存在页数放入问题,翻到第二页可以清楚看到每页的页数是放在page=后面的,而且没有做任何的加减乘除运算,如图:图片

1.2信息提取

最重要的部分来了!怎么获取爱车舆情信息的标题、正文网址、时间、正文内容?首先按F12查看源代码,如图:图片

可以看到,法拉利的第一套新闻标题在黑框中的title=后面,网址在<a href=>后面部分,时间在<span></span>的中间。其中标题和网址除了上述位置外还在黑框其他地方出现,此处不做讨论。

先建立爬虫代码,得到URL上的源代码,如下:

import requests
url = 'http://www.buycar.cn/search.php?chid=2&carsfullname=法拉利&caid=820&page=1' #这里只爬取一页,后续讲解批量爬取
data = requests.get(url).text

接着根据上述需要获取信息的位置,建立正则表达式为索引进行搜索,代码如下:

import re
p_title = '<a href=.*? title="(.*?)" target="_blank">'
P_html = '<i>(.*?)</i>'
P_time = '<span>(.*?)</span>'
title = re.findall(p_title,data)
html = re.findall(P_html,data,re.S)#此处用到re.S过滤存放网址上的换行问题
time = re.findall(P_time,data)

得到这些数据后,就是进行常规的数据处理,而后就是根据获取到的每条新闻对应的URL,进入到正文页面,进而有开始了解构.....,如图:

可以看到正文内容就是存放在标签<p>上,当然,获取的时候你会发现,除了正文内容外,还有一些不相关的内容也在这个标签里,所以要对其进行数据清洗,代码放到最后总代码上,此处的正则表达式代码如下:

data2 = requests.get(html[0]).text
P_con = '<p>(.*?)</p>'
content = re.findall(P_con,data2) #此处不用re.S,用了反而出错

这里需要注意,得到的数据流同样有着网址URL上的错误,Python的ISO-8859-1编码方式无法识别获取到的数据流,所以此处要对其进行编码与解码成Unicode形式,代码如下:

data2 = requests.get(html[0]).text
code = requests.get(html[0]).encoding  #查看python编码方式
data2 = data2.encode('ISO-8859-1').decode('gbk')
P_con = '<p>(.*?)</p>'
content = re.findall(P_con,data2)

1.3结果展示

至此,获取的数据流已经成型,接下来就是TXT存储与excel写入,这些代码放在总代码上。效果如下:

爱车舆情信息EXCEL

爱车新闻TXT

行业基本面信息

至此,爬虫部分完成,下面我们讲解如何与PySimpleGUI结合!

二、GUI整合

我们的效果是做成这样:


接下来讲解如何构建GUI程序!

2.1 GUI框架构建

在基础篇和进阶篇中我们构建了几个PySimpleGUI的框架,本次我们将选用较易上学且可塑性强的框架

按照惯例,还是我们的那个基本套路

引入模块   创建元素结合的layout嵌套列表 创建窗口 创建事件循环

import PySimpleGUI as sg
sg.change_look_and_feel("GreenMono")
text = sg.Text("买车网舆情信息爬取")
textinput = sg.InputText()
bt = sg.Button('爬取')
cbt = sg.Button('取消')
layout = [[text, textinput],[bt, cbt]]

首先改变此次项目的GUI背景为"GreenMono",然后建立了四个元素:TextInputText、两个Button

其中Text是标题、InputText是需要用户输入的爱车名字,比如法拉利、保时捷等。两个Button分别是开始爬取与结束GUI的按钮。

接着就是将四个元素按行方向放到layout中,下面创建一个窗体

window = sg.Window('欢迎来到早起Python', layout)

2.2逻辑循环

然后到了最核心的部分---逻辑循环,我们先看代码再讲解

while True:
    event, values = window.read()
    if event in (None'取消'):
        break      
    print('正在爬取')
    if __name__ == '__main__':
        dfcar = pd.DataFrame()
        hangqing = []  
        name = [values[0]]  
        page = 5
        #用来爬取行情基本面信息
        for i in range(page):    
            html = hangqing1(i)
            hangqing = hangqing2(html)
        with open('行情基本面.txt','a',encoding='utf-8'as f3:
            for j in range(len(hangqing)):
                str2 = hangqing[i] + '\n' + '-------------------下一条--------------'  +'\n'   #放入行情基本面信息
                f3.write(str2)
            f3.close()
        #开始爬取爱好车信息
        for i in name:
            dfcar2 = pd.DataFrame()
            neirong = []  
            for j in range(page):
                dfcar = pachong(i,j+1)[0]  
                html = pachong(i,j+1)[1]
                dfcar2 = pd.concat([dfcar2,dfcar])
                neirong = conimg(html)
            dfcar2.to_excel('{}基本行情.xlsx'.format(i),index = False)
            with open('{}舆情信息.txt'.format(i),'a',encoding='utf-8'as f2:   
                for i in range(len(neirong)):
                    str1 = neirong[i] + '\n' + '-------------------下一条--------------'  +'\n'     
                    f2.write(str1)
                f2.close()
    f2 = open('{}舆情信息.txt'.format(name[0]),encoding='utf-8')
    a = f2.read()
    sg.popup_scrolled(a,title = '舆情信息',size = (50,35)) 
    print('爬取成功')
window.close()

首先读取事件与其对应的值,但用户点击取消时,结束图形用户交互页面。除此之外,当点击爬取时,控制台将打印“正在爬取”,表示爬虫已经开始。

注意:这个过程有些电脑或笔记本可能显示未响应,我们无需点击结束进程,只需等待片刻即可。因为包过多和python的通病导致其可能出现未响应的提示。

当爬取完成时,我们可以在相对路径下看到几个文件和一个记载爱车舆情信息的滚动窗口,这部分在买车网爬虫章节有提及。最后在熟悉一个GUI元素---sg.popup_scrolled(values,title='',size=()),这个函数在基础篇中有提及。主要是用来滚动信息页面的。

三、程序打包

最后为了更方便使用,我们再讲讲如何打包

在Python中有很多打包的方法让你的GUI程序变成一个桌面上的exe文件,最常用的就是Pyinstaller,是在cmd命令窗口就下进行的。

你可以通过pip形式下下载

pip install pyinstaller

如果你的上述项目代码文件命名为:pachong.py。那么你要用下面命令进行打包

pyinstaller pachong.py

当你运行这行命令时,你会看到会有一连串的输出在滑动,这是正常的。

注意:由于这里面有pandas包,所以打包时间会很长,可能会卡在某一个点,这是正常现象

最后打包成功之后,你会在py文件所在文件夹看到一个dist的子文件夹。进去之后,找到pachong.exe文件并运行它即可。文件夹里附带了很多文件,你可以删除它。如果你为了方便只要exe文件,那么你可以运行下面的命令

pyinstaller --onefile pachong.py

这样dist文件夹里只有一个单纯的exe文件在里面。

注意:运行这个exe文件的时候,你的电脑过着笔记本可能会有防御软件阻止打开,你只需许可即可。

以上就是本次 PySimpleGUI 实战篇的全部内容,我已经将全部代码整理好,你可以在后台回复1205获取。

至此,我们已经发布了PySimpleGUI基础、进阶、实战三篇文章,相信你已经对这个库有更深的了解,在本专题接下来的文章,我们将更新更多的细节讲解,欢迎点赞、收藏、转发支持一下创作!




往期精彩回顾







关注公众号,回复关键

字领取对应资源

请把我分享给你身边更多的人

本文章转载自公众号:python-0321

首页 - Python 相关的更多文章: