揭秘Java網(wǎng)絡(luò)爬蟲(chóng)程序原理

隨著互聯(lián)網(wǎng)+時(shí)代的來(lái)臨,越來(lái)越多的互聯(lián)網(wǎng)企業(yè)層出不窮,涉及游戲菱肖、視頻焰雕、新聞、社交炭序、電商、房產(chǎn)、旅游等眾多行業(yè)空繁。如今互聯(lián)網(wǎng)成為大量信息的載體,如何有效地從中提取有價(jià)值的信息并利用這些信息成為一個(gè)巨大的挑戰(zhàn)

爬蟲(chóng)朱庆,一個(gè)可怕的怪物盛泡,從百度、Google等搜索引擎公司誕生開(kāi)始便有了它的身影娱颊,如今移動(dòng)互聯(lián)網(wǎng)時(shí)代爬蟲(chóng)更是猖狂傲诵,每個(gè)網(wǎng)站似乎都被它光顧過(guò),只是你看不到箱硕,不過(guò)你放心它不干壞事拴竹,你能在網(wǎng)上迅速搜索到你到的信息應(yīng)該都是它的功勞,它每天會(huì)默默無(wú)聞的采集互聯(lián)網(wǎng)上的豐富信息供大家查詢(xún)共享剧罩。Java作為互聯(lián)網(wǎng)開(kāi)發(fā)的主流語(yǔ)言栓拜,廣泛應(yīng)用于互聯(lián)網(wǎng)領(lǐng)域,本課程使用java技術(shù)為大家講解如何編寫(xiě)爬蟲(chóng)程序爬取網(wǎng)絡(luò)上有價(jià)值的數(shù)據(jù)信息惠昔。

知識(shí)點(diǎn)

  • 爬蟲(chóng)的架構(gòu)解析
  • 爬蟲(chóng)基本原理分析
  • 編寫(xiě)爬蟲(chóng)程序
  • 爬蟲(chóng)在電商中的應(yīng)用

1. 爬蟲(chóng)簡(jiǎn)介

我們?cè)L問(wèn)某一個(gè)網(wǎng)頁(yè)的時(shí)候幕与,在地址欄輸入網(wǎng)址,按回車(chē)镇防,該網(wǎng)站的服務(wù)器就會(huì)返回一個(gè)HTML文件給我們啦鸣,瀏覽器解析返回的數(shù)據(jù),展示在UI上来氧。同樣爬蟲(chóng)程序也是模仿人的操作赏陵,給網(wǎng)站發(fā)送一個(gè)請(qǐng)求饼齿,網(wǎng)站會(huì)給爬蟲(chóng)程序返回一個(gè)HTML文件,爬蟲(chóng)程序再根據(jù)返回的數(shù)據(jù)進(jìn)行抓取分析


爬蟲(chóng)簡(jiǎn)介

1.1 爬蟲(chóng)概論

網(wǎng)絡(luò)爬蟲(chóng)(Web crawler)也叫網(wǎng)絡(luò)蜘蛛(Web spide)自動(dòng)檢索工具(automatic indexer)蝙搔,是一種”自動(dòng)化瀏覽網(wǎng)絡(luò)“的程序缕溉,或者說(shuō)是一種網(wǎng)絡(luò)機(jī)器人。

爬蟲(chóng)被廣泛用于互聯(lián)網(wǎng)搜索引擎或其他類(lèi)似網(wǎng)站吃型,以獲取或更新這些網(wǎng)站的內(nèi)容和檢索方式证鸥。它們可以自動(dòng)采集所有其能夠訪(fǎng)問(wèn)到的頁(yè)面內(nèi)容,以供搜索引擎做進(jìn)一步處理(分檢整理下載的頁(yè)面)勤晚,而使得用戶(hù)能更快的檢索到他們需要的信息枉层。

通俗的講,就是把你手動(dòng)打開(kāi)窗口赐写,輸入數(shù)據(jù)等等操作用程序代替鸟蜡。用程序替你獲取你想要的信息,這就是網(wǎng)絡(luò)爬蟲(chóng)

1.2 爬蟲(chóng)應(yīng)用

1.2.1 搜索引擎

爬蟲(chóng)程序可以為搜索引擎系統(tǒng)爬取網(wǎng)絡(luò)資源挺邀,用戶(hù)可以通過(guò)搜索引擎搜索網(wǎng)絡(luò)上一切所需要的資源揉忘。搜索引擎是一套非常龐大且精密的算法系統(tǒng),搜索的準(zhǔn)確性端铛,高效性等都對(duì)搜索系統(tǒng)有很高的要求泣矛。

搜索引擎原理

1.2.2 數(shù)據(jù)挖掘

大數(shù)據(jù)分析

爬蟲(chóng)除了用來(lái)做搜索外,還可以做非常多的工作禾蚕,可以說(shuō)爬蟲(chóng)現(xiàn)在在互聯(lián)網(wǎng)項(xiàng)目中應(yīng)用的非常廣泛您朽。
互聯(lián)網(wǎng)項(xiàng)目通過(guò)爬取相關(guān)數(shù)據(jù)主要進(jìn)行數(shù)據(jù)分析,獲取價(jià)值數(shù)據(jù)换淆。那么爬蟲(chóng)具體可以做那么分析哗总,下面可以簡(jiǎn)單做一個(gè)簡(jiǎn)單了解:

  • 股票分析---預(yù)測(cè)股市
  • 社會(huì)學(xué)方面統(tǒng)計(jì)預(yù)測(cè)
    • 情緒地圖
    • 飲食分布圖
    • 票房分析預(yù)測(cè)
    • 機(jī)場(chǎng)實(shí)時(shí)流量
    • 公交系統(tǒng)實(shí)時(shí)線(xiàn)路
    • 火車(chē)票實(shí)時(shí)銷(xiāo)售統(tǒng)計(jì)
  • App下載量分析

1.3 爬蟲(chóng)原理

1.3.1 爬蟲(chóng)目的

一般來(lái)講對(duì)我們而言需要抓取的是某個(gè)網(wǎng)站或者某個(gè)應(yīng)用的內(nèi)容,提取有用的價(jià)值倍试,進(jìn)行數(shù)據(jù)分析讯屈。

1.3.2 爬蟲(chóng)框架設(shè)計(jì)

為了開(kāi)發(fā)的方便,也可以使用爬蟲(chóng)框架來(lái)開(kāi)發(fā)項(xiàng)目中的爬蟲(chóng)易猫;一個(gè)通用的網(wǎng)絡(luò)爬蟲(chóng)的框架如圖所示:

網(wǎng)絡(luò)爬蟲(chóng)框架.png

網(wǎng)絡(luò)爬蟲(chóng)的基本工作流程如下:

  1. 首先選取一部分精心挑選的種子URL
  2. 將這些URL放入待抓取URL隊(duì)列
  3. 從待抓取URL隊(duì)列中取出待抓取在URL耻煤,解析DNS具壮,并且得到主機(jī)的ip准颓,并將URL對(duì)應(yīng)的網(wǎng)頁(yè)下載下來(lái),存儲(chǔ)進(jìn)已下載網(wǎng)頁(yè)庫(kù)中棺妓。此外攘已,將這些URL放進(jìn)已抓取URL隊(duì)列
  4. 分析已抓取URL隊(duì)列中的URL,分析其中的其他URL怜跑,并且將URL放入待抓取URL隊(duì)列样勃,從而進(jìn)入下一個(gè)循環(huán)

2. Java爬蟲(chóng)框架

2.1 Nutch

Nutch屬于分布式爬蟲(chóng)吠勘,爬蟲(chóng)使用分布式,主要是解決兩個(gè)問(wèn)題:1)海量URL管理峡眶;2)網(wǎng)速剧防。如果要做搜索引擎,Nutch1.x是一個(gè)非常好的選擇辫樱。Nutch1.x和solr或者es配合峭拘,就可以構(gòu)成一套非常強(qiáng)大的搜索引擎,否則盡量不要選擇Nutch作為爬蟲(chóng)狮暑。用Nutch進(jìn)行爬蟲(chóng)的二次開(kāi)發(fā)鸡挠,爬蟲(chóng)的編寫(xiě)和調(diào)試所需的時(shí)間,往往是單機(jī)爬蟲(chóng)所需的十倍時(shí)間不止搬男。

2.2 Heritrix

Heritrix 是個(gè)“Archival Crawler”——來(lái)獲取完整的拣展、精確的、站點(diǎn)內(nèi)容的深度復(fù)制缔逛。包括獲取圖像以及其他非文本內(nèi)容备埃。抓取并存儲(chǔ)相關(guān)的內(nèi)容。對(duì)內(nèi)容來(lái)者不拒译株,不對(duì)頁(yè)面進(jìn)行內(nèi)容上的修改瓜喇。重新爬行對(duì)相同的URL不針對(duì)先前的進(jìn)行替換。爬蟲(chóng)主要通過(guò)Web用戶(hù)界面啟動(dòng)歉糜、監(jiān)控和調(diào)整乘寒,允許彈性的定義要獲取的url。

2.3 crawler4j

crawler4j是Java實(shí)現(xiàn)的開(kāi)源網(wǎng)絡(luò)爬蟲(chóng)匪补。提供了簡(jiǎn)單易用的接口伞辛,可以在幾分鐘內(nèi)創(chuàng)建一個(gè)多線(xiàn)程網(wǎng)絡(luò)爬蟲(chóng)。

2.4 WebCollector

WebCollector使用了Nutch的爬取邏輯(分層廣度遍歷)夯缺,Crawler4j的的用戶(hù)接口(覆蓋visit方法蚤氏,定義用戶(hù)操作),以及一套自己的插件機(jī)制,設(shè)計(jì)了一套爬蟲(chóng)內(nèi)核踊兜。

2.5 WebMagic

WebMagic項(xiàng)目代碼分為核心和擴(kuò)展兩部分竿滨。核心部分(webmagic-core)是一個(gè)精簡(jiǎn)的、模塊化的爬蟲(chóng)實(shí)現(xiàn)捏境,而擴(kuò)展部分則包括一些便利的于游、實(shí)用性的功能。WebMagic的架構(gòu)設(shè)計(jì)參照了Scrapy垫言,目標(biāo)是盡量的模塊化贰剥,并體現(xiàn)爬蟲(chóng)的功能特點(diǎn)。

3. HttpClient&Jsoup

爬蟲(chóng)實(shí)現(xiàn)的技術(shù)有很多筷频,對(duì)于java語(yǔ)言來(lái)說(shuō)蚌成,有很多的選擇前痘,可以是很多開(kāi)源的爬蟲(chóng)框架,也可以使用基本httpClient,Jsoup來(lái)爬取網(wǎng)頁(yè)

3.1 HttpClient簡(jiǎn)介

HttpClient 是 apache 組織下面的一個(gè)用于處理 HTTP 請(qǐng)求和響應(yīng)的開(kāi)源工具担忧。它不是一個(gè)瀏覽器芹缔,也不處理客戶(hù)端緩存等瀏覽器的功能。它只是一個(gè)類(lèi)庫(kù)瓶盛!它在 JDK 的基本類(lèi)庫(kù)基礎(chǔ)上做了更好的封裝乖菱。

HttpClient 項(xiàng)目依賴(lài)于 HttpCore(處理核心的 HTTP 協(xié)議)、commons-codec(處理與編碼有關(guān)的問(wèn)題的項(xiàng)目)和 commons-logging(處理與日志記錄有關(guān)問(wèn)題的項(xiàng)目)蓬网。如果你希望能夠通過(guò) HttpClient 向服務(wù)器上傳文件等與 multipart 編碼類(lèi)型有關(guān)的請(qǐng)求窒所,以及其它復(fù)雜的MIME 類(lèi)型,那么帆锋,你需要另外一個(gè)依賴(lài)包:HttpMime(它是專(zhuān)門(mén)處理與 MIME 類(lèi)型有關(guān)問(wèn)題的項(xiàng)目)吵取,在下載的 HttpClient 包中(下載地址)已經(jīng)包含了 HttpMime

項(xiàng)目中使用的 HttpClient 版本為:4.0.1GA,httpClient需要有以下依賴(lài)包:

httpclient.png
  • httpclient-4.0.1.jar
  • httpcore-4.0.1.jar
  • httpmime-4.0.1.jar

又依賴(lài)于 mime4j(apache-mime4j-0.6.jar)

  • commons-codec-1.4.jar
  • commons-logging-1.1.1.jar
  • commons-io-1.4.jar – 為了更方便處理與 IO 有關(guān)的需求

3.2 HttpClient抓取網(wǎng)頁(yè)流程

使用HttpClient發(fā)送請(qǐng)求锯厢、接收響應(yīng)很簡(jiǎn)單皮官,一般需要如下幾步:

  1. 創(chuàng)建HttpClient對(duì)象。
  2. 創(chuàng)建請(qǐng)求方法的實(shí)例实辑,并指定請(qǐng)求URL捺氢。如果需要發(fā)送GET請(qǐng)求,創(chuàng)建HttpGet對(duì)象剪撬;如果需要發(fā)送POST請(qǐng)求摄乒,創(chuàng)建HttpPost對(duì)象。
  3. 如果需要發(fā)送請(qǐng)求參數(shù)残黑,可調(diào)用HttpGet馍佑、HttpPost共同的setParams(HetpParams params)方法來(lái)添加請(qǐng)求參數(shù);對(duì)于HttpPost對(duì)象而言梨水,也可調(diào)用setEntity(HttpEntity entity)方法來(lái)設(shè)置請(qǐng)求參數(shù)拭荤。
  4. 調(diào)用HttpClient對(duì)象的execute(HttpUriRequest request)發(fā)送請(qǐng)求,該方法返回一個(gè)HttpResponse疫诽。
  5. 調(diào)用HttpResponse的getAllHeaders()舅世、getHeaders(String name)等方法可獲取服務(wù)器的響應(yīng)頭;調(diào)用HttpResponse的getEntity()方法可獲取HttpEntity對(duì)象奇徒,該對(duì)象包裝了服務(wù)器的響應(yīng)內(nèi)容雏亚。程序可通過(guò)該對(duì)象獲取服務(wù)器的響應(yīng)內(nèi)容。
  6. 釋放連接逼龟。無(wú)論執(zhí)行方法是否成功评凝,都必須釋放連接追葡。

3.3 簡(jiǎn)單抓取代碼

用HttpClient發(fā)送請(qǐng)求腺律,請(qǐng)求頭不帶cookie奕短,用EntityUtils解析響應(yīng)結(jié)果

public class MyHttpClient {
    /***
     * 需求:使用httpClient爬取傳智播客官方網(wǎng)站數(shù)據(jù)
     * 
     * @param args
     * @throws Exception
     * @throws ClientProtocolException
     */
    public static void main(String[] args) throws Exception {

        // 創(chuàng)建HttpClient對(duì)象
        HttpClient hClient = new DefaultHttpClient();

        // 設(shè)置響應(yīng)時(shí)間,設(shè)置傳智源碼時(shí)間匀钧,設(shè)置代理服務(wù)器(不使用本機(jī)的IP爬取翎碑,以防止被服務(wù)器識(shí)別從而IP加入黑名單)
        hClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000)
                .setParameter(CoreConnectionPNames.SO_TIMEOUT, 10000)
                .setParameter(ConnRouteParams.DEFAULT_PROXY, new HttpHost("111.155.124.67", 8123));

        // 爬蟲(chóng)URL大部分都是get請(qǐng)求,創(chuàng)建get請(qǐng)求對(duì)象
        HttpGet hget = new HttpGet("http://www.itcast.cn/");
        // 向傳智播客官方網(wǎng)站發(fā)送請(qǐng)求之斯,獲取網(wǎng)頁(yè)源碼
        HttpResponse response = hClient.execute(hget);
        // EntityUtils工具類(lèi)把網(wǎng)頁(yè)實(shí)體轉(zhuǎn)換成字符串
        String content = EntityUtils.toString(response.getEntity(), "utf-8");
        System.out.println(content);

    }

}

解析結(jié)果

Jsoup網(wǎng)絡(luò)爬蟲(chóng)

用HttpClient發(fā)送請(qǐng)求日杈,請(qǐng)求頭帶cookie,用EntityUtils解析響應(yīng)結(jié)果

//使用httpClient發(fā)送請(qǐng)求佑刷,使用Jsoup分析網(wǎng)頁(yè)
public static void main(String[] args) throws Exception {
    //創(chuàng)建httpClient客戶(hù)端
    HttpClient hClient = new DefaultHttpClient();
    //創(chuàng)建http發(fā)送請(qǐng)求對(duì)象莉擒,Httpget
    HttpGet hget = new HttpGet("http://www.itcast.cn");
    //設(shè)置請(qǐng)求頭
    hget.setHeader("Cookie", "login_sid_t=f39c57f474a4fbffeeac8b0d727c7310; " +
            "YF-Ugrow-G0=169004153682ef91866609488943c77f; " +
            "YF-V5-G0=cd5d86283b86b0d506628aedd6f8896e; WBStorage=7754ff192036c629|undefined;" +
            " _s_tentry=-; YF-Page-G0=074bd03ae4e08433ef66c71c2777fd84; " +
            "Apache=1025338456965.9829.1478277156276; " +
            "SINAGLOBAL=1025338456965.9829.1478277156276; " +
            "ULV=1478277156293:1:1:1:1025338456965.9829.1478277156276:; " +
            "SUB=_2AkMvQDcef8NhqwJRmP4Uzm7mbYxwzA_EieLBAH7sJRMxHRl" +
            "-yj9jqmwNtRBn0SIxPIgzk6P4Umq_twX_A70bVg..; " +
            "SUBP=0033WrSXqPxfM72-Ws9jqgMF55529P9D9W5J2ZDKK_Q-h8ni.aX3E1Ci");
    hget.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 " +
            "(KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36");
    //設(shè)置連接超時(shí),傳遞響應(yīng)超時(shí)
    hClient.getParams()
            .setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000)
            .setParameter(CoreConnectionPNames.SO_TIMEOUT, 10000)
            .setParameter(ConnRouteParams.DEFAULT_PROXY, new HttpHost("121.31.71.63", 80));
    //發(fā)送請(qǐng)求
    HttpResponse response = hClient.execute(hget);
    //獲取網(wǎng)頁(yè)內(nèi)容
    String content = EntityUtils.toString(response.getEntity(), "utf-8");
    System.out.println(content);
}

4. Jsoup簡(jiǎn)介

jsoup 是一款Java 的HTML解析器瘫絮,可直接解析某個(gè)URL地址涨冀、HTML文本內(nèi)容。它提供了一套非常省力的API麦萤,可通過(guò)DOM鹿鳖,CSS以及類(lèi)似于jQuery的操作方法來(lái)取出和操作數(shù)據(jù)

通常在寫(xiě)爬蟲(chóng)程序時(shí),httpClient結(jié)合Jsoup共同使用即可實(shí)現(xiàn)完美的爬蟲(chóng)系統(tǒng)壮莹。httpClient負(fù)責(zé)模擬瀏覽器發(fā)送請(qǐng)求翅帜,Jsoup負(fù)責(zé)解析httpClient請(qǐng)求返回的HTML頁(yè)面,解析獲取需要的數(shù)據(jù)

4.1 Jsoup獲取網(wǎng)頁(yè)流程

  1. 從一個(gè) URL命满,文件或字符串中解析 HTML
  2. 使用 DOM 或 CSS 選擇器來(lái)查找涝滴、取出數(shù)據(jù)
  3. 可操作 HTML 元素、屬性胶台、文本

4.2 Jsoup獲取網(wǎng)頁(yè)代碼

用Jsoup抓取傳智播客官網(wǎng)左側(cè)的數(shù)據(jù)狭莱,如圖所示

Jsoup網(wǎng)絡(luò)爬蟲(chóng)

用谷歌瀏覽器開(kāi)發(fā)者工具(F12)打開(kāi)查看源碼如下圖,從中可以看到ul標(biāo)簽的class選擇器為nav_txt

Jsoup網(wǎng)絡(luò)爬蟲(chóng)
public class HttpClientJsoup {
    /***
     * 需求:使用httpClient爬取傳智播客官方網(wǎng)站數(shù)據(jù)
     * 
     * @param args
     * @throws Exception
     * @throws ClientProtocolException
     */
    public static void main(String[] args) throws Exception {

        // 創(chuàng)建HttpClient對(duì)象
        HttpClient hClient = new DefaultHttpClient();

        // 設(shè)置響應(yīng)時(shí)間概作,設(shè)置傳智源碼時(shí)間腋妙,設(shè)置代理服務(wù)器
        /*hClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 10000)
                .setParameter(CoreConnectionPNames.SO_TIMEOUT, 10000)
                .setParameter(ConnRouteParams.DEFAULT_PROXY, new HttpHost("111.155.124.67", 8123));*/

        // 爬蟲(chóng)URL大部分都是get請(qǐng)求,創(chuàng)建get請(qǐng)求對(duì)象
        HttpGet hget = new HttpGet("http://www.itcast.cn/");
        hget.setHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 " +
                "(KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36");
        // 向傳智播客官方網(wǎng)站發(fā)送請(qǐng)求讯榕,獲取網(wǎng)頁(yè)源碼
        HttpResponse response = hClient.execute(hget);
        // EntityUtils工具類(lèi)把網(wǎng)頁(yè)實(shí)體轉(zhuǎn)換成字符串
        String content = EntityUtils.toString(response.getEntity(), "utf-8");
        // 使用Jsoup解析網(wǎng)頁(yè)內(nèi)容
        Document document = Jsoup.parse(content);
        // 獲取文檔標(biāo)題
        String title = document.title();
        System.out.println(title);
        
        Elements elements = document.select("ul.nav_txt a");
        System.out.println(elements);
        for(Element element : elements){
            System.out.println(element.text() + ":" + element.attr("href"));
        }
    }

}

解析結(jié)果

Jsoup網(wǎng)絡(luò)爬蟲(chóng)

使用jsoup向服務(wù)器發(fā)送請(qǐng)求

public class MyJsoup {
    /*
     * 需求:使用Jsoup解析網(wǎng)頁(yè)源碼
     */
    public static void main(String[] args) throws Exception {
        // 使用jsoup向服務(wù)器發(fā)送請(qǐng)求
        Document doc = Jsoup.connect("http://www.itcast.cn").get();
        // Jsoup使用類(lèi)型css,Jquery選擇器方式獲取元素節(jié)點(diǎn)
        // Elements elements = doc.getElementsByTag("a");
        // System.out.println(elements.text());
        Elements elements = doc.select("ul.nav_txt a");
        // 循環(huán)元素
        for (Element element : elements) {
            System.out.println(element.text() + ":" + element.attr("href"));
        }

    }

}

解析結(jié)果

Jsoup網(wǎng)絡(luò)爬蟲(chóng)

5. 綜合應(yīng)用

解析下圖中紅色框的內(nèi)容骤素,HttpClient發(fā)送請(qǐng)求,Jsoup解析結(jié)果

Jsoup網(wǎng)絡(luò)爬蟲(chóng)

點(diǎn)擊開(kāi)發(fā)者工具的第一個(gè)圖標(biāo)愚屁,移動(dòng)鼠標(biāo)到網(wǎng)頁(yè)的目標(biāo)位置济竹,即可定位到該目標(biāo)的網(wǎng)頁(yè)源碼位置

Jsoup網(wǎng)絡(luò)爬蟲(chóng)
package com.github.webcrawder;

import java.io.IOException;

import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

public class CrawderDemo {
    public static void main(String[] args) throws ClientProtocolException, IOException {
        // 創(chuàng)建httpClient客戶(hù)端
        HttpClient hClient = new DefaultHttpClient();
        // 創(chuàng)建http發(fā)送請(qǐng)求對(duì)象,Httpget
        HttpGet hget = new HttpGet("http://www.itcast.cn");
        // 發(fā)送請(qǐng)求
        HttpResponse response = hClient.execute(hget);
        // 獲取網(wǎng)頁(yè)內(nèi)容
        String content = EntityUtils.toString(response.getEntity(), "utf-8");
        // 使用Jsoup解析網(wǎng)頁(yè)內(nèi)容
        Document document = Jsoup.parse(content);
        // 使用元素選擇器選擇網(wǎng)頁(yè)的內(nèi)容
        Elements elements = document.select("ul.nav_li a");
        System.out.println(elements.text());
        System.out.println(elements);

    }

}

解析結(jié)果

Jsoup網(wǎng)絡(luò)爬蟲(chóng)
//使用jsoup加載遠(yuǎn)程連接數(shù)據(jù)
@Test
public void myJsouptest() throws Exception {
    String userAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like " +
            "Gecko) Chrome/44.0.2403.157 Safari/537.36";
    //準(zhǔn)備cookie信息
    Map<String, String> maps = new HashMap<String, String>();
    maps.put("TC-Ugrow-G0", "968b70b7bcdc28ac97c8130dd353b55e");
    maps.put("SUB", "2AkMvfeeDf8NhqwJRmP0dzGvhZY5yywvEieLBAH7sJRMxHRl-yT9jqmAHtRAgR4BQZgBIE" +
            "-Xz-jsqjVftcUdtrA..");
    maps.put("SUBP", "0033WrSXqPxfM72-Ws9jqgMF55529P9D9WhBu3bohh6dYkXbY_GUs5d8");
    //獲取網(wǎng)頁(yè)dom對(duì)象
    Document doc = Jsoup.connect("http://www.itcast.cn/")
            .userAgent(userAgent)
            .cookies(maps).get();
    //獲取文檔標(biāo)簽
    String title = doc.title();
    System.out.println(title);
    //獲取網(wǎng)頁(yè)元素
    Elements elements = doc.select("div.qrcode-text");
    System.out.println(elements.text());
}

6.爬蟲(chóng)在電商網(wǎng)站應(yīng)用

代碼下載 http://download.csdn.net/detail/axi295309066/9782505

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末霎槐,一起剝皮案震驚了整個(gè)濱河市送浊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丘跌,老刑警劉巖袭景,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唁桩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡耸棒,警方通過(guò)查閱死者的電腦和手機(jī)荒澡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)与殃,“玉大人单山,你說(shuō)我怎么就攤上這事》郏” “怎么了米奸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)爽篷。 經(jīng)常有香客問(wèn)我躏升,道長(zhǎng),這世上最難降的妖魔是什么狼忱? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任膨疏,我火速辦了婚禮,結(jié)果婚禮上钻弄,老公的妹妹穿的比我還像新娘佃却。我一直安慰自己,他們只是感情好窘俺,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布饲帅。 她就那樣靜靜地躺著,像睡著了一般瘤泪。 火紅的嫁衣襯著肌膚如雪灶泵。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天对途,我揣著相機(jī)與錄音赦邻,去河邊找鬼。 笑死实檀,一個(gè)胖子當(dāng)著我的面吹牛惶洲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播膳犹,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼恬吕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了须床?” 一聲冷哼從身側(cè)響起铐料,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后钠惩,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體柒凉,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年妻柒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耘分。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡举塔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出求泰,到底是詐尸還是另有隱情央渣,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布渴频,位于F島的核電站芽丹,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏卜朗。R本人自食惡果不足惜拔第,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望场钉。 院中可真熱鬧蚊俺,春花似錦、人聲如沸逛万。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)宇植。三九已至得封,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間指郁,已是汗流浹背忙上。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留闲坎,地道東北人晨横。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像箫柳,于是被迫代替她去往敵國(guó)和親手形。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理悯恍,服務(wù)發(fā)現(xiàn)库糠,斷路器,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • 要玩大數(shù)據(jù)贷屎,沒(méi)有數(shù)據(jù)怎么玩?這里推薦一些33款開(kāi)源爬蟲(chóng)軟件給大家艘虎。 爬蟲(chóng)唉侄,即網(wǎng)絡(luò)爬蟲(chóng),是一種自動(dòng)獲取網(wǎng)頁(yè)內(nèi)容的程序...
    評(píng)評(píng)分分閱讀 7,997評(píng)論 2 121
  • 33款可用來(lái)抓數(shù)據(jù)的開(kāi)源爬蟲(chóng)軟件工具 要玩大數(shù)據(jù)野建,沒(méi)有數(shù)據(jù)怎么玩属划?這里推薦一些33款開(kāi)源爬蟲(chóng)軟件給大家。 爬蟲(chóng)候生,即...
    visiontry閱讀 7,327評(píng)論 1 99
  • 8.1:早同眯,睡眠,上午尋找借的別人的自行車(chē)鑰匙唯鸭,QQ聊天须蜗,午睡,下午目溉,科一明肮,QQ聊天,晚上缭付,大招晤愧,讀書(shū) 8.2早上...
    葉鳥(niǎo)app閱讀 207評(píng)論 0 0
  • 連續(xù)練習(xí)了50天楷書(shū),效果并不怎么顯著蛉腌,但是漸漸開(kāi)始享受這個(gè)過(guò)程官份。
    思渝州閱讀 370評(píng)論 4 3