在前面的分享中,我們制作了一個天眼查 GUI 程序,今天我們在這個的基礎上,繼續開發新的功能,微博抓取工具,先來看下最終的效果
圖片
整體的界面還是繼承自上次的天眼查界面,我們直接來看相關功能
我們整體的界面布局就是左側可以選擇不同功能,然后右側的界面會對應改變
對于右側界面的切換,我們可以為不同的功能創建不同的 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
由于很多評論當中會存在鏈接信息,導致制作的詞云有很多高權重的英文字符,所有這里也通過正則進行了去英文字符處理。
至此,我們這個微博查詢功能就完成了~
本文鏈接:http://www.tebozhan.com/showinfo-26-15886-0.htmlPython 制作微博抓取 GUI 程序
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: 接口請求重試的八種方法,你用哪種?
下一篇: Nacos注冊中心有幾種調用方式?