Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 日韩大片免费看,天天操天天干天天做,国产91色综合久久免费分享

          整合營(yíng)銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          用 Java 拿下 HTML 分分鐘寫個(gè)小爬蟲

          文適合有 Java 基礎(chǔ)知識(shí)的人群

          本文作者:HelloGitHub-秦人

          HelloGitHub 推出的《講解開源項(xiàng)目》系列,今天給大家?guī)?lái)一款開源 Java 版一款網(wǎng)頁(yè)元素解析框架——jsoup,通過(guò)程序自動(dòng)獲取網(wǎng)頁(yè)數(shù)據(jù)。

          項(xiàng)目源碼地址:https://github.com/jhy/jsoup

          一、項(xiàng)目介紹

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

          jsoup 主要功能:

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

          二、使用框架

          2.1 準(zhǔn)備工作

          • 掌握 HTML 語(yǔ)法
          • Chrome 瀏覽器調(diào)試技巧
          • 掌握開發(fā)工具 idea 的基本操作

          2.2 學(xué)習(xí)源碼

          將項(xiàng)目導(dǎo)入 idea 開發(fā)工具,會(huì)自動(dòng)下載 maven 項(xiàng)目需要的依賴。源碼的項(xiàng)目結(jié)構(gòu)如下:

          快速學(xué)習(xí)源碼是每個(gè)程序員必備的技能,我總結(jié)了以下幾點(diǎn):

          1. 閱讀項(xiàng)目 ReadMe 文件,可以快速知道項(xiàng)目是做什么的。
          2. 概覽項(xiàng)目 pom.xml 文件,了解項(xiàng)目引用了哪些依賴。
          3. 查看項(xiàng)目結(jié)構(gòu)、源碼目錄、測(cè)試用例目錄,好的項(xiàng)目結(jié)構(gòu)清晰,層次明確。
          4. 運(yùn)行測(cè)試用例,快速體驗(yàn)項(xiàng)目。

          2.3 下載項(xiàng)目

          git clone https://github.com/jhy/jsoup
          

          2.4 運(yùn)行項(xiàng)目測(cè)試代碼

          通過(guò)上面的方法,我們很快可知 example 目錄是測(cè)試代碼,那我們直接來(lái)運(yùn)行。注:有些測(cè)試代碼需要稍微改造一下才可以運(yùn)行。

          例如,jsoup 的 Wikipedia 測(cè)試代碼:

          public class Wikipedia {
              public static void main(String[] args) throws IOException {
                  Document doc = Jsoup.connect("http://en.wikipedia.org/").get();
                  log(doc.title());
          
                  Elements newsHeadlines = doc.select("#mp-itn b a");
                  for (Element headline : newsHeadlines) {
                      log("%s\n\t%s", headline.attr("title"), headline.absUrl("href"));
                  }
              }
          
              private static void log(String msg, String... vals) {
                  System.out.println(String.format(msg, vals));
              }
          }
          

          說(shuō)明:上面代碼是獲取頁(yè)面(http://en.wikipedia.org/)包含(#mp-itn b a)選擇器的所有元素,并打印這些元素的 title , herf 屬性。維基百科 國(guó)內(nèi)無(wú)法訪問(wèn),所以上面這段代碼運(yùn)行會(huì)報(bào)錯(cuò)。

          改造后可運(yùn)行的代碼如下:

          public static void main(String[] args) throws IOException {
              Document doc = Jsoup.connect("https://www.baidu.com/").get();
              Elements newsHeadlines = doc.select("a[href]");
              for (Element headline : newsHeadlines) {
                  System.out.println("href: " +headline.absUrl("href") );
              }
          }
          

          三、工作原理

          Jsoup 的工作原理,首先需要指定一個(gè) URL,框架發(fā)送 HTTP 請(qǐng)求,然后獲取響應(yīng)頁(yè)面內(nèi)容,然后通過(guò)各種選擇器獲取頁(yè)面數(shù)據(jù)。整個(gè)工作流程如下圖:

          以上面為例:

          3.1 發(fā)請(qǐng)求

          Document doc = Jsoup.connect("https://www.baidu.com/").get();
          

          這行代碼就是發(fā)送 HTTP 請(qǐng)求,并獲取頁(yè)面響應(yīng)數(shù)據(jù)。

          3.2 數(shù)據(jù)篩選

          Elements newsHeadlines = doc.select("a[href]");
          

          定義選擇器,獲取匹配選擇器的數(shù)據(jù)。

          3.3 數(shù)據(jù)處理

          for (Element headline : newsHeadlines) {
                  System.out.println("href: " +headline.absUrl("href") );
              }
          

          這里對(duì)數(shù)據(jù)只做了一個(gè)簡(jiǎn)單的數(shù)據(jù)打印,當(dāng)然這些數(shù)據(jù)可寫入文件或數(shù)據(jù)的。

          四、實(shí)戰(zhàn)

          獲取豆瓣讀書 -> 新書速遞中每本新書的基本信息。包括:書名、書圖片鏈接、作者、內(nèi)容簡(jiǎn)介(詳情頁(yè)面)、作者簡(jiǎn)介(詳情頁(yè)面)、當(dāng)當(dāng)網(wǎng)書的價(jià)格(詳情頁(yè)面),最后將獲取的數(shù)據(jù)保存到 Excel 文件。

          目標(biāo)鏈接:https://book.douban.com/latest?icn=index-latestbook-all

          4.1 項(xiàng)目 pom.xml 文件

          項(xiàng)目引入 jsoup、lombok、easyexcel 三個(gè)庫(kù)。

          <?xml version="1.0" encoding="UTF-8"?>
          <project xmlns="http://maven.apache.org/POM/4.0.0"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
              <modelVersion>4.0.0</modelVersion>
          
              <groupId>org.example</groupId>
              <artifactId>JsoupTest</artifactId>
              <version>1.0-SNAPSHOT</version>
              <properties>
                  <maven.compiler.target>1.8</maven.compiler.target>
                  <maven.compiler.source>1.8</maven.compiler.source>
              </properties>
              <dependencies>
                  <dependency>
                      <groupId>org.jsoup</groupId>
                      <artifactId>jsoup</artifactId>
                      <version>1.13.1</version>
                  </dependency>
                  <dependency>
                      <groupId>org.projectlombok</groupId>
                      <artifactId>lombok</artifactId>
                      <version>1.18.12</version>
                  </dependency>
                  <dependency>
                      <groupId>com.alibaba</groupId>
                      <artifactId>easyexcel</artifactId>
                      <version>2.2.6</version>
                  </dependency>
              </dependencies>
          </project>
          

          4.2 解析頁(yè)面數(shù)據(jù)

          public class BookInfoUtils {
          
              public static List<BookEntity> getBookInfoList(String url) throws IOException {
                  List<BookEntity>  bookEntities=new ArrayList<>();
                  Document doc = Jsoup.connect(url).get();
                  Elements liDiv = doc.select("#content > div > div.article > ul > li");
                  for (Element li : liDiv) {
                      Elements urls = li.select("a[href]");
                      Elements imgUrl = li.select("a > img");
                      Elements bookName = li.select(" div > h2 > a");
                      Elements starsCount = li.select(" div > p.rating > span.font-small.color-lightgray");
                      Elements author = li.select("div > p.color-gray");
                      Elements description = li.select(" div > p.detail");
          
                      String bookDetailUrl = urls.get(0).attr("href");
                      BookDetailInfo detailInfo = getDetailInfo(bookDetailUrl);
                      BookEntity bookEntity = BookEntity.builder()
                              .detailPageUrl(bookDetailUrl)
                              .bookImgUrl(imgUrl.attr("src"))
                              .bookName(bookName.html())
                              .starsCount(starsCount.html())
                              .author(author.text())
                              .bookDetailInfo(detailInfo)
                              .description(description.html())
                              .build();
          //            System.out.println(bookEntity);
                      bookEntities.add(bookEntity);
                  }
                  return bookEntities;
              }
              /**
               *
               * @param detailUrl
               * @return
               * @throws IOException
               */
              public static BookDetailInfo getDetailInfo(String detailUrl)throws IOException{
          
                  Document doc = Jsoup.connect(detailUrl).get();
                  Elements content = doc.select("body");
          
                  Elements price = content.select("#buyinfo-printed > ul.bs.current-version-list > li:nth-child(2) > div.cell.price-btn-wrapper > div.cell.impression_track_mod_buyinfo > div.cell.price-wrapper > a > span");
                  Elements author = content.select("#info > span:nth-child(1) > a");
                  BookDetailInfo bookDetailInfo = BookDetailInfo.builder()
                          .author(author.html())
                          .authorUrl(author.attr("href"))
                          .price(price.html())
                          .build();
                  return bookDetailInfo;
              }
          }
          

          這里的重點(diǎn)是要獲取網(wǎng)頁(yè)對(duì)應(yīng)元素的選擇器

          例如:獲取 li.select("div > p.color-gray") 中 div > p.color-gray 是怎么知道的。

          使用 chrome 的小伙伴應(yīng)該都猜到了。打開 chrome 瀏覽器 Debug 模式,Ctrl + Shift +C 選擇一個(gè)元素,然后在 html 右鍵選擇 Copy ->Copy selector,這樣就可以獲取當(dāng)前元素的選擇器。如下圖:

          4.3 存儲(chǔ)數(shù)據(jù)到 Excel

          為了數(shù)據(jù)更好查看,我將通過(guò) jsoup 抓取的數(shù)據(jù)存儲(chǔ)的 Excel 文件,這里我使用的 easyexcel 快速生成 Excel 文件。

          Excel 表頭信息

          @Data
          @Builder
          public class ColumnData {
          
              @ExcelProperty("書名稱")
              private String bookName;
          
              @ExcelProperty("評(píng)分")
              private String starsCount;
          
              @ExcelProperty("作者")
              private String author;
          
              @ExcelProperty("封面圖片")
              private String bookImgUrl;
          
              @ExcelProperty("簡(jiǎn)介")
              private String description;
          
              @ExcelProperty("單價(jià)")
              private String price;
          }
          

          生成 Excel 文件

          public class EasyExcelUtils {
          
              public static void simpleWrite(List<BookEntity> bookEntityList) {
                  String fileName = "D:\\devEnv\\JsoupTest\\bookList" + System.currentTimeMillis() + ".xlsx";
                  EasyExcel.write(fileName, ColumnData.class).sheet("書本詳情").doWrite(data(bookEntityList));
                  System.out.println("excel文件生成完畢...");
              }
              private static List<ColumnData> data(List<BookEntity> bookEntityList) {
                  List<ColumnData> list = new ArrayList<>();
                  bookEntityList.forEach(b -> {
                      ColumnData data = ColumnData.builder()
                              .bookName(b.getBookName())
                              .starsCount(b.getStarsCount())
                              .author(b.getBookDetailInfo().getAuthor())
                              .bookImgUrl(b.getBookImgUrl())
                              .description(b.getDescription())
                              .price(b.getBookDetailInfo().getPrice())
                              .build();
                      list.add(data);
                  });
                  return list;
              }
          }
          

          4.4 最終展示效果

          最終的效果如下圖:

          以上就是從想法到實(shí)踐,我們就在實(shí)戰(zhàn)中使用了 jsoup 的基本操作。

          完整代碼地址:https://github.com/hellowHuaairen/JsoupTest

          五、最后

          Java HTML Parser 庫(kù):jsoup,把它當(dāng)成簡(jiǎn)單的爬蟲用起來(lái)還是很方便的吧?

          為什么會(huì)講爬蟲?大數(shù)據(jù),人工智能時(shí)代玩的就是數(shù)據(jù),數(shù)據(jù)很重要。作為懂點(diǎn)技術(shù)的我們,也需要掌握一種獲取網(wǎng)絡(luò)數(shù)據(jù)的技能。當(dāng)然也有一些工具 Fiddler、webscraper 等也可以抓取你想要的數(shù)據(jù)。

          教程至此,你應(yīng)該也能對(duì) jsoup 有一些感覺(jué)了吧。編程是不是也特別有意思呢?參考我上面的實(shí)戰(zhàn)案例,有好多網(wǎng)站可以實(shí)踐一下啦~歡迎在評(píng)論區(qū)曬你的實(shí)戰(zhàn)。

          容簡(jiǎn)介

          《Java Web開發(fā)實(shí)戰(zhàn)1200例》包括第一卷、第二卷共計(jì)1200個(gè)例子,每卷各計(jì)600個(gè)例子。

          本書以開發(fā)人員在項(xiàng)目開發(fā)中經(jīng)常遇到的問(wèn)題和必須掌握的技術(shù)為中心,介紹了應(yīng)用Java Web進(jìn)行程序開發(fā)的各個(gè)方面的知識(shí)和技巧,主要包括Java Web編程基礎(chǔ)、文件操作管理、圖形圖像與多謀體技術(shù)、窗體應(yīng)用技術(shù)、JSP操作Word與Excel等。全書分6篇23章,共計(jì)600個(gè)實(shí)例和600個(gè)經(jīng)驗(yàn)技巧。每個(gè)實(shí)例都是經(jīng)過(guò)精心篩選的,具有很強(qiáng)的實(shí)用性,其中一些實(shí)例是開發(fā)人員難于尋覓的解決方案。

          本書適合Java Web的初學(xué)者,如高校學(xué)生、求職人員作為練習(xí)、速查、學(xué)習(xí)使用,也適合Java Web程序員參考、查閱。

          支持書簽?zāi)夸洠奖悴殚?/p>

          第一卷:

          基礎(chǔ)篇

          1. 開發(fā)環(huán)境搭建
          2. Java語(yǔ)言基礎(chǔ)
          3. HTML/CSS技術(shù)
          4. JSP基礎(chǔ)與內(nèi)置對(duì)象
          5. JavaBean技術(shù)
          6. Servlet技術(shù)
          7. 過(guò)濾器與監(jiān)聽器技術(shù)
          8. JSTL標(biāo)簽庫(kù)
          9. JavaScript技術(shù)
          10. Ajax技術(shù)

          文件管理編

          1. 文件基本操作及文件上傳下載
          2. 文件的批量管理

          圖像與多媒體篇

          1. 圖像生成
          2. 圖像操作
          3. 多媒體應(yīng)用

          窗體應(yīng)用篇

          1. 窗口的應(yīng)用
          2. 導(dǎo)航條的應(yīng)用
          3. 表單的應(yīng)用
          4. 表格的操作

          操作Word、Excel、報(bào)表打印篇

          1. jsp操作word
          2. jsp操作excel
          3. 報(bào)表與打印

          綜合應(yīng)用篇

          1. 綜合應(yīng)用

          第二卷:

          流行組件應(yīng)用篇

          ...

          Java Web數(shù)據(jù)庫(kù)應(yīng)用篇

          ...

          圖表分析篇

          ...

          Ajax框架應(yīng)用篇

          ...

          流行框架篇

          ...

          網(wǎng)站安全與架構(gòu)模式篇

          ...

          綜合應(yīng)用篇

          ...

          點(diǎn)贊+轉(zhuǎn)發(fā)+評(píng)論,關(guān)注后私信回復(fù)關(guān)鍵詞:實(shí)戰(zhàn),即可獲取鏈接!

          領(lǐng)取PDF的小伙伴別忘記在評(píng)論區(qū)回應(yīng)下,感謝大家支持!

          前言】

          你是否也曾羨慕過(guò)有些 phython 大神有著如下的神操作:

          他們就輕輕的執(zhí)行一串代碼,就能循環(huán)的抓取很多自己想要的數(shù)據(jù)。

          其實(shí)不用太羨慕他們,因?yàn)椴还?phython 能實(shí)現(xiàn),我們用 Java 同樣也能夠輕松實(shí)現(xiàn)。

          閑話不多說(shuō),下面我們直接開始實(shí)戰(zhàn):

          【1】創(chuàng)建項(xiàng)目

          (1.1)我們用 IDEA(Eclipse同理) 創(chuàng)建一個(gè)全新的maven工程,我這里取名工程名 zyqok,各位隨意。

          (1.2)在 pom.xml 里面加上 <dependencies>

          (1.3)創(chuàng)建 Test 類,好了工程就已經(jīng)搭好了。

          【2】Httpclient 實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求

          (2.1)什么是 httpclient ?

          Httpclient 是 Apache 的一個(gè)子項(xiàng)目,它是一個(gè)為 Java 可以實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求的客戶端工具包。

          簡(jiǎn)單的說(shuō),他是一個(gè) Jar 包,有了他,我們通過(guò) Java 程序就可以實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求。

          (2.2) 復(fù)制下面的 httpclient 依賴,加入到 pom.xml 文件中。

          <!-- httpclient 核心包 -->
          <dependency>
              <groupId>org.apache.httpcomponents</groupId>
              <artifactId>httpclient</artifactId>
              <version>4.5.2</version>
          </dependency>

          (2.3)創(chuàng)建一個(gè) HttpTool 的類,這個(gè)類我們專門用來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)請(qǐng)求相關(guān)方法。

          (2.4) 為了避免其他網(wǎng)站侵權(quán)問(wèn)題,下面以我個(gè)人網(wǎng)站一個(gè)頁(yè)面為例(http://www.zyqok.cn/material/index),我們來(lái)抓取這個(gè)頁(yè)面上的所有圖片。

          (2.5) 可以看得出,這是一個(gè) get 請(qǐng)求,并且返回的是一個(gè) Html 頁(yè)面。所以我們?cè)?HttpTool 類中加入一個(gè)如下方法體:

            /**
             * 實(shí)現(xiàn)Get請(qǐng)求
             * @param url 請(qǐng)求地址
             * @return 頁(yè)面內(nèi)容
             */
            public static String doGet(String url) {
              
              return null;
            }

          (2.6)復(fù)制代碼,添加 get 實(shí)現(xiàn)方法:

              // 構(gòu)建get請(qǐng)求
              HttpGet get = new HttpGet(url);
              // 創(chuàng)建客戶端
              CloseableHttpClient client = HttpClients.createDefault();
              try {
                // 客戶端執(zhí)行請(qǐng)求,獲取響應(yīng)
                HttpResponse response = client.execute(get);
                // 獲取響應(yīng)的頁(yè)面內(nèi)容
                InputStream in = response.getEntity().getContent();
                StringBuilder sb = new StringBuilder();
                byte[]b = new byte[102400];
                int length;
                while ((length = in.read(b)) != -1) {
                  sb.append(new String(b, 0, length, "utf-8"));
                }
                // 返回頁(yè)面內(nèi)容
                return sb.toString();
              } catch (Exception e) {
                e.printStackTrace();
                return null;
              }

          (2.7)OK,網(wǎng)絡(luò)請(qǐng)求相關(guān)實(shí)現(xiàn)類我們已經(jīng)寫好了,我們接下來(lái)測(cè)試下,我們?cè)?Test 類的 main 方法里加入如下代碼:

              String html = HttpTool.doGet("http://www.zyqok.cn/material/index");
              System.out.println(html);

          (2.8)執(zhí)行程序,查看結(jié)果。可以看到我們確實(shí)已經(jīng)通過(guò)請(qǐng)求,獲取到網(wǎng)頁(yè)的返回內(nèi)容了。

          【3】Jsoup 解析網(wǎng)頁(yè)

          在整個(gè)【2】的實(shí)現(xiàn)過(guò)程中,我們已經(jīng)拿到網(wǎng)頁(yè)返回的數(shù)據(jù),但我們要的是整個(gè)網(wǎng)頁(yè)中的圖片,并不是這種雜亂無(wú)章的網(wǎng)頁(yè)頁(yè)面數(shù)據(jù),那么我們?cè)撛趺崔k呢?簡(jiǎn)單,接下來(lái)我們需要用到另外一種技術(shù)了 ---- Jsoup。

          (3.1)什么是 Jsoup 技術(shù)?

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

          下面再用我個(gè)人語(yǔ)言簡(jiǎn)單的總結(jié)下:Jsoup 技術(shù)就是用來(lái)處理各種 html 頁(yè)面 和 xml 數(shù)據(jù)。我們這里可以通過(guò) Jsoup 來(lái)處理【2】中返回的 html 頁(yè)面。

          (3.2)加入 Jsoup 依賴

          我們?cè)?pom.xml 加入如下依賴:

          <!-- Jsoup 核心包 -->
          <dependency>
          	<groupId>org.jsoup</groupId>
          	<artifactId>jsoup</artifactId>
          	<version>1.11.3</version>
          </dependency>

          (3.3)當(dāng)然,使用 Jsoup 之前,我們需要對(duì)響應(yīng)的 HTML 頁(yè)面進(jìn)行分析,分析主要作用是:如何定位篩選出我們需要的數(shù)據(jù)?

          我們把【2】中獲取到的頁(yè)面響應(yīng)拷貝到 txt 文本中,然后可以發(fā)現(xiàn):每個(gè)圖片它都包含在一個(gè) div 中,且該div 有一個(gè)名為 material-div 的 class。

          (3.4)按照上面分析:首先我們要獲取到包含圖片的所有 div,于是我們修改main方法中代碼為如下:

              String html = HttpTool.doGet("http://www.zyqok.cn/material/index");
              // 將 html 頁(yè)面解析為 Document 對(duì)象
              Document doc = Jsoup.parse(html);
              // 獲取所有包含 class = material-div 的 div 元素
              Elements elements = doc.select("div.material-div");
              for(Element div: elements){
                  System.out.println(div.toString());
              }

          注意:doc.select() 括號(hào)中的參數(shù)為過(guò)濾條件,基本等同于 Jquery 的過(guò)濾條件,所以會(huì)Jquery的同學(xué),如何篩選條件基本就得心應(yīng)手的,當(dāng)然不會(huì)寫篩選條件的也不要怕,這里有一份 Jsoup 使用指南,閣下不妨收下(傳送門:Jsoup 官方使用指南)。

          (3.5)我們執(zhí)行代碼,將輸出結(jié)果繼續(xù)拷貝到文本中。

          可以看到,本次確實(shí)只有圖片相關(guān)的div元素了,但這并不是我們想要的最終結(jié)果,我們最終的結(jié)果是獲取到所有圖片。

          所以我們還需要繼續(xù)分析:如何獲取所有圖片的鏈接和名字。

          (3.6)由于每個(gè)圖片所在的div元素結(jié)構(gòu)都一樣,所以我們可以取隨機(jī)取一個(gè)div元素進(jìn)行分析,于是我們可以取第一個(gè)div來(lái)進(jìn)行分析,結(jié)構(gòu)如下:

          <div align="center" style="padding: 10px;" class="material-div"> 
              <div style="width: 80px; height: 80px; margin-bottom: 3px; display: flex; align-items: center; justify-content: center"> 
                  <img class="fangda image" src="https://zyqok.oss-cn-chengdu.aliyuncs.com/20200414220946131_大樹夕陽(yáng).jpg"> 
                  <input type="hidden" class="materialId" value="121"> 
              </div> 
              <font style="font-size: 5px">大樹夕陽(yáng).jpg</font><br> 
              <font style="font-size: 5px">2020-04-14 22:09:46</font> 
          </div>

          3.7)我們可以看到,整個(gè)結(jié)構(gòu)內(nèi),就一個(gè) img 元素標(biāo)簽,于是我們可以取第1個(gè)img標(biāo)簽的 src 屬性為圖片鏈接;同理,我們?nèi)〉?個(gè) font 元素的文本內(nèi)容為圖片名稱。

          (3.8)于是我們可以修改循環(huán)中的代碼內(nèi)容如下:

          // 獲取第1個(gè) img 元素Element img = div.selectFirst("img");// 獲取第1個(gè) font 元素Element font = div.selectFirst("font");// 獲取img元素src屬性,即為圖片鏈接String url = img.attr("src");// 獲取name元素文本,即為圖片名稱String name = font.text();System.out.println(name + ": " + url);

          (3.9)我們執(zhí)行上面代碼,可以得出如下結(jié)果。

          可以看到,這個(gè)頁(yè)面上的所有圖片地址和名稱已經(jīng)被我們成功抓下來(lái)了。

          【4】獲取圖片到本地

          在第【3】步中,我們獲取到的只是所有圖片的鏈接,并沒(méi)有將所有圖片下載到我們本地,那么接下來(lái),我們要將這個(gè)圖片下載到我們本地才算完成。

          (4.1)既然要下載到本地,我們首先在本地找個(gè)地方,用于存放這些圖片。

          比如:我將這圖片全部下載到 D:\imgs(D 盤的 imgs 文件夾)中。

          (4.2)我們?cè)?HttpTool 類中增加保存圖片到本地的方法,代碼如下:

            /**
             * 保存圖片到本地
             * @param src 圖片地址
             * @param name 圖片名稱
             */
            public static void saveImg(String src, String name) {
              // 構(gòu)建get請(qǐng)求
              HttpGet get = new HttpGet(src);
              // 創(chuàng)建客戶端
              CloseableHttpClient client = HttpClients.createDefault();
              try {
                // 客戶端執(zhí)行請(qǐng)求,獲取響應(yīng)
                HttpResponse response = client.execute(get);
                // 獲取響應(yīng)的頁(yè)面內(nèi)容
                InputStream in = response.getEntity().getContent();
                int length;
                byte[] bytes = new byte[1024];
                FileOutputStream fos = new FileOutputStream("D:\\imgs\\" + name);
                while ((length = in.read(bytes)) != -1) {
                  fos.write(bytes, 0, length);
                  fos.flush();
                }
                in.close();
                fos.close();
              } catch (Exception e) {
                e.printStackTrace();
              }
            }

          (4.3)修改 Test 類 main 方法最終代碼如下:


            public static void main(String args[]) throws Exception {
              String html = HttpTool.doGet("http://www.zyqok.cn/material/index");
              // 將 html 頁(yè)面解析為 Document 對(duì)象
              Document doc = Jsoup.parse(html);
              // 獲取所有包含 class = material-div 的 div 元素
              Elements elements = doc.select("div.material-div");
              for (int i = 0; i<elements.size(); i++) {
                Element div = elements.get(i);
                // 獲取第1個(gè) img 元素
                Element img = div.selectFirst("img");
                // 獲取第1個(gè) font 元素
                Element font = div.selectFirst("font");
                // 獲取img元素src屬性,即為圖片鏈接
                String src = img.attr("src");
                // 獲取name元素文本,即為圖片名稱
                String name = font.text();
                if (!name.contains(".")) {
                  name += ".jpg";
                }
                HttpTool.saveImg(src, i + name);
                System.out.println("抓取第 " + i + " 張圖片成功! 圖片名稱 : " + name);
              }
              System.out.println("所有圖片抓取完成 !!");
            }

          (4.4)執(zhí)行代碼,打印如下圖,看到這個(gè)結(jié)果,是不是感覺(jué)有點(diǎn)文章開頭的展示味道了。

          最后,我們只需要去本地文件夾下看看,所有圖片是否成功保存到了本地?如果有圖片,則我們就成功了。

          (4.5)我們打開D盤imgs文件夾,可以看到網(wǎng)站上的圖片確實(shí)已經(jīng)全部保存到本地了。

          【5】結(jié)尾語(yǔ)

          通過(guò)我們 [批量抓取網(wǎng)絡(luò)圖片] 這一實(shí)戰(zhàn)案例,我們可以感受到:通過(guò) Httopclient 和 Jsoup 這兩種技術(shù),不僅僅可以批量抓取數(shù)據(jù),其實(shí)還可以實(shí)現(xiàn)很多功能。

          比如:網(wǎng)站登錄,分布式服務(wù)器之間的數(shù)據(jù)傳遞,三方平臺(tái)的API對(duì)接,有效數(shù)據(jù)的篩選和保存,數(shù)據(jù)的二次加工等等。


          主站蜘蛛池模板: 国精产品一区一区三区有限在线| 国产精品熟女一区二区| 怡红院一区二区三区| 精品在线视频一区| 秋霞无码一区二区| 青娱乐国产官网极品一区| 国产精品揄拍一区二区久久| 中文字幕在线观看一区二区 | 玩弄放荡人妻一区二区三区| 国产免费一区二区三区不卡| 婷婷国产成人精品一区二| 国产精品亚洲专一区二区三区| 精品无码一区在线观看| 亚洲一区AV无码少妇电影☆| 久夜色精品国产一区二区三区| 国产在线观看一区二区三区| 在线电影一区二区| 在线观看精品一区| 日韩一区二区在线免费观看| 亚洲国产精品一区二区第四页| 久久国产一区二区| 91精品一区国产高清在线| 一区二区3区免费视频| 美女视频一区二区| 一区视频在线播放| 久久精品综合一区二区三区| 亚洲一区精品伊人久久伊人| 亚洲成人一区二区| 欧洲精品无码一区二区三区在线播放| av无码一区二区三区| 精品国产一区二区三区久久蜜臀| 亚洲片一区二区三区| 熟女少妇丰满一区二区| 好爽毛片一区二区三区四无码三飞| 欧美一区内射最近更新| 国产中文字幕一区| 国产高清一区二区三区四区| 国产亚洲无线码一区二区| 亚洲欧洲一区二区| 精品久久久中文字幕一区| 日本精品一区二区久久久|