基于Python实现微博抓取GUI程序
作者:萝卜大杂烩 发布时间:2021-06-01 10:59:29
标签:Python,微博,抓取
前言
在前面的分享中,我们制作了一个天眼查 GUI 程序,今天我们在这个的基础上,继续开发新的功能,微博抓取工具,先来看下最终的效果
整体的界面还是继承自上次的天眼查界面,我们直接来看相关功能
微博功能布局
我们整体的界面布局就是左侧可以选择不同功能,然后右侧的界面会对应改变
创建微博 Widget
对于右侧界面的切换,我们可以为不同的功能创建不同的 Widget,当点击左侧不同功能按钮后,对应切换 Widget 即可
我们新建一个 weibo 相关的函数,主要用来界面布局
def?weiboWidget(self):
????self.left_button_widget_3?=?QtWidgets.QWidget()
????self.weiboWebEngine?=?QWebEngineView()
????self.weiboWebEngine2?=?QWebEngineView()
????self.progressWidget?=?QtWidgets.QWidget()
????self.ciyunWidget?=?QtWidgets.QWidget()
我们还看到整体界面有一个词云,该词云是通过 matplotlib 渲染的,所以还需要创建 matplotlib 布局
#?matplotlib?绘图区域
self.figure?=?plt.figure(figsize=(7,?2))
self.canvas?=?FigureCanvasQTAgg(self.figure)??#?绘图区域放到图层canvas之中
self.gridLayout_weibo.addWidget(self.canvas,?5,?0,?1,?9)??#?图层放到pyqt布局之中
创建微博查询
接下来我们创建一个微博查询函数,同时因为我们这里需要实时更新抓取进度条,所以使用了多线程的方式
def?doWeiboQuery(self):
????weibo_link?=?self.lineEdit_weibo_link.text()
????weibo_name?=?self.lineEdit_weibo_name.text()
????weibo_page?=?self.weibo_comboBox.currentText()
????if?not?weibo_link?or?not?weibo_name:
????????QMessageBox.information(self,?"Error",?"微博链接或者用户名称不能为空",
????????????????????????????????QMessageBox.Yes)
????????return
????self.weiboWebEngine.load(QUrl(weibo_link))
????self.qth?=?WeiBoQueryThread()
????self.qth.update_data.connect(self.weiboPgbUpdate)
????self.qth.draw_ciyun.connect(self.drawCiyun)
????self.qth.weibo_page?=?weibo_page
????self.qth.weibo_link?=?weibo_link
????self.qth.weibo_name?=?weibo_name
????self.qth.start()
而主线程与子线程之间的通信,是使用信号槽的形式
def?weiboPgbUpdate(self,?data):
????self.pgb.setValue(data)
def?drawCiyun(self):
????self.canvas.draw()
????self.toolbar?=?NavigationToolbar2QT(self.canvas,?self)
????self.gridLayout_weibo.addWidget(self.toolbar,?8,?0,?1,?9)
接下来就是创建子进程函数,函数主体是爬取微博的代码
"""子进程微博查询"""
class?WeiBoQueryThread(QThread):
????#?创建一个信号,触发时传递当前时间给槽函数
????update_data?=?pyqtSignal(int)
????draw_ciyun?=?pyqtSignal()
????weibo_name?=?None
????weibo_link?=?None
????weibo_page?=?None
????total_pv?=?0
????timestamp?=?str(int(time.time()))
????def?run(self):
????????#?微博爬虫
????????try:
????????????file_name?=?self.weibo_name?+?"_"?+?self.timestamp?+?'comment.csv'
????????????my_weibo?=?weibo_interface.Weibo(self.weibo_name)
????????????uid,?blog_info?=?my_weibo.weibo_info(self.weibo_link)
????????????pv_max?=?int(self.weibo_page)
????????????pre_pv?=?100?//?pv_max
????????????for?i?in?range(int(self.weibo_page)):
????????????????my_weibo.weibo_comment(uid,?blog_info,?str(i),?file_name)
????????????????self.total_pv?+=?pre_pv
????????????????self.update_data.emit(self.total_pv)
????????????print("所有微博评论爬取完成!")
????????????print("开始生成词云")
????????????font,?img_array,?STOPWORDS,?words?=?ciyun(file_name)
????????????wc?=?WordCloud(width=2000,?height=1800,?background_color='white',?font_path=font,?mask=img_array,
???????????????????????????stopwords=STOPWORDS,?contour_width=3,?contour_color='steelblue').generate(words)
????????????plt.imshow(wc)
????????????plt.axis("off")
????????????self.draw_ciyun.emit()
????????????print("生成词云完成")
????????except?Exception?as?e:
????????????print(e)
而对于微博的具体爬取方法,这里就不再展开说明了,我是把所有微博爬虫的代码都封装好了,这里直接调用暴露的接口即可
词云制作
对于词云的制作,我们还是先通过 jieba 进行分词处理,然后使用 wordcloud 库生成词云即可
#?词云相关
def?ciyun(file,?without_english=True):
????font?=?r'C:\Windows\Fonts\FZSTK.TTF'
????STOPWORDS?=?{"回复",?"@",?"我",?"她",?"你",?"他",?"了",?"的",?"吧",?"吗",?"在",?"啊",?"不",?"也",?"还",?"是",
?????????????????"说",?"都",?"就",?"没",?"做",?"人",?"赵薇",?"被",?"不是",?"现在",?"什么",?"这",?"呢",?"知道",?"邓"}
????df?=?pd.read_csv(file,?usecols=[0])
????df_copy?=?df.copy()
????df_copy['comment']?=?df_copy['comment'].apply(lambda?x:?str(x).split())??#?去掉空格
????df_list?=?df_copy.values.tolist()
????comment?=?jieba.cut(str(df_list),?cut_all=False)
????words?=?'?'.join(comment)
????if?without_english:
????????words?=?re.sub('[a-zA-Z]',?'',?words)
????img?=?Image.open('ciyun.png')
????img_array?=?np.array(img)
????return?font,?img_array,?STOPWORDS,?words
由于很多评论当中会存在链接信息,导致制作的词云有很多高权重的英文字符,所有这里也通过正则进行了去英文字符处理
至此,我们这个微博查询功能就完成了~
结果展示
下面我们来看看最终的效果吧
来源:https://mp.weixin.qq.com/s/eeHauwcdvlG7b7C-rH_RVQ
0
投稿
猜你喜欢
- 大数据时代在编程可能需要用到一些文本内容,不可能全部写到代码里,不好更改,用户也不方便使用所以需要用到我们的数据库来保存这些数据,直接更改数
- 一、要求二、思路1.购物类buy接收 信用卡类 的信用卡可用可用余额,返回消费金额2.信用卡(ATM)类接收上次操作后,信用卡可用余额,总欠
- Flask-WTF扩展可以把处理web表单的过程变成一种愉悦的体验。一、跨站请求伪造保护默认情况下,Flask-WTF能够保护所有表单免受跨
- python3 sorted取消了对cmp的支持。python3 帮助文档:sorted(iterable,key=None,reverse
- 前言:mysql数据库在日常工作开发中经常用到的存储设备, 之前已经分享了面试过程中经常被问到的mysql优化的内容,本期就结合mysql的
- 使用Django中遇到这样一个需求,对一个表的几个字段做 联合唯一索引,例如学生表中 姓名和班级 2个字段在一起表示一个唯一记录。Djang
- 本文实例为大家分享了JavaScript实现简单计算器的具体代码,供大家参考,具体内容如下此例为简单的计算器:代码示例:<!DOCTY
- 如下所示:import datetime #获取两个日期间的所有日期 def getEveryDay(begin_date,end_date
- 前言:之前的文章我们已经开启了爬虫程序的exe之旅,但是我们最终实现的程序存在一个非常大的问题,当进行网络请求的时候,程序卡死,直到数据请求
- 表的普通字段 一对多字段 多对多字段 插入数据#插入数据def add(request):G_title=request.POST.get(
- 分享两个常用的代码生成工具:gormgenhandlergengormgen基于 MySQL 数据表结构进行生成 3 个文件:生成表的 st
- 首先呢我去安装了一个那个pytorch,然后导入一下发现:连numpy都找不到,于是我表示很生气重新安装,它说安装过了,地址是balabal
- 使用MySQL,安全问题不能不注意。以下是MySQL提示的23个注意事项:1。如果客户端和服务器端的连接需要跨越并通过不可信任的网络,那么就
- 例子:#!/bin/perlprint "Please input an string and a number by order
- 问题描述在spring-boot启动时,希望能执行相应的sql文件来初始化数据库。使用配置文件初始化数据库可以在spring-boot的配置
- 不同于以往为大家介绍的函数使用,我们利用pivot函数可以实现的方式,就是用来重塑数据使用的,在python的使用上并不常见,但是如果需要利
- 本文实例为大家分享了vue实现消息无缝滚动效果的具体代码,供大家参考,具体内容如下JSexport default {data() { &n
- 在使用SQL Server 的过程中,由于经常需要从多个不同地点将数据集中起来或向多个地点复制数据,所以数据的导出,导入是极为常见的操作.我
- Python既具有普通程序开发语言的特点,也具有Matlab语言用于数值计算的特点,,当然了数值计算是由其其强大的第三方库numpy实现的,
- 物化表首先提出一个不相关的IN子查询SELECT * FROM s1 WHERE key1 IN (SELECT common_field