PyQt5整合Scrapy和matplotlib实现可视化爬虫by墨阳剑(一)

前言:

之前花费2个月左右的碎片时间,基于python3的pyqt5和scrapy爬虫框架、matplotlib图表,实现了一个可视化的爬虫。并通过pyinstaller 打包成exe可执行程序。希望让所有无编程基础人都可以在window 64位操作系统使用。

首先声明我并不是专业从事python 开发。是一个略懂后端的前端开发。很多东西都是自己摸索。有误的地方请指正。大神请飘过~,涉及技术模块整合功能较多,坑也多。预计篇幅较长,本着尽可能的详尽,不迷惑别人原则(能把一个东西的来龙去脉写的大部分人能看懂也是一项技术活,第一次搞这个当是一个锻炼吧)。有啥疑问可以给我留言,我再修正一下,希望更多的人能看懂,能有帮助。先暂定分5部分吧。内容太多,先一点一点更新吧,源码1.0版先放出来页底,不包含matplotlib实现的可视化图表。2.0版会把matplotlib加上,这个功能还有bug,不稳定。

首先致敬CSDN大神吧,好多东西都是参考大神总结的经验代码。:

https://blog.csdn.net/La_vie_est_belle/article/details/102539029

https://blog.csdn.net/liqkjm/article/details/87983671

       主界面大概长这样子:

        

Part One 概述

1、需求目的

设计一个可视化的百度地图api爬虫,通过搜索关键字,调取百度地图api接口,获取指定区域内的所有数据。然后将获取的数据打包成excel存到本地。放虫搞度娘。希望度娘看到不要拿刀砍我。

2、依赖条件:

        ① 百度地图api接口文档

              百度地图其实已经开放搜索数据访问接口。只需要按照他的api文档接口发送请求即可获取相应的数据。

              链接:百度地图开放平台

              接口文档:http://lbs.baidu.com/index.php?title=webapi/guide/webservice-placeapi

               

         ② 百度地图开放平台ak

             因为每次发get请求都需要携带申请的ak,如果没有ak就不会返回数据。所以建议自行申请的ak,我的默认ak每天只能2千次很快就爆了,就不能使用了。

             申请链接:http://lbsyun.baidu.com/apiconsole/key?application=key

3、运行环境:

      1、python版本:python3 不用多说

      2、依赖的包:PyQt5(可视化UI界面)、scrapy(爬虫框架)、matplotlib(可视化图表库)、openpyxl(excel相关)、numpy(matplotlib可视化图表数学计算)、pandas(excel相关)

      3、推荐IDE:pycharm

4、整合的技术

       1、PyQt5

              ①用到的组件: QLabel ,QLineEdit, QPushButton, QTextEdit, QTextBrowser, QHBoxLayout, QHBoxLayout ,QCheckBox

              ②通信:PyQt5 自定义信号通信,多窗口通信。

              ③多线程:PyQt5多线程QThread

         2、scrapy爬虫框架

               ①爬虫框架就不细说了主要是玩这个,这个资料到处都是

         3、matplotlib

               ①matplotlib是源于matlib的,倾向于数学计算建模,在python的包中,依赖numpy包进行数学运算。挺复杂的

               ②柱状图,matplotlib中的bar实现柱状图的展示

               ③animate动画,应用中为了让数据增长动态展示用到了matplotlib自带的动画功能,这块比较难搞

         4、pyinstaller打包

                pyinstaller 专门用于打包python应用到exe可执行程序。坑也比较多。我第一次打包出来的程序直接被360当病毒给干死了,擦。第二次打包直接无限弹窗口,我了个擦。。。

         5、python 核心技术

                 1、python 多线程、多进程技术

                 2、python 队列通信技术,用于多进程,多线程通信

 

5、实现思路

        本来想画个流程图,想想还是算了,线程太多,画出来估计快成spider 蜘蛛网了,乱糟糟的。直接说几条流程思路就对了,具体的模块具体在讲。

        ①PyQt5画出来界面后,用户在界面上操作,输入要搜索的关键字、百度的ak、通过选择组件选择要爬取数据的省份、爬取的数据存储的本地路径,还有2个队列(一个用于在界面中取scrapy的日志信息并在界面显示简称A队列,一个用于告诉scrapy要打开哪个省的数据监控中心的matplotlib柱状图汇总表简称B队列),将这些关键信息在点击页面开始爬取按钮的时候传递给爬虫。

        ②爬虫获取到①步的关键信息进行请求百度地图接口获取数据,并在管道内将爬取的数据写入传入的指定路径data.xlsx,同时将爬取的信息塞入①传递过来的A队列,让①的界面显示获取到数据,并当做日志在界面右侧的框中显示爬取信息。

        ③爬虫开启后,点击页面上的数据监控中心。获取之前选择要爬取的省份。并在B队列中通知scrapy 要打开哪个省的数据监控中心,并在scrapy中开启一个新线程,将scrapy爬取的数据传递给线程,用于计算当前省份每个市的的数据量。

        ④在③的线程中开启matplotlib绘图,将计算处理好的数据传递给matplotlib用于展示,当中包含了动画效果

6、注意的点:

       ① 不能通过命令行开启 scrapy crawl <spider> 其实命令行是通过环境变量开启scrapy ,也就是说用户本地存在scrapy框架,要打包成通用的exe,不能保证每个用户本地都有scrapy不现实。需要通过脚本启动

       ②pyqt5有个奇怪的特性,比如开启子线程,并且把页面中的组件引用扔给子线程,在子线程中你可以拿主线程中的数据,但你不能在子线程中通过传递过来的组件引用,取修改主线程中PyQt5组件的样式。会遇到偶现卡死的bug
        ③在pyqt5中用脚本开启scrapy框架,一定要把get_project_settings()这句传递给scrapy 用于加载默认配置,如果不传递,scrapy就只知道爬数据,不管什么管道什么中间件,什么处理封装item数据。

settings = get_project_settings()
process = CrawlerProcess(settings)

        ⑤pyinstaller 打包pyqt的时候,如果用到多进程一定要加上这句话 multiprocessing.freeze_support(),要不然打包后窗口一个接一个往外蹦。。。

if __name__ == '__main__':
    multiprocessing.freeze_support()
    app = QApplication(sys.argv)
    yangyang = SpiderForTanYangShi()
    yangyang.show()
    sys.exit(app.exec_())

  7、总结心得:

 1、其实写个爬虫其实对python web服务技能提高不多,但是会基本把python 基础的核心都用到了。(流程控制,对象,继承,多线程,多线程,队列通信)

 2、学习一门语言或者使用一门技术,找网上找资料无可避免的,但是你知道最痛苦的什么?你遇到个关键问题,在百度搜到10个相关解答,但每一个都没提到,或者含糊一概而过,说的不明不白。搞得一头雾水。买本书吧,打开目录,就压根没有。我擦。所以以你的上帝视角去写东西,很可能以偏概全。你感觉很简单的东西,可能正是别人迷惑的东西。所以说写的能让大部分相关的人看懂,是一件不容的事情。如果大部分人看不懂,那还不如不写,浪费别人时间给别人增加痛苦。

 3、如果有不详尽的地方,可以在下方留言共同探讨。共同进步吧。

8、预告目录

      part one 总结一下项目的来龙去脉,需要哪些依赖条件。需要的环境。大致的思路。

      part two PyQt5界面的画图,组件布局、多窗口通信,给scrapy 传值,多线程取scrapy日志

      part three scrapy 爬取百度地图数据,并写入excel,根据B队列开启matplotlib图表

      part four matplotlib 柱状图、animate动画

      part five pyinstaller 打包成exe可执行文件

                                                                                                                                         于12月29日,明天星期一不想上班的夜晚

后续继续更新。。。。

parttwo 传送门:https://blog.csdn.net/qq_30613521/article/details/103758609

1.0版代码:

链接:https://pan.baidu.com/s/1ciSKHndU7FD8-EHpOu9sPg 
提取码:u0mi

说明:main.py引用了很多无效的包是为了给pyinstaller打包用

感谢支持!

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值