基于Python實(shí)現(xiàn)微博抓取GUI程序
前言
在前面的分享中,我們制作了一個(gè)天眼查 GUI 程序,今天我們?cè)谶@個(gè)的基礎(chǔ)上,繼續(xù)開(kāi)發(fā)新的功能,微博抓取工具,先來(lái)看下最終的效果

整體的界面還是繼承自上次的天眼查界面,我們直接來(lái)看相關(guān)功能
微博功能布局
我們整體的界面布局就是左側(cè)可以選擇不同功能,然后右側(cè)的界面會(huì)對(duì)應(yīng)改變
創(chuàng)建微博 Widget
對(duì)于右側(cè)界面的切換,我們可以為不同的功能創(chuàng)建不同的 Widget,當(dāng)點(diǎn)擊左側(cè)不同功能按鈕后,對(duì)應(yīng)切換 Widget 即可
我們新建一個(gè) weibo 相關(guān)的函數(shù),主要用來(lái)界面布局
def?weiboWidget(self): ????self.left_button_widget_3?=?QtWidgets.QWidget() ????self.weiboWebEngine?=?QWebEngineView() ????self.weiboWebEngine2?=?QWebEngineView() ????self.progressWidget?=?QtWidgets.QWidget() ????self.ciyunWidget?=?QtWidgets.QWidget()
我們還看到整體界面有一個(gè)詞云,該詞云是通過(guò) matplotlib 渲染的,所以還需要?jiǎng)?chuàng)建 matplotlib 布局
#?matplotlib?繪圖區(qū)域 self.figure?=?plt.figure(figsize=(7,?2)) self.canvas?=?FigureCanvasQTAgg(self.figure)??#?繪圖區(qū)域放到圖層canvas之中 self.gridLayout_weibo.addWidget(self.canvas,?5,?0,?1,?9)??#?圖層放到pyqt布局之中
創(chuàng)建微博查詢
接下來(lái)我們創(chuàng)建一個(gè)微博查詢函數(shù),同時(shí)因?yàn)槲覀冞@里需要實(shí)時(shí)更新抓取進(jìn)度條,所以使用了多線程的方式
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()
而主線程與子線程之間的通信,是使用信號(hào)槽的形式
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)
接下來(lái)就是創(chuàng)建子進(jìn)程函數(shù),函數(shù)主體是爬取微博的代碼
"""子進(jìn)程微博查詢"""
class?WeiBoQueryThread(QThread):
????#?創(chuàng)建一個(gè)信號(hào),觸發(fā)時(shí)傳遞當(dāng)前時(shí)間給槽函數(shù)
????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):
????????#?微博爬蟲(chóng)
????????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("所有微博評(píng)論爬取完成!")
????????????print("開(kāi)始生成詞云")
????????????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)
而對(duì)于微博的具體爬取方法,這里就不再展開(kāi)說(shuō)明了,我是把所有微博爬蟲(chóng)的代碼都封裝好了,這里直接調(diào)用暴露的接口即可
詞云制作
對(duì)于詞云的制作,我們還是先通過(guò) jieba 進(jìn)行分詞處理,然后使用 wordcloud 庫(kù)生成詞云即可
#?詞云相關(guān)
def?ciyun(file,?without_english=True):
????font?=?r'C:\Windows\Fonts\FZSTK.TTF'
????STOPWORDS?=?{"回復(fù)",?"@",?"我",?"她",?"你",?"他",?"了",?"的",?"吧",?"嗎",?"在",?"啊",?"不",?"也",?"還",?"是",
?????????????????"說(shuō)",?"都",?"就",?"沒(méi)",?"做",?"人",?"趙薇",?"被",?"不是",?"現(xiàn)在",?"什么",?"這",?"呢",?"知道",?"鄧"}
????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
由于很多評(píng)論當(dāng)中會(huì)存在鏈接信息,導(dǎo)致制作的詞云有很多高權(quán)重的英文字符,所有這里也通過(guò)正則進(jìn)行了去英文字符處理
至此,我們這個(gè)微博查詢功能就完成了~
結(jié)果展示
下面我們來(lái)看看最終的效果吧

到此這篇關(guān)于基于Python實(shí)現(xiàn)微博抓取GUI程序的文章就介紹到這了,更多相關(guān)Python微博抓取內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Django OneToOneField和ForeignKey的區(qū)別詳解
這篇文章主要介紹了基于Django OneToOneField和ForeignKey的區(qū)別詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
pycharm 使用心得(六)進(jìn)行簡(jiǎn)單的數(shù)據(jù)庫(kù)管理
功能簡(jiǎn)介:pycharm自帶了一個(gè)簡(jiǎn)單的數(shù)據(jù)庫(kù)插件,可以比較方便的進(jìn)行簡(jiǎn)單的數(shù)據(jù)庫(kù)操作。2014-06-06
Python猴子補(bǔ)丁知識(shí)點(diǎn)總結(jié)
在本篇文章里小編給大家分享的是關(guān)于Python猴子補(bǔ)丁知識(shí)點(diǎn)總結(jié),需要的朋友們學(xué)習(xí)下。2020-01-01
python運(yùn)行其他程序的實(shí)現(xiàn)方法
這篇文章主要介紹了python運(yùn)行其他程序的實(shí)現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下2017-07-07
基于Python實(shí)現(xiàn)原生的登錄驗(yàn)證碼詳情
在前面的文章中,我有分享到 vue+drf+第三方滑動(dòng)驗(yàn)證碼接入的實(shí)現(xiàn),本文將要分享的是基于 python 實(shí)現(xiàn)原生的登錄驗(yàn)證碼,需要的朋友可以參考一下2021-10-10
Python實(shí)現(xiàn)數(shù)據(jù)可視化案例分析
這篇文章主要介紹了Python實(shí)現(xiàn)數(shù)據(jù)可視化案例分析,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08
django-rest-swagger對(duì)API接口注釋的方法
今天小編就為大家分享一篇django-rest-swagger對(duì)API接口注釋的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08

