使用Java寫(xiě)一個(gè)簡(jiǎn)單爬蟲(chóng)爬取單頁(yè)面

使用Java爬蟲(chóng)爬取人民日?qǐng)?bào)公眾號(hào)頁(yè)面圖片

使用Java框架Jsoup和HttpClient實(shí)現(xiàn),先看代碼
爬取目標(biāo)頁(yè)面

1厚脉、使用Maven構(gòu)建一個(gè)普通Java工程

加入依賴(lài):

        <!--用來(lái)解析Html頁(yè)面的第三方Jar-->
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.11.2</version>
        </dependency>
        <!--用來(lái)模擬Http客戶(hù)端的第三方Jar-->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
            <version>4.3.1</version>
        </dependency>

2浅缸、第一個(gè)類(lèi)浦楣,開(kāi)始爬取入口類(lèi)

package com.yomihu.spider;

import com.yomihu.parse.ParseHtml;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * mini-spider 單頁(yè)面爬取啟動(dòng)類(lèi)
 *
 * @Author 孫龍
 * @Date 2018/1/28
 */
public class SinglePageSpiderStarter {
    /**
     * 開(kāi)始頁(yè)面的URL(一個(gè)微信公眾號(hào)的頁(yè)面)
     */
    private static final String START_URL = "https://mp.weixin.qq.com/s/zzkEWbcb81pbsr-PJvVzQA";
   /**
     * 目標(biāo)圖片存放目錄
     */
    private static final String IMG_SAVE_PATH = "E:/jj";

    public static void main(String[] args) throws Exception {
        //使用Jsoup將目標(biāo)Url的Html頁(yè)面獲取為Document變量
        Document rootdocument = Jsoup.connect(START_URL).get();

        List<String> urlList = new ArrayList<String>();
        //將頁(yè)面中的目標(biāo)Url解析為列表
        ParseHtml.singlePageParseImg(rootdocument, urlList);
        //初始化HttpClient對(duì)象
        CloseableHttpClient httpClient = HttpClients.createDefault();
        //控制圖片名稱(chēng)的變量
        int i = 0;
        for (String url : urlList) {
            HttpGet httpGet = new HttpGet(url);
            CloseableHttpResponse response = httpClient.execute(httpGet);

            InputStream inputStream = response.getEntity().getContent();
            //保存圖片
            File file = new File(IMG_SAVE_PATH);
            if (!file.exists()) {
                //不存在就創(chuàng)建該目錄
                file.mkdirs();
            }
            String imgName = IMG_SAVE_PATH + File.separator + "test" + i + ".jpg";
            //保存圖片
            FileOutputStream fos = new FileOutputStream(imgName);
            i++;
            byte[] data = new byte[1024];
            int len;
            while ((len = inputStream.read(data)) != -1) {
                fos.write(data, 0, len);
            }
            //釋放資源
            response.close();
        }
        httpClient.close();

    }
}

3蹭越、第二個(gè)類(lèi)抹恳,解析Html頁(yè)面

package com.yomihu.parse;

import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;
import java.util.List;

/**
 * mini-spider Html頁(yè)面結(jié)構(gòu)解析
 *
 * @Author 孫龍
 * @Date 2018/1/28
 */
public class ParseHtml {

    /**
     * 微信單頁(yè)面結(jié)構(gòu)解析,這里我們只要將頁(yè)面中的圖片對(duì)應(yīng)的URL取出
     * (方法中的解析邏輯是根據(jù)分析頁(yè)面結(jié)構(gòu)和各元素的特征來(lái)解析的)
     *
     * @param document
     * @param urls
     */
    public static void singlePageParseImg(Document document, List<String> urls) {

        Elements divElements = document.select("[class=rich_media_content]");

        Elements pElements = divElements.select("p");
        Elements imgElements = pElements.select("img");
        for (Element imgElement : imgElements) {
            urls.add(imgElement.attr("data-src"));
             //打印目標(biāo)數(shù)據(jù)橙困,查看是否正確
        }
        Elements spanElements = pElements.select("span");

        Elements imgElemnets = spanElements.select("img");
        for (Element imgElement : imgElemnets) {
            urls.add(imgElement.attr("data-src"));
            //打印目標(biāo)數(shù)據(jù)瞧掺,查看是否正確
            System.out.println(imgElement.attr("data-src"));
        }
    }
}

4、啟動(dòng)第一個(gè)類(lèi)中的main函數(shù)

查看我們爬取的目標(biāo)圖片是否已經(jīng)存在目錄中凡傅。

總結(jié)

其實(shí)爬蟲(chóng)并不難寫(xiě)辟狈,首先要先知道爬蟲(chóng)是什么東西。爬蟲(chóng)就是使用程序模擬一個(gè)瀏覽器對(duì)頁(yè)面上的數(shù)據(jù)進(jìn)行不斷的連接獲取解析并保存夏跷;這里我只是使用Apache開(kāi)源的成熟框架進(jìn)行開(kāi)發(fā)哼转,實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的單頁(yè)面抓取,同樣的多頁(yè)面循環(huán)抓取就需要在程序中做不斷的迭代槽华,并不斷的更新爬取目標(biāo)壹蔓;即在使用程序解析頁(yè)面的時(shí)候?qū)⑾乱粋€(gè)目標(biāo)頁(yè)的Url保存在待爬取的列表中。
爬蟲(chóng)并不難實(shí)現(xiàn)猫态,難的是對(duì)目標(biāo)頁(yè)面分析佣蓉,找到頁(yè)面中個(gè)元素之間的規(guī)律披摄,對(duì)頁(yè)面進(jìn)行規(guī)律性解析,并獲取到我們想要的數(shù)據(jù)勇凭;當(dāng)然更難的是有些大網(wǎng)站服務(wù)器上的反爬蟲(chóng)機(jī)制疚膊。

接下來(lái)我會(huì)實(shí)現(xiàn)一個(gè)多頁(yè)面循環(huán)抓取的Demo
示例代碼

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市虾标,隨后出現(xiàn)的幾起案子酿联,更是在濱河造成了極大的恐慌,老刑警劉巖夺巩,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贞让,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡柳譬,警方通過(guò)查閱死者的電腦和手機(jī)喳张,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)美澳,“玉大人销部,你說(shuō)我怎么就攤上這事≈聘” “怎么了舅桩?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)雨膨。 經(jīng)常有香客問(wèn)我擂涛,道長(zhǎng),這世上最難降的妖魔是什么聊记? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任撒妈,我火速辦了婚禮,結(jié)果婚禮上排监,老公的妹妹穿的比我還像新娘狰右。我一直安慰自己,他們只是感情好舆床,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布棋蚌。 她就那樣靜靜地躺著,像睡著了一般挨队。 火紅的嫁衣襯著肌膚如雪谷暮。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天瞒瘸,我揣著相機(jī)與錄音坷备,去河邊找鬼熄浓。 笑死情臭,一個(gè)胖子當(dāng)著我的面吹牛省撑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播俯在,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼竟秫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了跷乐?” 一聲冷哼從身側(cè)響起肥败,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎愕提,沒(méi)想到半個(gè)月后馒稍,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浅侨,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年纽谒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片如输。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鼓黔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出不见,到底是詐尸還是另有隱情澳化,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布稳吮,位于F島的核電站缎谷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏灶似。R本人自食惡果不足惜慎陵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望喻奥。 院中可真熱鬧席纽,春花似錦、人聲如沸撞蚕。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)甥厦。三九已至纺铭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間刀疙,已是汗流浹背舶赔。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谦秧,地道東北人竟纳。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓撵溃,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親锥累。 傳聞我的和親對(duì)象是個(gè)殘疾皇子缘挑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,522評(píng)論 25 707
  • 于梁梁梁閱讀 138評(píng)論 0 0
  • 想寫(xiě)封信給你 說(shuō)‘秋天該很好 我喜歡這樣的秋 關(guān)于一個(gè)人的 還有一個(gè)人,依然有 很多人桶略,很多人的秋天 破碎的記憶…...
    Mino_深海老怪物閱讀 158評(píng)論 0 1
  • 一 好吧语淘。 嘆了口氣,醒來(lái)的時(shí)候际歼,她努力揉了揉眼睛惶翻,然后凝視著周六窗外明媚的藍(lán)天,又重新回到兩眼無(wú)神地狀態(tài)掃視了一...
    張瀚允bling閱讀 226評(píng)論 0 2
  • 第二天 大清早就情緒低落鹅心。有什么事情是一碗米粉搞不定的维贺,一碗搞不定,那就接連吃上幾天巴帮。溯泣。。 天氣真的很熱榕茧,風(fēng)也是熱...
    流頦閱讀 137評(píng)論 0 0