自己做 PTT APP (二) 爬蟲— iOS
Published in
4 min readAug 13, 2019
在爬蟲之前,先分析網址
https://www.ptt.cc
這是固定的前綴
如果是看板的列表,後面會加上 /bbs
如果是分類的群組,則是加上 /cls
https://www.ptt.cc/bbs/板名/https://www.ptt.cc/cls/群組代碼/
這裡以熱門看板為例
如上圖可以看到每個熱門看板都包在 main-container 的 div 底下,
其 class 是 b-ent,這部分就是我要的內容。
底下分別有 board-name / board-nuser / board-class / board-title
分別代表 英文板名 / 人氣 / 分類 / 板標
然後我要把這些內容變成我 APP 的樣子,如下圖
簡單介紹爬蟲使用到的工具,因為只有五週的時間所以在網路層和抓取 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")
```
拿到這些內容,再拆解一下,就可以隨自己喜好安排熱門看板如何呈現了!
下篇待續~
參考資料: