Python实现一个带图形界面的爬虫

Python 是一个很简介高效的语言,许多的 Python 爱好者(包括我在内)都很喜欢用 Python 做爬虫,为什么会喜欢写爬虫,我对爬虫的感觉就是:它能给我带来无限的数据,看着数据一点一点地从网络上保存下来,内心肯定是激动的,感觉每条数据都是一笔钱。当然绝大部分人都不会只爬数据而不做其他的一些处理,因为这么多的数据摆在你面前,它却对你没有用处,所以爬虫获取到的数据有的会被进行处理之后做成网站,更多的是对数据进行分析,由于数据分析在企业中的作用很大,所以数据分析师一直都是一个热门的职业。在我之前发的文章中,大部分也是爬虫,但是这几个爬虫都存在很大的问题,就是爬虫的目标不方便修改,我们通常需要对特定主体的数据进行爬取,而爬虫又不只是一次性的程序,所以需要经常修改爬虫的目标,而我之前做的爬虫都没有直观的方式修改目标,每次修改都需要对程序进行改写,这样做很容易使得程序运行出错,于是今天的爬虫将会具有图形化用户界面,可以直观地指定爬虫目标。

Python 拥有长久的发展历史,GUI 编程也毫不逊色,Python 中有几个常见的图形库。简单介绍一下:

Tkinter:Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多数的 Unix 平台下使用,同样可以应用在 Windows 和 Macintosh 系统里。Tk8.0 的后续版本可以实现本地窗口风格,并良好地运行在绝大多数平台中。

wxPython:wxPython 是一款开源软件,是 Python 语言的一套优秀的 GUI 图形库,允许 Python 程序员很方便的创建完整的、功能键全的 GUI 用户界面。

Jython:Jython 程序可以和 Java 无缝集成。除了一些标准模块,Jython 使用 Java 的模块。Jython 几乎拥有标准的Python 中不依赖于 C 语言的全部模块。比如,Jython 的用户界面将使用 Swing,AWT或者 SWT。Jython 可以被动态或静态地编译成 Java 字节码。

以上简介摘自菜鸟编程

介绍完 Python 的 GUI 图形库,接下来来介绍一下本文要写的爬虫:

本文的爬虫目标网站是百度百科,百度百科上面对于大多数关键词都用统一的格式拼接 URL,并且最重要的一点就是百科词条的主要内容可以直接通过 HTML 获取,没有经过一些 js 渲染,大幅减少了编写爬虫的难度和复杂度。本爬虫使用的图形库是 Tkinter,这个图形库使用起来简单,缺点就是控件太少,难以做出太复杂又多功能的图形界面,不过这没关系,本爬虫只用到了极少的接口。爬虫 95% 的代码都是实现爬虫逻辑和框架的,所以 Tkinter 的缺点并不影响。

看一下爬虫简陋的 GUI 界面吧:

主要的作用是需要爬取的百科词条可以在文本框内填写,并可以一次填写多项。

由于版面有限,本文只讲解有特点的地方,完整的源代码可以在 Github 上查看并下载运行:https://github.com/JIMhackKING/BaikeSpider,运行时只要在文件夹所在命令行输入:

爬虫可以一次爬取多个关键词,只需要用逗号或分号隔开就行,并且符号不分中英文,这就方便了中英文输入时可以不需要切换中英文符号。实现的代码:

用正则表达式就可以实现了,无论是一种符号输入还是多种符号混合输入都可以正确处理并分割字符串,获取到所有的关键词。这里要对正则表达式语法里面的中文符号进行解码,因为从 Tkinter 的文本输入框控件中获取到的字符串是 Unicode 编码的,如果不处理会导致分割了错的字符串。

在爬虫主调度类SpiderMain中,实现了两个方法:

这两个方法都是爬虫的主调度方法,两个方法的主逻辑相同,只不过一个是单线程运行爬虫,另一个是多线程运行爬虫,多线程的爬虫方法中,内嵌了三个函数:

这三个函数的作用在文档字符串中也已经说明了,爬虫一共用到了两个队列,一个用于存储将要被爬取的 URL,另一个用于存储待解析的 HTML 文档,之后分别创建三个线程运行这三个函数,这样可以使得获取并下载 HTML 和解析 HTML 可以同时进行,减少了大量的 IO 等待时间,并且下载函数使用了五个线程,也就是有五个线程同时下载 HTML ,这可以快速地解决掉大量的待爬取 URL。

由于篇幅有限,本篇爬虫的介绍就到此为止了,其实本文对爬虫的介绍在代码中都已经详细地进行注释说明了,以文字来介绍并讲解一个项目是有难度的,所以最好的阅读方式就是边阅读代码边练习,并通过注释了解每一段代码的作用。

晚安!

发发

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20171210G015OE00?refer=cp_1026

扫码关注云+社区