Java學習-簡單爬蟲系統

__折戟沉沙發表於2017-09-06
昨天因為某些需要,就用java寫了個簡單的爬蟲系統,特在此整理一下,首先使用到的兩個工具,jsoup和httpClient。jsoup是針對html檔案的解析[jsoup官網](https://jsoup.org),httpclint是網路請求的工具包,功能強大,內容豐富,[HttpClient官網](http://hc.apache.org/httpclient-3.x/)
因為這個比較簡短,我的程式碼格式就很隨意,接下來只把部分程式碼放上,並做一些簡單的解釋,上程式碼:

下面的方法按照page引數遞增,不停請求資料
String url = “某連結”;

    for (int i = 1; i <= 1666; i++) {
        String data = ClientHandle.getContentForUrl(url+ i);

        Business bussness = new Business();
        bussness.analysisDataTypeOne(data);
    }

根據url獲取頁面資訊

public static String getContentForUrl(String url)   {

    HttpClient client = new DefaultHttpClient();        

    HttpGet getHttp = new HttpGet(url); 

    getHttp.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36"); 

    String content = null;  

    HttpResponse response;  
    try {  
        /* 獲得資訊載體 */  
        response = client.execute(getHttp);  
        HttpEntity entity = response.getEntity();  

        VisitedUrlQueue.addElem(url);  

        if (entity != null) {  
            /* 轉化為文字資訊 */  
            content = EntityUtils.toString(entity);  

            /* 判斷是否符合下載網頁原始碼到本地的條件 */  
            if (FunctionUtils.isCreateFile(url)  
                    && FunctionUtils.isHasGoalContent(content) != -1) {  
                FunctionUtils.createFile(  
                        FunctionUtils.getGoalContent(content), url);  
            }  
        }  

    } catch (ClientProtocolException e) {  
        e.printStackTrace();  
    } catch (IOException e) {  
        e.printStackTrace();  
    } finally {  
        client.getConnectionManager().shutdown();  
    }  

    return content;  
}

接下來將獲取到頁面資訊進行處理 

public void analysisDataTypeOne(String content){
    this.dealTable(content);
}

解析頁面資訊,裡邊用到了jsoup的元素

//處理最外層連結
public void dealTable(String str) {
    if (str.length() > 0) {
        //獲取頁面物件
        Document doc = Jsoup.parseBodyFragment(str);

        //解析資料
        Element content = doc.body();
        Elements links = content.getElementsByClass("newClass");

        for (Element link : links) {
            this.dealTr(link);
        }
    }
}
將上一方法中解析出的單個table塊解析出實體,
public void dealTr(Element link) {
    Elements nameEle = link.getElementsByClass("class");

    ListModel model = new ListModel();

    if (nameEle.size() > 0) {
        Elements elem = nameEle.first().getElementsByTag("a");

        if (elem.size() > 0) {

            String linkHref = element.attr("href");

            if (linkHref != "" && linkHref.length() > 0) {
                String name = element.text();

                //保֒存֒數֒據
                model.setName(name);
                model.setHref(linkHref);
            }
        }

    }
}

接下來就是model類和資料庫類
public class ListModel {
private int id; //主鍵
private String name; //名稱
private String href; //連結
}

public class db {

private static final String URL = "jdbc:mysql://localhost:3306/ChaoshenTest?useUnicode=true&characterEncoding=UTF-8";
private static final String NAME = "root";
private static final String PASSWORD = "root123";

private static Connection conn = null;
static{
    try {
        //1.載入驅動程式
        Class.forName("com.mysql.jdbc.Driver");
        //2.獲得資料庫的連線
        conn = DriverManager.getConnection(URL, NAME, PASSWORD);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}

//對外提供一個方法來獲取資料庫連線
public static Connection getConnection(){
    return conn;
}

    上面的原理也比較簡單,因為被爬的網站沒有使用反爬技術,所以上邊也沒有加入一些高階技術,以後用到了再增加。整理一下,方便以後回顧和學習。

相關文章