亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

基于RxJava2實(shí)現(xiàn)的簡(jiǎn)單圖片爬蟲(chóng)的方法

 更新時(shí)間:2018年02月01日 10:17:11   作者:fengzhizi715  
本篇文章主要介紹了基于RxJava2實(shí)現(xiàn)的簡(jiǎn)單圖片爬蟲(chóng)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

今年十月份以來(lái),跟朋友嘗試導(dǎo)入一些圖片到tensorflow來(lái)生成模型,這就需要大量的圖片。剛開(kāi)始我只寫(xiě)了一個(gè)簡(jiǎn)單的HttpClient程序來(lái)抓取圖片,后來(lái)為了通用性索性寫(xiě)一個(gè)簡(jiǎn)單的圖片爬蟲(chóng)程序。它可以用于抓取單張圖片、多張圖片、某個(gè)網(wǎng)頁(yè)下的所有圖片、多個(gè)網(wǎng)頁(yè)下的所有圖片。

github地址:https://github.com/fengzhizi715/PicCrawler

這個(gè)爬蟲(chóng)使用了HttpClient、RxJava2以及Java 8的一些特性。它支持一些簡(jiǎn)單的定制,比如定制User-Agent、Referer、Cookies等。

一.下載安裝:

對(duì)于Java項(xiàng)目如果使用gradle構(gòu)建,由于默認(rèn)不是使用jcenter,需要在相應(yīng)module的build.gradle中配置

repositories {
  mavenCentral()
  jcenter()
}

Gradle:

compile 'com.cv4j.piccrawler:crawler:0.2.1'

Maven:

<dependency>
 <groupId>com.cv4j.piccrawler</groupId>
 <artifactId>crawler</artifactId>
 <version>0.2.1</version>
 <type>pom</type>
</dependency>

二.使用方法:

2.1 下載單張圖片

1、普通方式

    String url = "..."; // 圖片的地址
    CrawlerClient.get()
        .timeOut(6000)
        .fileStrategy(new FileStrategy() {

          @Override
          public String filePath() {
            return "temp";
          }

          @Override
          public String picFormat() {
            return "png";
          }

          @Override
          public FileGenType genType() {

            return FileGenType.AUTO_INCREMENT;
          }
        })
        .repeat(200) // 重復(fù)200次
        .build()
        .downloadPic(url);

在這里,timeOut()表示網(wǎng)絡(luò)請(qǐng)求的超時(shí)時(shí)間。fileStrategy()表示存放的目錄、文件使用的格式、生成的文件時(shí)使用何種策略。repeat()表示對(duì)該圖片請(qǐng)求重復(fù)的次數(shù)。

PicCrawler支持多種文件的生成策略,比如隨機(jī)生成文件名、從1開(kāi)始自增長(zhǎng)地生成文件名、生成指定的文件名等等。

下圖顯示了使用該程序?qū)δ瞅?yàn)證碼的圖片下載200次。


2、使用RxJava的方式下載

    String url = "..."; // 圖片的地址
    CrawlerClient.get()
        .timeOut(6000)
        .fileStrategy(new FileStrategy() {

          @Override
          public String filePath() {
            return "temp";
          }

          @Override
          public String picFormat() {
            return "png";
          }

          @Override
          public FileGenType genType() {

            return FileGenType.AUTO_INCREMENT;
          }
        })
        .repeat(200)
        .build()
        .downloadPicUseRx(url);

3、使用RxJava,下載之后的圖片還能做后續(xù)的處理

    String url = "..."; // 圖片的地址
    CrawlerClient.get()
        .timeOut(6000)
        .fileStrategy(new FileStrategy() {

          @Override
          public String filePath() {
            return "temp";
          }

          @Override
          public String picFormat() {
            return "png";
          }

          @Override
          public FileGenType genType() {

            return FileGenType.AUTO_INCREMENT;
          }
        })
        .repeat(200)
        .build()
        .downloadPicToFlowable(url)
        .subscribe(new Consumer<File>() {
          @Override
          public void accept(File file) throws Exception {
            // do something
          }
        });

在Consumer中,可以對(duì)文件做一些后續(xù)的處理。

2.2 下載多張圖片

    List<String> urls = ...; // 多張圖片地址的集合
    CrawlerClient.get()
        .timeOut(6000)
        .fileStrategy(new FileStrategy() {

          @Override
          public String filePath() {
            return "temp";
          }

          @Override
          public String picFormat() {
            return "png";
          }

          @Override
          public FileGenType genType() {

            return FileGenType.AUTO_INCREMENT;
          }
        })
        .build()
        .downloadPics(urls);

2.3 下載某個(gè)網(wǎng)頁(yè)的全部圖片

    String url = "http://www.jianshu.com/u/4f2c483c12d8"; // 針對(duì)某一網(wǎng)址
    CrawlerClient.get()
        .timeOut(6000)
        .fileStrategy(new FileStrategy() {

          @Override
          public String filePath() {
            return "temp";
          }

          @Override
          public String picFormat() {
            return "png";
          }

          @Override
          public FileGenType genType() {

            return FileGenType.AUTO_INCREMENT;
          }
        })
        .build()
        .downloadWebPageImages(url);

使用上面的程序,對(duì)我簡(jiǎn)書(shū)主頁(yè)上的圖片進(jìn)行抓取。


2.4 下載多個(gè)網(wǎng)頁(yè)的全部圖片

 

    List<String> urls = new ArrayList<>(); // 多個(gè)網(wǎng)頁(yè)的集合
    urls.add("http://www.jianshu.com/u/4f2c483c12d8");
    urls.add("https://toutiao.io/");
    CrawlerClient.get()
        .timeOut(6000)
        .fileStrategy(new FileStrategy() {
          @Override
          public String filePath() {
            return "temp";
          }

          @Override
          public String picFormat() {
            return "png";
          }

          @Override
          public FileGenType genType() {

            return FileGenType.AUTO_INCREMENT;
          }
        })
        .build()
        .downloadWebPageImages(urls);

下載個(gè)人簡(jiǎn)書(shū)主頁(yè)上的圖以及開(kāi)發(fā)者頭條的圖片。


三. 部分源碼解析

3.1 下載某個(gè)網(wǎng)頁(yè)的全部圖片

downloadWebPageImages()方法表示下載某個(gè)url的全部圖片。

  /**
   * 下載整個(gè)網(wǎng)頁(yè)的全部圖片
   * @param url
   */
  public void downloadWebPageImages(String url) {
    Flowable.just(url)
        .map(s->httpManager.createHttpWithGet(s))
        .map(response->parseHtmlToImages(response))
        .subscribe(urls -> downloadPics(urls),
            throwable-> System.out.println(throwable.getMessage()));
  }

downloadWebPageImages()分成三步:創(chuàng)建網(wǎng)絡(luò)請(qǐng)求、解析出當(dāng)前頁(yè)面中包含的圖片路徑、下載這些圖片。

第一步,創(chuàng)建網(wǎng)絡(luò)請(qǐng)求使用了HttpClient。

  public CloseableHttpResponse createHttpWithGet(String url) {
    // 獲取客戶(hù)端連接對(duì)象
    CloseableHttpClient httpClient = getHttpClient();
    // 創(chuàng)建Get請(qǐng)求對(duì)象
    HttpGet httpGet = new HttpGet(url);
    if (Preconditions.isNotBlank(httpParam)) {
      Map<String,String> header = httpParam.getHeader();
      if (Preconditions.isNotBlank(header)) {
        for (String key : header.keySet()) {
          httpGet.setHeader(key,header.get(key));
        }
      }
    }
    CloseableHttpResponse response = null;
    // 執(zhí)行請(qǐng)求
    try {
      response = httpClient.execute(httpGet);
    } catch (IOException e) {
      e.printStackTrace();
    }
    return response;
  }

第二步,將返回的response轉(zhuǎn)換成String類(lèi)型,使用jsoup將帶有圖片的鏈接全部過(guò)濾出來(lái)。

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

private List<String> parseHtmlToImages(CloseableHttpResponse response) {
    // 獲取響應(yīng)實(shí)體
    HttpEntity entity = response.getEntity();
    InputStream is = null;
    String html = null;
    try {
      is = entity.getContent();
      html = IOUtils.inputStream2String(is);
    } catch (IOException e) {
      e.printStackTrace();
    }
    Document doc = Jsoup.parse(html);
    Elements media = doc.select("[src]");
    List<String> urls = new ArrayList<>();
    if (Preconditions.isNotBlank(media)) {
      for (Element src : media) {
        if (src.tagName().equals("img")) {
          if (Preconditions.isNotBlank(src.attr("abs:src"))) { // 圖片的絕對(duì)路徑不為空
            String picUrl = src.attr("abs:src");
            log.info(picUrl);
            urls.add(picUrl);
          } else if (Preconditions.isNotBlank(src.attr("src"))){ // 圖片的相對(duì)路徑不為空
            String picUrl = src.attr("src").replace("http://","");
            picUrl = "http://"+Utils.tryToEscapeUrl(picUrl);
            log.info(picUrl);
            urls.add(picUrl);
          }
        }
      }
    }

    if (response != null) {
      try {
        EntityUtils.consume(response.getEntity());
        response.close();
      } catch (IOException e) {
        System.err.println("釋放鏈接錯(cuò)誤");
        e.printStackTrace();
      }
    }
    return urls;
  }

第三步,下載這些圖片使用了Java 8的CompletableFuture。CompletableFuture是Java 8新增的用于異步處理的類(lèi),而且CompletableFuture的性能也好于傳統(tǒng)的Future。

  /**
   * 下載多張圖片
   * @param urls
   */
  public void downloadPics(List<String> urls) {
    if (Preconditions.isNotBlank(urls)) {
      urls.stream().parallel().forEach(url->{
        try {
          CompletableFuture.runAsync(() -> downloadPic(url)).get();
        } catch (InterruptedException e) {
          e.printStackTrace();
        } catch (ExecutionException e) {
          e.printStackTrace();
        }
      });
    }
  }

3.2 下載多個(gè)網(wǎng)頁(yè)的全部圖片

downloadWebPageImages()方法還支持傳List集合,表示多個(gè)網(wǎng)頁(yè)的地址。

  /**
   * 下載多個(gè)網(wǎng)頁(yè)的全部圖片
   * @param urls
   */
  public void downloadWebPageImages(List<String> urls) {
    if (Preconditions.isNotBlank(urls)) {
      Flowable.fromIterable(urls)
          .parallel()
          .map(url->httpManager.createHttpWithGet(url))
          .map(response->parseHtmlToImages(response))
          .sequential()
          .subscribe(list -> downloadPics(list),
              throwable-> System.out.println(throwable.getMessage()));
    }
  }

在這里其實(shí)用到了ParallelFlowable,因?yàn)閜arallel()可以把Flowable轉(zhuǎn)成ParallelFlowable。

總結(jié)

PicCrawler 是一個(gè)簡(jiǎn)單的圖片爬蟲(chóng),目前基本可以滿(mǎn)足我的需求。未來(lái)要是有新的需求,我會(huì)不斷添加功能。

在做PicCrawler時(shí),其實(shí)還做了一個(gè)ProxyPool用于獲取可用代理池的庫(kù),它也是基于RxJava2實(shí)現(xiàn)的。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android Handler消息傳遞機(jī)制

    Android Handler消息傳遞機(jī)制

    Handler是一套 Android 消息傳遞機(jī)制,主要用于線(xiàn)程間通信。用最簡(jiǎn)單的話(huà)描述: handler其實(shí)就是主線(xiàn)程在起了一個(gè)子線(xiàn)程,子線(xiàn)程運(yùn)行并生成Message,Looper獲取message并傳遞給Handler,Handler逐個(gè)獲取子線(xiàn)程中的Message
    2022-12-12
  • Android WebView的使用方法及與JS 相互調(diào)用

    Android WebView的使用方法及與JS 相互調(diào)用

    這篇文章主要介紹了Android WebView的使用方法及與JS 相互調(diào)用的相關(guān)資料,WebView 是 Android 中一個(gè)非常實(shí)用的組&#8203;件, WebView 可以使得網(wǎng)頁(yè)輕松的內(nèi)嵌到app里,還可以直接跟js相互調(diào)用,需要的朋友可以參考下
    2017-07-07
  • 詳解Android中的SharedPreferences

    詳解Android中的SharedPreferences

    這篇文章主要介紹了Android中的SharedPreferences,包括 SharedPreferences的特點(diǎn)和使用方法,需要的朋友可以參考下
    2017-05-05
  • Android學(xué)習(xí)之介紹Binder的簡(jiǎn)單使用

    Android學(xué)習(xí)之介紹Binder的簡(jiǎn)單使用

    BInder方面的資料雖然感覺(jué)看的比較多,但是真正用的時(shí)候才發(fā)現(xiàn)有很多地方模棱兩棵的,所以,打算用一個(gè)實(shí)例再來(lái)鞏固一下binder的使用方法。這篇文章主要介紹了Android中Binder的簡(jiǎn)單使用,文中給出詳細(xì)的示例代碼,需要的朋友可以參考下
    2016-12-12
  • Android實(shí)現(xiàn)隨意拖動(dòng)View效果的實(shí)例代碼

    Android實(shí)現(xiàn)隨意拖動(dòng)View效果的實(shí)例代碼

    這篇文章主要介紹了Android實(shí)現(xiàn)隨意拖動(dòng)View效果,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Android輕松畫(huà)出觸摸軌跡

    Android輕松畫(huà)出觸摸軌跡

    這篇文章主要為大家詳細(xì)介紹了Android輕松畫(huà)出觸摸軌跡的實(shí)現(xiàn)方法,為大家分享了一個(gè)觸摸軌跡類(lèi),感興趣的小伙伴們可以參考一下
    2016-03-03
  • Android Socket接口實(shí)現(xiàn)即時(shí)通訊實(shí)例代碼

    Android Socket接口實(shí)現(xiàn)即時(shí)通訊實(shí)例代碼

    這篇文章主要介紹了Android Socket接口實(shí)現(xiàn)即時(shí)通訊實(shí)例代碼的相關(guān)資料,這里對(duì)通訊知識(shí)進(jìn)行了詳細(xì)介紹,并用Socket 接口實(shí)現(xiàn)通訊實(shí)例,需要的朋友可以參考下
    2016-12-12
  • Android實(shí)現(xiàn)數(shù)據(jù)按照時(shí)間排序

    Android實(shí)現(xiàn)數(shù)據(jù)按照時(shí)間排序

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)數(shù)據(jù)按照時(shí)間排序的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • android 字體顏色選擇器(ColorPicker)介紹

    android 字體顏色選擇器(ColorPicker)介紹

    本文將詳細(xì)介紹android 字體顏色選擇器(ColorPicker)需要了解更多的朋友可以參考下
    2012-11-11
  • Android Studio finish()方法的使用與解決app點(diǎn)擊“返回”(直接退出)

    Android Studio finish()方法的使用與解決app點(diǎn)擊“返回”(直接退出)

    這篇文章主要介紹了Android Studio finish()方法的使用與解決app點(diǎn)擊“返回”(直接退出),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04

最新評(píng)論