# 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 (疫情剛爆發) |
| ------------------------------------ | ------------------------------------ |
|  |  |
+ `popular_words.json`: 熱門關鍵字結果。
```json
{
'口罩': 718,
'武漢': 684,
'疫情': 555,
'肺炎': 431,
'確診': 348,
'日本': 260,
'病例': 238,
......
}
```
+ 由上述結果可見,相較於2019/12/27~2019/12/29,於 2020/01/29~2020/01/31 期間,人們在八卦板熱烈討論疫情相關議題。