久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx

HtmlUnit、httpclient、jsoup爬取網頁信息并解析

成都創新互聯專注于膠州企業網站建設,響應式網站開發,成都做商城網站。膠州網站建設公司,為膠州等地區提供建站服務。全流程按需定制開發,專業設計,全程項目跟蹤,成都創新互聯專業和態度為您提供的服務

1.爬取頁面效果圖

點擊"百度一下"按鈕前頁面

HtmlUnit、httpclient、jsoup爬取網頁信息并解析

點擊"百度一下"按鈕后頁面

HtmlUnit、httpclient、jsoup爬取網頁信息并解析

天涯社區登錄頁面

HtmlUnit、httpclient、jsoup爬取網頁信息并解析

登錄進去之后個人主頁

HtmlUnit、httpclient、jsoup爬取網頁信息并解析


二、具體實現代碼

HtmlUnit(底層也是采用httpclient)和jsoup  API

package com.yuanhai.test;

import java.io.IOException;
import java.net.MalformedURLException;

import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.safety.Whitelist;
import org.jsoup.select.Elements;
import org.junit.Assert;
import org.junit.Test;

import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.DefaultCredentialsProvider;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.html.HtmlButton;
import com.gargoylesoftware.htmlunit.html.HtmlDivision;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlInput;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
import com.gargoylesoftware.htmlunit.html.HtmlTextInput;
//參考博文
//1.http://blog.csdn.net/zstu_cc/article/details/39250903
//2.http://blog.csdn.net/cslie/article/details/48735261

public class HtmlUnitAndJsoup {

    /*
     * 首先說說HtmlUnit相對于HttpClient的最明顯的一個好處,
     * 是HtmlUnit不僅保存了這個網頁對象,更難能可貴的是它還存有這個網頁的所有基本操作甚至事件。
     * 現在很多網站使用大量ajax,普通爬蟲無法獲取js生成的內容。
     */

    /*
     * 依賴的jar包 commons-lang3-3.1.jar htmlunit-2.13.jar htmlunit-core-js-2.13.jar
     * httpclient-4.3.1.jar httpcore-4.3.jar httpmime-4.3.1.jar sac-1.3.jar
     * xml-apis-1.4.01.jar commons-collections-3.2.1.jar commons-io-2.4.jar
     * xercesImpl-2.11.0.jar xalan-2.7.1.jar cssparser-0.9.11.jar
     * nekohtml-1.9.19.jar
     */
    // 百度新聞高級搜索
    @Test
    public void HtmlUnitBaiduAdvanceSearch() {
        try {
            // 得到瀏覽器對象,直接New一個就能得到,現在就好比說你得到了一個瀏覽器了
            WebClient webclient = new WebClient();

            // 這里是配置一下不加載css和javaScript,配置起來很簡單,是不是
            webclient.getOptions().setCssEnabled(false);
            webclient.getOptions().setJavaScriptEnabled(false);

            // 做的第一件事,去拿到這個網頁,只需要調用getPage這個方法即可
            HtmlPage htmlpage = webclient
                    .getPage("http://news.baidu.com/advanced_news.html");

            // 根據名字得到一個表單,查看上面這個網頁的源代碼可以發現表單的名字叫“f”
            final HtmlForm form = htmlpage.getFormByName("f");
            System.out.println(form);
            // 同樣道理,獲取”百度一下“這個按鈕
            final HtmlSubmitInput button = form.getInputByValue("百度一下");
            System.out.println(button);
            // 得到搜索框
            final HtmlTextInput textField = form.getInputByName("q1");

            System.out.println(textField);

            // 最近周星馳比較火呀,我這里設置一下在搜索框內填入”周星馳“
            textField.setValueAttribute("周星馳");
            // 輸入好了,我們點一下這個按鈕
            final HtmlPage nextPage = button.click();
            // 我把結果轉成String
            System.out.println(nextPage);

            String result = nextPage.asXml();

            System.out.println(result);
        } catch (Exception e) {

            e.printStackTrace();
        }

    }

    // 測試天涯論壇登陸界面 HtmlUnit 頁面JS的自動跳轉(響應碼是200,但是響應的頁面就是一個JS)
    // httpClient就麻煩了
    @Test
    public void TianyaTestByHtmlUnit() {

        try {
            WebClient webClient = new WebClient();

            // The ScriptException is raised because you have a syntactical
            // error in your javascript.
            // Most browsers manage to interpret the JS even with some kind of
            // errors
            // but HtmlUnit is a bit inflexible in that sense.
            // 加載的頁面有js語法錯誤會拋出異常

            webClient.getOptions().setJavaScriptEnabled(true); // 啟用JS解釋器,默認為true
            webClient.getOptions().setCssEnabled(false); // 禁用css支持
            // 設置Ajax異步處理控制器即啟用Ajax支持
            webClient
                    .setAjaxController(new NicelyResynchronizingAjaxController());
            // 當出現Http error時,程序不拋異常繼續執行
            webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
            // 防止js語法錯誤拋出異常
            webClient.getOptions().setThrowExceptionOnScriptError(false); // js運行錯誤時,是否拋出異常

            // 拿到這個網頁
            HtmlPage page = webClient
                    .getPage("http://passport.tianya.cn/login.jsp");

            // 填入用戶名和密碼
            HtmlInput username = (HtmlInput) page.getElementById("userName");
            username.type("yourAccount");
            HtmlInput password = (HtmlInput) page.getElementById("password");
            password.type("yourPassword");

            // 提交
            HtmlButton submit = (HtmlButton) page.getElementById("loginBtn");
            HtmlPage nextPage = submit.click();
            System.out.println(nextPage.asXml());
        } catch (Exception e) {

            e.printStackTrace();
        }
    }

    // jsoup解析文檔
    @Test
    public void jsoupParse() {

        try {
            /** HtmlUnit請求web頁面 */
            // 模擬chorme瀏覽器,其他瀏覽器請修改BrowserVersion.后面
            WebClient wc = new WebClient(BrowserVersion.CHROME);

            wc.getOptions().setJavaScriptEnabled(true); // 啟用JS解釋器,默認為true
            wc.getOptions().setCssEnabled(false); // 禁用css支持
            wc.getOptions().setThrowExceptionOnScriptError(false); // js運行錯誤時,是否拋出異常
            wc.getOptions().setTimeout(10000); // 設置連接超時時間 ,這里是10S。如果為0,則無限期等待
            HtmlPage page = wc.getPage("http://passport.tianya.cn/login.jsp");
            String pageXml = page.asXml(); // 以xml的形式獲取響應文本
            // text只會獲取里面的文本,網頁html標簽和script腳本會被去掉
            String pageText = page.asText();
            System.out.println(pageText);

            // 方法一,通過get方法獲取
            HtmlButton submit = (HtmlButton) page.getElementById("loginBtn");

            // 方法二,通過XPath獲取,XPath通常用于無法通過Id搜索,或者需要更為復雜的搜索時
            HtmlDivision div = (HtmlDivision) page.getByXPath("http://div").get(0);

            // 網絡爬蟲中主要目的就是獲取頁面中所有的鏈接

            java.util.List<HtmlAnchor> achList = page.getAnchors();
            for (HtmlAnchor ach : achList) {
                System.out.println(ach.getHrefAttribute());
            }

            System.out.println("-------jsoup部分------");
            // 服務器端進行校驗并清除有害的HTML代碼,防止富文本提交有害代碼
            Jsoup.clean(pageXml, Whitelist.basic());
            /** jsoup解析文檔 */
            // 把String轉化成document格式
            Document doc = Jsoup.parse(pageXml);
            Element loginBtn = doc.select("#loginBtn").get(0);
            System.out.println(loginBtn.text());
            Assert.assertTrue(loginBtn.text().contains("登錄"));

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // htmlunit設置代理上網
    @Test
    public void proxy() {
        String proxyHost = "192.168.0.1";
        int port = 80;
        WebClient webClient = new WebClient(BrowserVersion.CHROME, proxyHost,
                port);

        webClient.setAjaxController(new NicelyResynchronizingAjaxController());

        DefaultCredentialsProvider credentialsProvider = (DefaultCredentialsProvider) webClient
                .getCredentialsProvider();
        String username = "account";
        String password = "password";
        credentialsProvider.addCredentials(username, password);
    }

    // jsoup請求并解析

    @Test
    public void jsoupCrawl() throws IOException {

        String url = "http://passport.tianya.cn/login.jsp";
        Connection con = Jsoup.connect(url);// 獲取請求連接
        // 瀏覽器可接受的MIME類型。
        con.header("Accept",
                "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
        con.header("Accept-Encoding", "gzip, deflate");
        con.header("Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3");
        con.header("Connection", "keep-alive");
        con.header("Host", url);
        con.header("User-Agent",
                "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0");
        Document doc = con.get();
        Elements loginBtn = doc.select("#loginBtn");
        System.out.println(loginBtn.text());// 獲取節點中的文本,類似于js中的方法
    }
}


httpclient模擬post請求登錄

package com.yuanhai.test;

import java.io.IOException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;

import javax.net.ssl.SSLContext;

import org.apache.http.Consts;
import org.apache.http.Header;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.conn.ssl.SSLContextBuilder;
import org.apache.http.conn.ssl.TrustStrategy;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;

import com.steadystate.css.parser.ParseException;

/** 
 * @author 
 * @date 
 * @version 
 *  
 */  
public class TianyaTestByHttpClient {  
    /** 
     *  無法實現js頁面的自動跳轉,HtmlUnit可以
     */  
    public static void main(String[] args) throws Exception {  
        // 這是一個測試,也是為了讓大家看的更清楚,請暫時拋開代碼規范性,不要糾結于我多建了一個局部變量等  
        // 得到認證https的瀏覽器對象  
        HttpClient client = getSSLInsecureClient();  
        // 得到我們需要的post流  
        HttpPost post = getPost();  
        // 使用我們的瀏覽器去執行這個流,得到我們的結果  
        HttpResponse hr = client.execute(post);  
        // 在控制臺輸出我們想要的一些信息  
        showResponseInfo(hr);  
    }  

    private static void showResponseInfo(HttpResponse hr) throws ParseException, IOException {  

        System.out.println("響應狀態行信息:" + hr.getStatusLine());  
        System.out.println("---------------------------------------------------------------");  

        System.out.println("響應頭信息:");  
        Header[] allHeaders = hr.getAllHeaders();  
        for (int i = 0; i < allHeaders.length; i++) {  
            System.out.println(allHeaders[i].getName() + ":" + allHeaders[i].getValue());  
        }  

        System.out.println("---------------------------------------------------------------");  
        System.out.println("響應正文:");  
        System.out.println(EntityUtils.toString(hr.getEntity()));  
        
     /*   <body>
        <script>
            location.;
        </script>
        </body>*/
    

    }  

    // 得到一個認證https鏈接的HttpClient對象(因為我們將要的天涯登錄是Https的)  
    // 具體是如何工作的我們后面會提到的  
    private static HttpClient getSSLInsecureClient() throws Exception {  
        // 建立一個認證上下文,認可所有安全鏈接,當然,這是因為我們僅僅是測試,實際中認可所有安全鏈接是危險的  
        SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() {  
            public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {  
                return true;  
            }  
        }).build();  
        SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext);  
        return HttpClients.custom().//  
                setSSLSocketFactory(sslsf)//  
                // .setProxy(new HttpHost("127.0.0.1", 8888))  
                .build();  
    }  

    // 獲取我們需要的Post流,如果你是把我的代碼復制過去,請記得更改為你的用戶名和密碼  
    private static HttpPost getPost() {  
        HttpPost post = new HttpPost("https://passport.tianya.cn/login");  

        // 首先我們初始化請求頭  
        post.addHeader("Referer", "https://passport.tianya.cn/login.jsp");  
        post.addHeader("Host", "passport.tianya.cn");  
        post.addHeader("Origin", "http://passport.tianya.cn");  

        // 然后我們填入我們想要傳遞的表單參數(主要也就是傳遞我們的用戶名和密碼)  
        // 我們可以先建立一個List,之后通過post.setEntity方法傳入即可  
        // 寫在一起主要是為了大家看起來方便,大家在正式使用的當然是要分開處理,優化代碼結構的  
        List<NameValuePair> paramsList = new ArrayList<NameValuePair>();  
        /*  
         * 添加我們要的參數,這些可以通過查看瀏覽器中的網絡看到,如下面我的截圖中看到的一樣 
         * 不論你用的是firebug,httpWatch或者是谷歌自帶的查看器也好,都能查看到(后面會推薦輔助工具來查看) 
         * 要把表單需要的參數都填齊,順序不影響 
         */  
        paramsList.add(new BasicNameValuePair("Submit", ""));  
        paramsList.add(new BasicNameValuePair("fowardURL", "http://www.tianya.cn"));  
        paramsList.add(new BasicNameValuePair("from", ""));  
        paramsList.add(new BasicNameValuePair("method", "name"));  
        paramsList.add(new BasicNameValuePair("returnURL", ""));  
        paramsList.add(new BasicNameValuePair("rmflag", "1"));  
        paramsList.add(new BasicNameValuePair("__sid", "1#1#1.0#a6c606d9-1efa-4e12-8ad5-3eefd12b8254"));  

        // 你可以申請一個天涯的賬號 并在下兩行代碼中替換為你的用戶名和密碼  
        paramsList.add(new BasicNameValuePair("vwriter", "yourAccount"));// 替換為你的用戶名  
        paramsList.add(new BasicNameValuePair("vpassword", "yourPassword"));// 你的密碼  

        // 將這個參數list設置到post中  
        post.setEntity(new UrlEncodedFormEntity(paramsList, Consts.UTF_8));  
        return post;  
    }  

}

參考文章:

http://blog.csdn.net/zstu_cc/article/details/39250903

http://blog.csdn.net/cslie/article/details/48735261


分享題目:HtmlUnit、httpclient、jsoup爬取網頁信息并解析
網頁鏈接:http://www.js-pz168.com/article34/jcijpe.html

成都網站建設公司_創新互聯,為您提供網站設計公司企業網站制作軟件開發品牌網站建設外貿網站建設品牌網站設計

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

營銷型網站建設
久久99久久人婷婷精品综合_超碰aⅴ人人做人人爽欧美_亚洲电影第三页_日韩欧美一中文字暮专区_波多野结衣的一区二区三区_婷婷在线播放_人人视频精品_国产精品日韩精品欧美精品_亚洲免费黄色_欧美性猛交xxxxxxxx
欧美精品久久| 制服丝袜av成人在线看| 欧美一卡2卡三卡4卡5免费| 国产欧美日韩三区| 亚洲国产一区二区视频| 国产精品一区二区无线| 国产日韩欧美精品| 在线观看日韩国产| 久久欧美中文字幕| 亚洲国产精品久久不卡毛片| 极品销魂美女一区二区三区| 成人性色av| 91久久精品日日躁夜夜躁欧美| 精品久久国产字幕高潮| 一区二区三区免费看视频| 国产麻豆精品久久一二三| 国产精品国产精品| 在线观看日产精品| 日本一区二区三区在线不卡| 日韩成人午夜精品| 91看片淫黄大片一级在线观看| 亚洲一区二区在线观| 欧美精品一区二区三区很污很色的 | 亚洲自拍偷拍综合| 高清不卡在线观看| 日韩资源av在线| 精品国产一区二区精华| 亚洲成人自拍一区| 91亚洲精品乱码久久久久久蜜桃 | 欧美绝品在线观看成人午夜影视| 国产精品久久久久久久久快鸭| 九九视频精品免费| 久久99精品久久久久久三级| 欧美一区二区视频网站| 亚洲国产精品视频| 91蜜桃传媒精品久久久一区二区| 色综合久久中文字幕| 国产精品系列在线| 国产一区二区三区在线观看精品 | 麻豆av一区二区三区久久| 欧美一级高清片| 亚洲成人久久影院| 99国产在线| 欧美另类z0zxhd电影| 亚洲综合丝袜美腿| 97伦理在线四区| 欧美日本国产一区| 亚洲图片有声小说| 99视频在线| 这里只有精品电影| 污片在线观看一区二区| 国产精品区一区| 日韩一级欧美一级| 日韩av一级电影| 久久天天狠狠| 久久这里都是精品| 韩国成人福利片在线播放| 少妇特黄a一区二区三区| 国产人妖乱国产精品人妖| 国产一区二区免费看| 亚洲视频在线二区| |精品福利一区二区三区| www.在线成人| 欧美美女喷水视频| 日韩中文字幕区一区有砖一区 | 99这里都是精品| 欧美三级韩国三级日本一级| 亚洲午夜精品一区二区三区他趣| 国产精品对白刺激久久久| 日韩你懂的电影在线观看| 蜜桃在线一区二区三区| 天堂一区二区三区| 亚洲三级视频在线观看| av在线播放成人| 91精品国产aⅴ一区二区| 日本不卡的三区四区五区| 四虎影院一区二区三区 | 国产精品福利电影一区二区三区四区| 成人av在线一区二区三区| 欧美日韩精品久久久| 日韩精品色哟哟| 午夜欧美一区二区三区免费观看| 18涩涩午夜精品.www| 成人综合色站| 久久久久久久av麻豆果冻| 成人av在线一区二区三区| 91精品麻豆日日躁夜夜躁| 久久国产视频网| 色香色香欲天天天影视综合网| 亚洲韩国精品一区| 欧洲av一区| 最新日韩av在线| 精品国产乱码久久久久久88av | 日韩欧美视频一区| 国产麻豆精品久久一二三| 欧美亚洲国产怡红院影院| 日本亚洲免费观看| 亚洲日本无吗高清不卡| 亚洲一区二区三区四区中文字幕| 欧美在线一二三区| 亚洲免费观看高清完整版在线观看熊| 国产综合欧美在线看| 国产精品久久久久久久岛一牛影视 | 欧美精品高清视频| 国产乱码精品1区2区3区| 69堂亚洲精品首页| 国产精品综合在线视频| 69p69国产精品| 国产一区二区三区综合| 69堂成人精品免费视频| 国产福利不卡视频| 欧美一区二区美女| 不卡视频一二三| 久久九九影视网| 99蜜桃在线观看免费视频网站| 久久久久国产精品厨房| 99re6热在线精品视频播放速度| 欧美激情一区不卡| 国产精品一区二区在线观看| 椎名由奈av一区二区三区| 欧美连裤袜在线视频| 亚洲午夜三级在线| 中文字幕日韩一区二区三区不卡| 日本在线观看不卡视频| 欧美亚洲愉拍一区二区| 韩国av一区二区| 欧美成人综合网站| 91毛片在线观看| 国产精品成人一区二区三区夜夜夜 | 日韩高清不卡一区二区三区| 在线观看日韩高清av| 国产精品一区二区三区网站| 亚洲精品一线二线三线| 99久热re在线精品996热视频| 国产精品久久久久一区| 日本精品一区二区三区高清 久久 日本精品一区二区三区不卡无字幕 | 国产欧美一区二区在线观看| 精品一卡二卡三卡四卡日本乱码| 玉米视频成人免费看| 在线不卡视频一区二区| 精品系列免费在线观看| 日韩欧美国产高清| wwwxx欧美| 一区二区三区美女| 在线观看成人av| 国产麻豆视频精品| 久久精品视频免费| 欧美日韩在线观看一区二区三区 | 国产suv精品一区二区883| 国产无遮挡一区二区三区毛片日本| 九色91在线视频| 日韩电影一区二区三区四区| 欧美肥大bbwbbw高潮| 91久久偷偷做嫩草影院| 亚洲男同性视频| 91国偷自产一区二区开放时间| 国内精品写真在线观看| 久久久一区二区三区捆绑**| 久久久久久久免费| 美日韩一区二区| 精品国产乱码久久久久久久久| 精品欧美日韩| 免费成人av在线播放| 欧美tickling挠脚心丨vk| 久久精品国产理论片免费| 日韩电影在线一区| 精品三级在线观看| 欧美国产一二三区| 精品一区二区三区日韩| 久久先锋影音av鲁色资源网| 日本一区免费看| 国产麻豆欧美日韩一区| 国产精品免费视频网站| 日本韩国欧美一区| 94色蜜桃网一区二区三区| 亚洲一区二区三区激情| 欧美一区二区视频在线观看2022| 国产精品嫩草在线观看| 青娱乐精品在线视频| 久久久.com| 在线视频一区观看| 99热这里都是精品| 亚洲国产婷婷综合在线精品| 欧美一区二区精品久久911| 精品伦精品一区二区三区视频| 久久99久久精品| 国产精品久久久久久久久免费相片| 91福利视频网站| 国产精品18毛片一区二区| 美女视频一区在线观看| 中文字幕电影一区| 欧美视频精品在线| 国产一区在线免费| 韩国精品久久久| 国产精品久久久久一区| 欧美主播一区二区三区美女| 国产传媒一区在线| 亚洲综合在线五月| 日韩欧美一级片| 午夜久久资源|