iT邦幫忙

0

巴哈瀑布流 Side Project 開發筆記 -5:巴哈場外休憩區C頁爬蟲(樓層內文顯示)

  • 分享至 

  • xImage
  •  

0

巴哈場外休憩區C頁爬蟲 - 樓層內文顯示

接下來是C頁的內容,也是閱覽器的重點,畢竟大家不是看看標題就飽了對吧?
我是先做顯示文章的主樓,再加入顯示主樓留言區的功能,最後再將所有樓層的顯示做出來,以及換頁

把 Function 當 Props 在傳

這招是小哈教我的,失智列車網站也有應用,而在這個 Side Project 則是頻繁用到

設定 Hook 的 State ,必定是利用 setState 函式
嗯?那如果我們把這個函式當作某個子元件的 Props ,把它傳進去,然後在子元件內觸發呢?

也就是說,我可以做到在子元件內判斷要不要改變父元件的狀態

具體是在哪些地方用到? 比如說:頁面開關

ArticleBlock 有個 Props setOpenSet_ArticleData
就是用來放入父元件 App 設定狀態所使用的 setOpenArticleBoolsetDisplay_article 函式
當某個 ArticleBlock 被點擊時,ArticleBlock 改變父元件的 OpenArticleBool 與,Display_article
假如 OpenArticleBool 為真,則在主頁顯示對應的文章內文(ArticleBody)

其他還有很多,包括闇黑模式也都有用到,但上方的舉例都有說到重點,這邊就不一一細講

內文一把抓 - dangerouslySetInnerHTML

還記得上面闇黑模式提到的無解問題嗎?

其最根本原因就是因為:巴哈瀑布流的樓層內文是直接把整段HTML原封不動抓下來顯示在對應區域
body

辦到這一點的便是「dangerouslySetInnerHTML」
用法很簡單,它就像一個HTML的屬性,你爬回來一整段HTML後,存成變數當作屬性的值即可

替換巴哈對於媒體內容的的自訂屬性

當然最終結果也不是說真的原汁原味,我抓下來之後還是有做一些基本的篩選潤飾

像是巴哈的連結,全部都有 data 前綴(例如 data-src),這爬回來不就沒辦法正常顯示了嘛?
所以我要將爬回來的內文篩出所有我需要改的 Element ,將原本的屬性去掉再加上新的屬性和原本的值
img

資料篩選反而是這 Side Project 最累人的部分

換頁與層數

巴哈文章中,所有內文區域的東西,都是 class 叫作 c-section 的玩意兒
我是靠 for迴圈 去抓每一個 c-section 內的東西來拿這個樓層的內容,沒有更好的方法

而這之中,關於 c-section 的排序,我觀察出幾個狀況:

  1. 回覆數不到21個,所以開頭沒有頁碼
  2. 回覆數破20,所以開頭有一個 c-section 顯示頁碼
  3. 無論有沒有頁碼,主樓下面肯定是該死的 猜你喜歡,它也是一個 c-section
  4. 當有 文章被刪除被噓到摺疊,將會生成兩個該樓層的 c-section
  5. 大家都在看 是一個 c-section
  6. 內容幾乎沒在變的 ACG 同好圈 X 閒聊取暖 X 自由經營公會新手村 也是一個 c-section

看出讓人皺眉的點了嗎?這些會影響 for迴圈抓資料的因素,同時也會影響我怎麼顯示層數

這就又得讓 Cheerio 篩資料,決定要不要爬取、要不要為該 c-section 計數了
明明需要找出各個 Element 不同之處,而這些 HTML 根本是同工異曲,最痛苦莫過於此


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言