code

2016年1月24日 星期日

Java 爬蟲 - 如何使用爬蟲包取得PTT八卦版文章


本篇將簡易介紹如何使用 Java 網路資料爬蟲包 取得PTT八卦版文章。如果本篇對您有幫助,也請您給 Java 網路資料爬蟲包 (https://github.com/abola/CrawlerPack) 一個星星做為獎勵。

本篇目標:取得 PTT 八卦版最後50篇文章的 URL


先將爬蟲包加入你的專案中

Maven
<dependency>
    <groupId>com.github.abola</groupId>
    <artifactId>crawler</artifactId>
    <version>1.0.3</version>
</dependency>

or Gradle
dependencies {
    compile 'com.github.abola:crawler:1.0.3'
}
(其它工具請參考 http://mvnrepository.com/artifact/com.github.abola/crawler/1.0.0)


首先我們要先計算頁面 index 是多少

String prevPage =
  CrawlerPack.start()
    .addCookie("over18","1")     // 八卦版進入需要設定cookie
    .getFromHtml(gossipMainPage) // 遠端資料格式為 HTML
    // 取得右上角『前一頁』的內容
    .select(".action-bar .pull-right > a")
    .get(1).attr("href")
    .replaceAll("/bbs/Gossiping/index([0-9]+).html", "$1");
// 目前最末頁 index 編號
Integer lastPage = Integer.valueOf(prevPage)+1;

然後逐頁往前掃描,直到目標數量

List lastPostsLink = new ArrayList();
while ( 50 > lastPostsLink.size() ){
  // 每次往前一頁
  String currPage = String.format(gossipIndexPage, lastPage--);

  Elements links =
    CrawlerPack.start()
      .addCookie("over18", "1")
      .getFromHtml(currPage)
      .select(".title > a");

  for( Element link: links) 
    lastPostsLink.add( link.attr("href") );}

ok 就那麼簡單,完整Source Code取得到至
https://github.com/abola/CrawlerPack/blob/master/example/PttGossiping.java

9 則留言:

  1. 請問cookie該如何設定
    謝謝

    回覆刪除
    回覆
    1. 請問cookie是以此頁為設定嗎
      https://www.ptt.cc/ask/over18?from=%2Fbbs%2FGossiping%2Findex.html
      (超過18沒)
      謝謝 :)

      刪除
    2. Cookie Example 請參考
      https://github.com/abola/CrawlerPack#cookie-example

      刪除
  2. Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/vfs2/FileSystemException
    at PTT.PTT_Crawl.main(PTT_Crawl.java:25)
    Caused by: java.lang.ClassNotFoundException: org.apache.commons.vfs2.FileSystemException
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 1 more

    用爬蟲包會找不到vfs2的filesystem

    回覆刪除
    回覆
    1. 是否方便提供您的原始碼?

      刪除
    2. package PTT;

      import com.github.abola.crawler.XTrustProvider;
      import com.github.abola.crawler.CrawlerPack;
      import org.jsoup.parser.*;
      import org.jsoup.nodes.Element;
      import org.jsoup.select.Elements;
      import org.jsoup.nodes.Document;

      import java.util.ArrayList;
      import java.util.List;

      public class PTT_Crawl {


      final static String MainPage = "https://www.ptt.cc/bbs/StudyGroup/index.html";
      final static String IndexPage = "https://www.ptt.cc/bbs/StudyGroup/index%s.html";
      // 取得最後幾篇的文章數量
      static Integer loadLastPosts = 50;

      public static void main(String[] args) {
      // TODO Auto-generated method stub

      String prevPage =
      CrawlerPack.start()
      .getFromHtml(MainPage)
      .select("div.title > a").text(); // 遠端資料格式為 HTML
      }
      }

      刪除
    3. 測試執行是沒問題的,再確認以下兩點
      1. 是否有使用 maven or gradle 來載入爬蟲包
      2. 爬蟲包版本請改用 1.0.3

      刪除
  3. 請問是不是少了點東西? 找不到 org.jsoup.nodes 以及 org.jsoup.select,整包下載下來還是沒看到這兩個資料夾。

    回覆刪除
  4. Please pass the name of a file as parameter.

    執行欄出現這個 意思是指...?

    回覆刪除