社群爬蟲模組工具-以PTT為例

使用Jsoup爬取網頁資料,並以PTT為例。

首先在開始進行爬取之前,我們必須先瞭解網頁原始碼是怎樣的格式,

以chrome瀏覽器打開PTT網頁

按F12 可以看到網頁原始碼如下。

bug1

可以看到是原始碼是由文字和Tag所組成,比如說 <title> 首頁 – 批踢踢實業坊</title> 。

若是直接爬取網頁全部資料需要再進行斷詞處理,

因此可以使用Jsoup套件,他可以藉由選取Tag方式去取得文字。

首先,到Jsoup網站下載JAR檔

使用ECLIPSE開啟一個新專案

在專案上點右鍵->選取Properties->Java Bulid Path->

Libraries->Add External JARs->選取Jsoup的jar->點選OK

bug2

以Jsoup官網的例子

	public static void main(String[] args) throws IOException {
Document doc = Jsoup.connect("http://en.wikipedia.org/").get();//以connect去連接該網址之後get下來得到doc文本
Elements newsHeadlines = doc.select("#mp-itn b a");//在doc文本裡面找尋id為mp-itn的標籤
System.out.print(newsHeadlines);
}

簡單說明ㄧ下範例程式 ,

首先連接到 http://en.wikipedia.org/取得資料並且存到doc變數里面,

選取標籤 mp-itn 底下的標籤 b底下的標籤 a

印出結果如下

bug4

現在進入正題,以爬取PTT八卦版為例

要進入之前會先跳出 這個頁面

警告未滿18歲不得觀看

bug5

我們如果想要爬取八卦版的話,就必須先連結到 https://www.ptt.cc/ask/over18將Cookie記錄下來。

首先我們先觀察表單的程式碼

bug12

使用post方式傳送標單,我同意的按鈕名稱為yes、值也為yes。

以及點選我同意之後的網路記錄- over18

bug11

可以發現over18這筆記錄裡面的set-cookie 會將 over18這個cookie值設定為1。

程式碼如下所示:

Connection.Response response=Jsoup.connect("https://www.ptt.cc/ask/over18")
.userAgent("Mozilla").data("yes","yes").method(Method.POST).execute();
String cookie=response.cookie("over18"); 

先連結到 https://www.ptt.cc/ask/over18

使用userAgent模擬Mozilla瀏覽網頁,以POST方式傳遞參數yes並且執行。

我們知道cookie名稱為over18,因此將over18這個cookie的值存到String cookie裡面。

接著現在我們想抓八卦版的第一篇文章的標題,如下所示

bug7

先觀察網頁原始碼

bug8

可以發現標題在<div class="r-ent"> 的 <div class="title">裡

因此程式碼如下

Document doc=Jsoup.connect("https://www.ptt.cc/bbs/Gossiping/index.html")
.userAgent("Mozilla").cookie("over18", cookie).get();
String first =doc.select("div[class=r-ent]>div[class=title]>a").get(0).text();
System.out.println(first);

首先爬取八卦版並且將cookie設定為剛剛所存的cookie變數,將內容存到doc裡。

挑選標籤div[class=r-ent] 底下的 標籤div[class=title] 底下的標籤 a 的文字內容。

輸出結果如下

bug10

參考內容

  1. Jsoup官網 , https://jsoup.org
  2. PTT八卦版, https://www.ptt.cc/bbs/Gossiping/index.html