本軟件工具僅限於學術交流使用,嚴格遵循相關法律法規,符合平台內容合法合規性,禁止用於任何商業用途!
一、背景介紹
1.1 爬取目標
您好!我是@馬哥python説,一枚10年+程序猿,現全職獨立開發。
我用Python獨立開發了一款爬蟲工具:爬油管評論軟件。作用是:爬取油管指定視頻下的評論數據,支持批量視頻的採集。
包含10個關鍵字段:
1. cid(評論id)
2. text(評論內容)
3. time(評論時間_相對)
4. author(評論者暱稱)
5. channel(評論者頻道)
6. votes(評論點贊數)
7. replies(評論回覆數)
8. time_parsed(評論時間轉換)
9. time2(評論時間_絕對)
10. video_id(視頻id)
軟件是通過調用YouTube的網頁接口,不是模擬操作瀏覽器,所以穩定性較高!
開發成界面軟件的目的:方便不懂編程代碼的小白用户使用,無需安裝python,無需改代碼,雙擊打開即用!
軟件運行界面:
《目標視頻.xlsx》模板中的填寫:
也就是説,在目標視頻文件中填入了5個待爬視頻,然後在軟件界面上選擇爬這5個視頻的前30條熱門評論。所以,採集結果csv文件中會自動導出150條熱門評論,如下:
爬取結果截圖:
以上。
1.2 演示視頻
軟件使用過程演示:【爬蟲演示】爬油管評論軟件v3.0版
1.3 軟件説明
幾點重要説明:
- 專為文科生研發,Win系統、Mac系統均可直接運行,無需配置python環境
- 軟件通過接口爬取,並非通過模擬瀏覽器等RPA類工具,穩定性較高!
- 軟件運行完成後,會在當前文件夾(即,軟件所在文件夾)生成csv結果文件
- 爬取過程中,每爬一頁,存一次結果。並非爬完最後一次性保存!防止因異常中斷導致丟失前面的數據(每頁請求間隔1~2s)
- 爬取過程中,有log文件詳細記錄運行過程,方便回溯
- 採集結果有10個字段,含:cid(評論id),text(評論內容),time(評論時間_相對),author(評論者暱稱),channel(評論者頻道),votes(評論點贊數),replies(評論回覆數),time_parsed(評論時間轉換),time2(評論時間_絕對),video_id(視頻id)
以上。
二、代碼概要
2.1 調用接口
為保護軟件原創版權,不開放核心爬蟲邏輯代碼。
最後,把json數據轉出到csv文件:
self.tk_show('[第{}/{}個][{}][{}]comment:{}'.format(video_idx, video_id_total, video_id, cnt, comment['text']))
with open('./jsons/{}.json'.format(video_id), 'a+', encoding='utf-8') as f:
f.write(json.dumps(comment, ensure_ascii=False))
f.write('\n')
我採用csv庫保存結果,實現每爬一條存一次,防止中途異常停止丟失前面的數據。
完整代碼中,還含有:讀取配置判斷、循環結束條件判斷、拼接頻道URL、try異常保護、日誌記錄等關鍵實現邏輯。
另外,魔法是一切的前提,此處不便多説!
2.2 軟件界面模塊
主窗口部分:
# 創建主窗口
root = tk.Tk()
root.title('爬油管評論軟件v3.0 | 馬哥python説 |')
# 設置窗口大小
root.minsize(width=850, height=650)
# 左上角圖標
root.iconbitmap('mage.ico')
輸入控件部分:
# 爬取數量
tk.Label(root, text='爬取數量:').place(x=30, y=125)
comment_num = tk.Spinbox(root, from_=-1, to=9999999, increment=1, width=10, font=('微軟', 15))
comment_num.place(x=100, y=125, anchor='nw')
tk.Label(root, fg='red', text='每個視頻爬前幾條評論,-1代表爬取全部').place(x=240, y=125)
運行日誌部分:
# 運行日誌
tk.Label(root, justify='left', text='運行日誌:').place(x=30, y=280)
show_list_Frame = tk.Frame(width=780, height=260) # 創建<消息列表分區>
show_list_Frame.pack_propagate(0)
show_list_Frame.place(x=30, y=310, anchor='nw') # 擺放位置
底部版權部分:
# 版權信息
copyright = tk.Label(root, text='@馬哥python説 All rights reserved.', font=('仿宋', 10), fg='grey')
copyright.place(x=290, y=625)
以上。
2.3 日誌模塊
好的日誌功能,方便軟件運行出問題後快速定位原因,修復bug。
日誌核心代碼:
def get_logger(self):
self.logger = logging.getLogger(__name__)
# 日誌格式
formatter = '[%(asctime)s-%(filename)s][%(funcName)s-%(lineno)d]--%(message)s'
# 日誌級別
self.logger.setLevel(logging.DEBUG)
# 控制枱日誌
sh = logging.StreamHandler()
log_formatter = logging.Formatter(formatter, datefmt='%Y-%m-%d %H:%M:%S')
# info日誌文件名
info_file_name = time.strftime("%Y-%m-%d") + '.log'
# 將其保存到特定目錄
case_dir = r'./logs/'
info_handler = TimedRotatingFileHandler(filename=case_dir + info_file_name,
when='MIDNIGHT',
interval=1,
backupCount=7,
encoding='utf-8')
日誌文件:
以上。
END、原創聲明
工具【爬油管評論軟件】首發於眾公號"老男孩的平凡之路",歡迎交流!!