開了一篇新教學,使用新的 IDE 及 方便的套件

[Java]手把手帶你實作PTT爬蟲(1)-文章列表










簡單來說網路爬蟲就是自動去蒐集網站內容

進而從網站的內容中,截取關鍵字進行建檔

再截取其中的網址繼續爬下去

所以今天我們就拿一個網站來試驗

看看爬蟲是怎麼抓資料的

今天選的網站是鼎鼎大名的SOGO論壇

什麼??你說你不知道??嗯...不要問很可怕

我們先來講解一下最基本的觀念

你丟出去,對方丟回來

所有的網站皆是如此!!很單純

複雜的是有些網站的驗證機制不好過

這次我們使用Chrome的F12來分析網站

Step 1

開啟網站點下F12,切到Network,勾選Preserve log



Step 2

我們先從登入開始

點一下上方的登入,觀察一下右邊出現的Log

可以發現點下去的第一時間,向一個網址發送了GET請求



點進去可以看到請求的詳細內容



往下拉到底可以到看Query String Parameters

這是GET送出去的參數



之後切換到 Reponse

這是對方主機回傳回來的資料,可以看到內容是登入框的HTML碼



OK!!到這邊我們總結一下,按下登入後發生了什麼事情

  • 會觸發GET要求
  • 要求的網址是: http://oursogo.com/member.php
  • 傳送的參數有
    • mod=logging
    • action=login
    • referer=
    • infloat=yes
    • handlekey=login
    • inajax=1
    • ajaxtarget=fwin_content_login
  • 對方丟回來一段登入框的HTML碼

看了一下參數,應該是沒有動態(每次發出去的內容都會換)的部分

如果不確定有沒有,重新整理網站後,再按一次登入

如果參數都一樣的話,代表我們只要寫死就可以了

Step 3

輸入帳號密碼後,點下登入

可以看到又對同一隻檔案發送了請求,這次的是POST



一樣點開來看一下內容





這次參數的部分多了一個 Form Data

這是使用 POST 傳送的參數,Query String是 GET 傳送的參數,兩者可以共存

這次切到 Reponse 看不到東西,因為被重新導向過

但之後我們可以用程式看,不用擔心

OK!!到這邊我們第二次總結一下,進行登入後發生了什麼事情

  • 會觸發POST要求
  • 要求的網址是: http://oursogo.com/member.php
  • Query傳送的參數有
    • mod=logging
    • action=login
    • loginsubmit=yes
    • handlekey=login
    • loginhash=L3Y53
    • inajax=1
  • Form傳送的參數有
    • formhash=e0290946
    • referer=http://oursogo.com
    • username=
    • password=
    • questionid=0
    • answer=
    • loginsubmit=true

這次參數中混入了奇怪的東西 loginhash 和 formhash

這兩個很明顯的是動態產生的,這兩樣資料要怎麼來呢??

還記得上一步驟我們點下登入後有回傳了一段HTML碼嗎??

這兩樣資料就在那裡面,我們只要截取出來就好

或許會有人問:如果不在要怎麼辦!

你們只要記住

資料一定會有!!但可能在任何地方

這時候更要針對這個網頁上的所有動作進行分析

比如有沒有發送其他的要求,或是東西藏在JS當中...etc

到這邊我們已經分析完了"登入"到底做了些什麼事

Step 3

再來我們就先寫一段程式碼吧,開啟IDE後新增一個Java專案

設定一些package



article = 文章部分 http=通訊部分 login=登入部分 start=程式起點

新增一隻 Class 用來向主機發出 HTTP 要求

這隻是我之前寫好的,後面附上專案檔案

使用的是 apache http(https://hc.apache.org/)



再來在 login 中新增一個 Class Login,並規劃一些方法



之後按照上面分析好的步驟,撰寫程式

註解寫了很清楚,就不多做解釋了





Step 4

實際開一個討論區看看吧,這次的目標是爬取文章標題

奇怪!!居然出現了一個年齡限制



不用怕,一樣照上面的步驟解決這個頁面



分析完這個頁面資訊後我們一併分析文章頁面

進到文章後...拿一下衛生紙隨便先選一篇文章後,右鍵>檢查



之後我們就可以看到文章標題寫在 title 標籤中

上層是一個 li 標籤,由此看來,每一個文章簡介都是一個 li



Step 5

再來我們就繼續程式碼吧,在 article 中新增一個 Class ArticleList,並規劃一些方法









Step 6

到這邊我們已經把 登入 年齡驗證 抓取標題 實作完畢了

再來就是在 start 中新增一個 Class Start 來測試結果



大成功



總結

我們學到了如何使用 Chrome F12 工具來幫助我們分析 HTTP

也學習到了平常瀏覽網站時,瀏覽器到底幫我們做了什麼事情

爬蟲就是另一種瀏覽器,但爬回來的就是冷冰冰的程式碼

但在這邊呼籲,沒事不要去亂爬別人的東西,會讓對方的主機增加負擔