自己做 PTT APP (二) 爬蟲— iOS

Henry Huang
66henry 程式筆記
4 min readAug 13, 2019
https://www.ptt.cc/bbs/index.html

在爬蟲之前,先分析網址

https://www.ptt.cc

這是固定的前綴

如果是看板的列表,後面會加上 /bbs

如果是分類的群組,則是加上 /cls

https://www.ptt.cc/bbs/板名/https://www.ptt.cc/cls/群組代碼/
chrome F12 開發者模式

這裡以熱門看板為例

如上圖可以看到每個熱門看板都包在 main-container 的 div 底下,

其 class 是 b-ent,這部分就是我要的內容。

底下分別有 board-name / board-nuser / board-class / board-title

分別代表 英文板名 / 人氣 / 分類 / 板標

然後我要把這些內容變成我 APP 的樣子,如下圖

48PT 看板頁

簡單介紹爬蟲使用到的工具,因為只有五週的時間所以在網路層和抓取 html 內容的部分使用套件,減少造輪子所花費的時間。

Alamofire ( iOS 好用的網路層套件)

這邊現在回頭來看覺得應該用自己寫的網路層比較好,因為 DataRequest 也是 Alamofire 的 class,這樣寫 wrapper 意義不大。(要再把 DataRequest 拆解包裝? 那乾脆就用自己寫的吧...)

透過將網址丟給 Alamofire 處理,得到 html 資訊,再將整包 html 丟給 Kanna 幫忙解析出 XPATH。

其中 Kanna 使用上關鍵的語法在於底下這段

doc.xpath(#"//*[@id="main-container"]/div[2]/div/a"#)

[@id=”main-container”] 因為 id 具有唯一性,所以會得到帶有這個 id 的分支,接著拿到其第二個 div ( 這邊 XPATH 是從 1 起算, 非習慣的 array 從 0 起算),再拿到底下的所有 div,這些 div 底下的 a 標籤。(未指定特定分支就會得到底下所有分支)

可以看著下圖再做個對照

這樣遍歷會得到

print(url.content)```
Optional(“\n Gossiping\n 22401\n 綜合\n ◎[八卦] 新聞未依格式發文會被刪除\n “)
Optional(“\n C_Chat\n 3800\n 閒談\n ◎[希洽] 2018人氣ACGN徵文票選開始\n “)
```
print(url["href"])
```
Optional("/bbs/Gossiping/index.html")
Optional("/bbs/C_Chat/index.html")
```

拿到這些內容,再拆解一下,就可以隨自己喜好安排熱門看板如何呈現了!

下篇待續~

參考資料:

--

--