1. 程式人生 > >JAVA爬蟲--編寫第一個網路爬蟲程式

JAVA爬蟲--編寫第一個網路爬蟲程式

JAVA爬蟲–編寫第一個網路爬蟲程式

前言

    上一章節介紹了XPATH基礎語法,本章節將手把手帶大家編寫第一個爬蟲程式,同時也希望能通過這個爬蟲程式,幫助大家熟悉上一章節學習的XPATH基礎語法並運用到實戰中來。

目標

    通過Java程式採集URL地址,並獲取地址中的標題,釋出時間,正文內容,並把採集的內容儲存到本地檔案中。

準備工作

HtmlCleaner包簡介

    HtmlCleaner是一個開源的Java語言的Html文件解析器。HtmlCleaner能夠重新整理HTML文件的每個元素並生成結構良好(Well-Formed)的 HTML 文件。

    預設它遵循的規則是類似於大部份web瀏覽器為創文件物件模型所使用的規則。然而,使用者可以提供自定義tag和規則組來進行過濾和匹配。它被設計的小,快速,靈活而且獨立。HtmlCleaner也可用在Java程式碼中,當命令列工具或Ant任務。 解析後程式設計輕量級文件物件,能夠很容易的被轉換到DOM或者JDom標準文件,或者通過各種方式(壓縮,列印)連續輸出XML。

    簡單來說HtmlCleaner可以把我們下載的Html內容,轉換成DOM物件,並且該Jar包提供了XPATH解析的API,幫助我們通過XPATH解析採集到的網頁內容。

程式碼示例:

DataBean.java:

存放標題,正文,釋出時間的實體類

package com.demo;
/**
* 
* @author binggong
* @建立時間 2018年1月4日 下午10:18:26
* @微信公眾號:DT資料技術博文
* @tag: 存放標題,正文,釋出時間的實體類
*/
public class DataBean {

/**
 * 標題
 */
private String title;

/**
 * 釋出時間
 */
private String pubtime;

/**
 * 正文內容
 */
private String context;

public DataBean() {
    super();
}

public DataBean(String title, String pubtime, String context) {
    super();
    this.title = title;
    this.pubtime = pubtime;
    this.context = context;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getPubtime() {
    return pubtime;
}

public void setPubtime(String pubtime) {
    this.pubtime = pubtime;
}

public String getContext() {
    return context;
}

public void setContext(String context) {
    this.context = context;
}
}

DownloadHtml.java:

下載網頁內容

package com.demo;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

/**
* 
* @author binggong
* @建立時間 2018年1月5日 下午9:25:31
* @微信公眾號:DT資料技術博文
* @tag: 下載網頁內容
*/
public class DownloadHtml {

/**
 * 下載指定URL的Html內容
 * @param url url連線
 * @return 返回html頁面內容
 * @throws Exception 
 */
public String getHtml(String url) throws Exception{

    URL u = new URL(url);

    URLConnection  conn =u.openConnection();
    InputStream in = conn.getInputStream();

    BufferedReader br = new BufferedReader(new InputStreamReader(in));

    String line = null;
    StringBuffer html = new StringBuffer();
    while((line=br.readLine())!=null){
        html.append(line);
    }

    in.close();
    br.close();
    return html.toString();
}

}

SpiderMain.java:

爬蟲解析儲存類

package com.demo;

import java.io.PrintWriter;

import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.TagNode;



/**
* 
* @author binggong
* @建立時間 2018年1月4日 下午10:24:01
* @微信公眾號:DT資料技術博文
* @tag: 爬蟲解析
*/
public class SpiderMain {


/**
 * 爬蟲解析方法
 * @param url  待採集的URL
 * @return 返回解析的內容
 * @throws Exception
 */
public DataBean getSpiderData(String url) throws Exception{

    //1.下載html
    String html = new DownloadHtml().getHtml("http://blog.csdn.net/gongbing798930123/article/details/78955597");

    HtmlCleaner hc = new HtmlCleaner();
    //2.把html轉換成dom物件
    TagNode tn = hc.clean(html);
    //3.通過xpath解析dom物件
    String title = tn.evaluateXPath("//h1[@class='csdn_top']/text()")[0].toString();
    String context = tn.evaluateXPath("//div[@id='article_content']/text()")[0].toString();
    String pubictime = tn.evaluateXPath("//span[@class='time']/text()")[0].toString();

    //4.把結果放入到實體類中
    DataBean result = new DataBean();
    result.setTitle(title);
    result.setPubtime(pubictime);
    result.setContext(context);

    return result;
}

/**
 * 儲存採集到的內容
 * @param url  待採集的網頁
 * @param outpath 儲存的路徑
 * @throws Exception 
 */
public void saveSpiderData(String url,String outpath) throws Exception{
    DataBean data = getSpiderData(url);
    PrintWriter pw = new PrintWriter(outpath);
    pw.println("標題:"+data.getTitle());
    pw.println("釋出時間:"+data.getPubtime());
    pw.println("正文:"+data.getContext());
    pw.flush();
    pw.close();
}

public static void main(String[] args) {

     try {
        new SpiderMain().saveSpiderData("http://blog.csdn.net/gongbing798930123/article/details/78955597","c:\\spider_result.txt");
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}
}

總結

    從程式碼示例可以看出,完成一個爬蟲程式還是比較簡單的,相信對於有學習過Java基礎的你上手起來很容易。

同時從程式碼示例可以看出,爬蟲的基本流程為:

請求URL--->下載HTML內容--->解析內容--->儲存結果

    對於生產級的爬蟲專案來說需要處理的問題遠不止這些,比如在專案中會遇到反爬蟲、效能、登入、加密、非同步請求問題、請求失敗、程式碼健壯等這些問題都需要解決。

    萬變不離其宗,不管生產級的爬蟲專案遇到多少難題,爬蟲的基礎流程是不會變的,
同時後面我會把我在爬蟲中所踩的坑都會記錄下來,希望能對讀者在爬蟲道路上少走彎路。

備註:大家記得關注微信公眾號:DT資料技術博文,回覆:001,下載專案jar包和原始碼喲!

    ![這裡寫圖片描述](https://img-blog.csdn.net/20180106161404304?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ29uZ2Jpbmc3OTg5MzAxMjM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)