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。

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

本文来自企鹅号 - 时空密语媒体

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏有趣的django

CRM客户关系管理系统(八) 第八章、只读字段处理和filter_horizontal的实现

20100
来自专栏技术博文

关于微信二次分享,标题变链接的解决方法(二)----代码部分

声明: 本篇博文只是个人工作中的分享总结,仅代表个人观点,虽然解决了不少网友的问题,但同时也引来了一些网友的不满,所以特此声明,当您遇到本博文解决不了的问题,可...

37160
来自专栏魏艾斯博客www.vpsss.net

代码实现 WordPress 文章中英文数字间自动添加空格

26930
来自专栏云瓣

通过一个demo了解Redux

TodoList小demo 效果展示 项目地址 (单向)数据流 数据流是我们的行为与响应的抽象;使用数据流能帮我们明确了行为对应的响应,这和react的状态可预...

346100
来自专栏封碎

Android的webview研究

最近做的项目大量用到了 webview ,用网页来布局。 Android 的 webview 是基于 webkit 内核,不过他的运行效果和 firefox 上...

13610
来自专栏深度学习之tensorflow实战篇

python2.7进行爬虫百度POI代码(划分小网格算法)

查询许久,最终选择一个,之前一直py3.6不成功,换了2.7就好多了。如果有重复去下重即可。 这里面非常重要的基类对象的init()方法与超类方法,将在下面进行...

50270
来自专栏更流畅、简洁的软件开发方式

【开源】QuickPager 分页控件的内部结构,和OO原则与设计模式

关键字:提出需求、需求分析、原则、设计模式、索引      先说一下讨论的范围:使用数据库保存信息的项目,b/s结构,asp.net编写。请不要讨论这个范围之外...

21860
来自专栏大史住在大前端

【Recorder.js+百度语音识别】全栈方案技术细节

技术栈:React+recorder-tool.js +recorder.js + Express + Baidu语音识别API

54530
来自专栏小狼的世界

学习使用YUI3

对YUI一直很有好感,最近开始看了看YUI CSS GRID,发现这个理念非常好,非常有利于我们工作效率的提高,特别是熟悉了这套CSS之后,我们就不必每一个项目...

9020
来自专栏地方网络工作室的专栏

Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(八)渲染一个列表出来先

Vue2+VueRouter2+Webpack+Axios 构建项目实战2017重制版(八)渲染一个列表出来先 前情回顾 在上一篇博文《Vue2+VueRout...

30860

扫码关注云+社区

领取腾讯云代金券