呀呀呀呀呀~今天的小分享貌似只通過新浪微博涉獵熱點...於是我就在想,如果大家上班摸魚[先聲明,我從不摸魚!],又不方便打開新浪那麼大的logo界面八卦,就可以通過命令行一鍵實時觀察我們的熱搜榜。嘻嘻嘻,我可真skr小機靈鬼呢!效果如下:
思考
這個功能在腦殼裡萌芽~就得思考如何實現,其實大概思路非常簡單
獲取實時熱搜榜數據將實時數據在圖形界面中顯示出來
但是,具體的實現邏輯以及細節處理在編程中仍然是值得思考的東西~於是,我們就開始叭!
爬爬爬
要緊之事,就是來爬數據。跟著我左手右手一起打開微博,查看完整的微博熱搜榜,連結如下:https://s.weibo.com/top/summary
需求如下:獲取 熱搜序號,熱搜關鍵字,熱搜點擊量
解析頁面
明確需求之後不要捉急,我們需要解析頁面
通過F12打開開發者工具select選中熱搜榜
解析結果:整個熱搜榜數據就是一個table結構,每一條熱搜都是table下的一條的tr
但是目前,我們只看到了大體的框架,還需進一步確認數據是否在 tr 中,以 李佳奇的牙 這條為例。沒毛病,就在這。
但是仍然不要膨脹奧,記得確認數據是否在該url的network或者preview中。
奧拉~大家發現這個數據也沒涉及到啥反爬~所以今天為了讓大家有額外的收穫,我們使用類來實現該過程[也是為了後面~的騷操作]。
擼阿擼代碼
import requests # 使用 requests 進行請求數據from lxml import etree # 使用 lxml 進行解析數據# 定義 WbHot 類class WbHot(object):# 定義構造方法,初始化 url 以及 headers def __init__(self): self.url = "https://s.weibo.com/top/summary?cate=realtimehot" self.headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"} # 定義 獲取html文本數據 方法 def get_hot_html(self): # 發送請求 hot_response = requests.get(url=self.url, headers=self.headers) # 接收文本數據 hot_html = hot_response.text # 將數據返回 return hot_html # 解析 html 頁面 def parse_html(self): # 獲取 html文本 數據 hot_html = self.get_hot_html() # 將 html文本 轉為可解析的html對象 hot_html = etree.HTML(hot_html) # 通過xpath定位到 tr對象列表(裡面每個元素都為一個熱搜對象) pos_tr = hot_html.xpath('//div[@id="pl_top_realtimehot"]/table/tbody/tr') # 定義關鍵詞列表 hot_title_li = [] # 定義點擊量列表 hot_click_li = [] # 定義序號列表 hot_order_li = [] # 遍歷tr對象列表,注意:去除第一個tr對象,因為其是箭頭往上走的。 for per_tr in pos_tr[1::]: # 獲取每條熱搜關鍵字 且為[] hot_title = per_tr.xpath('./td[@class="td-02"]/a/text()') # 但是不想 hot_title_li 變為 [[],[]]..所以使用extend進行擴展 hot_title_li.extend(hot_title) # 獲取每條熱搜點擊量 hot_click = per_tr.xpath('./td[@class="td-02"]/span/text()') hot_click_li.extend(hot_click) # 獲取每條熱搜序號 hot_order = per_tr.xpath('./td[@class="td-01 ranktop"]/text()') hot_order_li.extend(hot_order) # 將3個列表返回 return hot_title_li,hot_click_li,hot_order_liwb_hot = WbHot()wb_hot.parse_html()
OK,代碼在此處打住,我們來看下三個列表是啥玩意兒
我們發現,三個列表中一一對應的數據實際上就是每條熱搜的數據。比如:["李佳奇...","5008...","1"]
如果只要這樣子表示,我們通過zip()就可以實現。但是,事實並沒有我們想像的那麼簡單,如果需要在圖形界面中顯示出來,我們需要將每條熱搜的數據以字符串表示出來,比如:"李佳奇...5008...1"
代碼實現如下:
def cope_data(self): # 接收三個列表的數據 title_li,click_li,order_li = self.parse_html() # 將其打包每一條數據 all_data = list(zip(title_li,click_li,order_li)) # 將列表中的數據拼接為字符串 c_data = [" ".join(list(data)) for data in all_data] # 將字符串列表返回 return c_datawb_hot = WbHot()wb_hot.cope_data()
爬虫部分就完成啦~但是注意,在這裡不要使用主程序入口,否則在打造頁面時沒法訪問到爬蟲數據。
打造界面
現在我們新建一個 xlwb_test.py 文件來實現圖形界面的繪製。在 python 中,有 PyQt5 或者 Tkinter 等庫實現圖形界面,也就是在桌面彈出一個窗口,跟你打開的app類似~
在今天,我們使用PyQt5 來實現,代碼如下:
import sysfrom PyQt5.QtGui import QIconfrom PyQt5.QtWidgets import (QWidget, QToolTip,QPushButton, QApplication)from PyQt5.QtGui import QFontfrom weibo import WbHotclass Example(QWidget): def __init__(self): super().__init__() self.initUI() # 界面繪製交給InitUi方法 def initUI(self): # 調用wb,接收處理好的字符串列表 wb_hot = WbHot() h_data = wb_hot.cope_data() # 這種靜態的方法設置一個用於顯示工具提示的字體。我們使用10px滑體字體。 QToolTip.setFont(QFont('SansSerif', 10)) # 初始化count,來控制移動窗口的位置 count = 0 # 循環遍歷前30條熱搜 for data in h_data[:30]: # 創建一個PushButton並為他設置一個tooltip btn = QPushButton(f'{data}', self) # btn.sizeHint()顯示默認尺寸 btn.resize(btn.sizeHint()) # 移動窗口的位置 btn.move(0, 20+count) count+=20 # 設置窗口的位置和大小 self.setGeometry(300, 70, 400, 600) # 設置窗口的標題 self.setWindowTitle('今日熱搜榜') # 設置窗口的圖標,引用當前目錄下的web.png圖片 self.setWindowIcon(QIcon('wb.png')) # 顯示窗口 self.show()if __name__ == '__main__': # 創建應用程式和對象 app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
又快迎來小長假~思緒已經開始起飛,希望自己在國慶可以讀兩本可以讀懂並有收穫的書,還在涉獵中。當然別忘emmm點讚~康桑思密達