# ptt-crawler ## 開發環境 + **Language:** Python ### Files tree ``` ├── PgCrawler.py # [執行檔] PTT 逐頁批次爬蟲 ├── PgWordcloud.py # [執行檔] 分析熱門字詞 ├── crawlerPtt.py # 爬蟲程式 ├── wordcloudPtt.py # 熱門字詞程式 └── requirements.txt # 套件安裝列表 ``` ## Install Package ``` $ pip install -r requirements.txt ``` ## Execution ### 一、PTT 逐頁批次爬蟲 #### 如何執行 ``` $ python PgCrawler.py <board> <iter> <each_pages> ``` + `board`: 要爬的 PTT 看板英文名稱 (ex: Gossiping, HatePolitics) + `iter`: 要分批幾次爬蟲 + `each_pages`: 每次往前爬幾頁 + **delay:** 在 `crawlerPtt.py`內能設定每爬一篇文章後的 delay 秒數 (`self.delay`,目前設定0.5秒),藉由延遲來防止過於頻繁的爬蟲。 + 目前不清楚 PTT 站方是否有針對過於頻繁的爬蟲,而做出封鎖的準則。因此盡量不要過於頻繁執行本爬蟲模組。 + 若要做長遠分析,建議定時執行爬蟲 (ex. 每天爬今天&昨天的文章),如此單天內也不會爬蟲過量。 #### Example ``` $ python .\PgCrawler.py Gossiping 10 5 ``` + 以此為例,程式會爬 PTT 八卦版(Gossiping),**由新至舊爬 50 頁,每爬 5 頁就存檔一次。** #### 輸出結果 + 檔案會自動存在 `/data/看板名稱/文章日期.json` 內,同一個日期發布的文章會被歸類在同一檔案內。 + Example: https://www.ptt.cc/bbs/HatePolitics/M.1609688214.A.8A4.html ```json { "M.1609688214.A.8A4": { "board": "HatePolitics", "title": "Re: [討論] 被蔡英文這樣搞,好像當中國人也沒啥不好", "datetime": "2021-01-03 23:36:52", "content": "中共軍機不斷繞臺,\n中共就是....", "message": ["柯文哲 賴清德 陳水扁", "柯文哲比蔡英文好 為啥只有4% 哈哈哈哈 智障才覺得柯能"] } } ``` ### 二、分析熱門字詞 #### 如何執行 > 注意:需執行 PTT 逐頁批次爬蟲後再執行此模組 ``` $ python .\PgWordcloud.py <Board> <OldStartDate> <OldEndDate> <NewStartDate> <NewEndDate> <N> ``` + `board`: 要爬的 PTT 看板英文名稱 (ex: Gossiping, HatePolitics) + `OldStartDate`: 舊的文章集起始日期 + `OldEndDate`: 舊的文章集結束日期 + `NewStartDate`: 新的文章集起始日期 + `NewEndDate`: 新的文章集結束日期 + `N`: 文章集要各取多少個熱門關鍵字 #### 設定檔案 + `/jieba/stopwords.txt`: jieba 套件停用詞。 + `/jieba/keywords.txt`:指定文章關鍵字列表,只擷取文章內容有出現在名詞列表的文章。 + `/wordcloud/wc_stopwords.txt`: 篩掉指定字詞(ex. 中國、中共…),不輸出到文字雲,亦不列入熱門字詞。 #### 實作概念 1. **old_most_common** = 指定日期區間(舊)的前500名熱門關鍵字 2. **new_most_common** = 指定日期區間(新)的前500名熱門關鍵字 3. 取出所有存在 **new_most_common** ,但不存在 **old_most_common** 的關鍵字 #### Example - 2020/01/29 ~ 2020/01/31 熱門關鍵字 + 八卦版第一篇討論武漢肺炎的文章為「 [[問卦] 武漢疑爆發非典型肺炎冠狀病毒群聚感染?](https://www.ptt.cc/bbs/Gossiping/M.1577730263.A.177.html)」,其發文日期為 2019/12/31,因此以該日期為分水嶺。 + 輸入以下指令後,模組會尋找在 `/data/Gossiping/` 資料夾內依日期尋找 `2019-12-27.json`~`2019-12-29.json`,及 `2020-01-29.json`~`2020-01-31.json` 的檔案,若沒有找到該日期檔案則會略過,但兩個時間區間至少要讀到一個 json 檔,否則無法分析。 ``` $ python .\PgWordcloud.py Gossiping 20191227 20191230 20200129 20200131 500 ``` ##### 輸出結果 + `wordcloudOld.png` & `wordcloudNew.png`: 新舊文章集合的文字雲 | 2019/12/27~2019/12/30 (疫情爆發前) | 2020/01/29~2020/01/31 (疫情剛爆發) | | ------------------------------------ | ------------------------------------ | | ![](https://i.imgur.com/ckj8nEn.png) | ![](https://i.imgur.com/PAr45GA.png) | + `popular_words.json`: 熱門關鍵字結果。 ```json { '口罩': 718, '武漢': 684, '疫情': 555, '肺炎': 431, '確診': 348, '日本': 260, '病例': 238, ...... } ``` + 由上述結果可見,相較於2019/12/27~2019/12/29,於 2020/01/29~2020/01/31 期間,人們在八卦板熱烈討論疫情相關議題。