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

Java 網(wǎng)絡(luò)爬蟲(chóng)新手入門(mén)詳解

 更新時(shí)間:2019年10月10日 09:42:18   作者:平頭哥的技術(shù)博文  
這篇文章主要介紹了Java 網(wǎng)絡(luò)爬蟲(chóng)新手入門(mén)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

這是 Java 網(wǎng)絡(luò)爬蟲(chóng)系列文章的第一篇,如果你還不知道 Java 網(wǎng)絡(luò)爬蟲(chóng)系列文章,請(qǐng)參看Java 網(wǎng)絡(luò)爬蟲(chóng)基礎(chǔ)知識(shí)入門(mén)解析。第一篇是關(guān)于 Java 網(wǎng)絡(luò)爬蟲(chóng)入門(mén)內(nèi)容,在該篇中我們以采集虎撲列表新聞的新聞標(biāo)題和詳情頁(yè)為例,需要提取的內(nèi)容如下圖所示:

我們需要提取圖中圈出來(lái)的文字及其對(duì)應(yīng)的鏈接,在提取的過(guò)程中,我們會(huì)使用兩種方式來(lái)提取,一種是 Jsoup 的方式,另一種是 httpclient + 正則表達(dá)式的方式,這也是 Java 網(wǎng)絡(luò)爬蟲(chóng)常用的兩種方式,你不了解這兩種方式?jīng)]關(guān)系,后面會(huì)有相應(yīng)的使用手冊(cè)。在正式編寫(xiě)提取程序之前,我先交代一下 Java 爬蟲(chóng)系列博文的環(huán)境,該系列博文所有的 demo 都是使用 SpringBoot 搭建的,不管你使用哪種環(huán)境,只需要正確的導(dǎo)入相應(yīng)的包即可。

Jsoup 方式提取信息

我們先來(lái)使用 Jsoup 的方式提取新聞信息,如果你還不知道 Jsoup ,請(qǐng)參考 https://jsoup.org/

先建立一個(gè) Springboot 項(xiàng)目,名字就隨意啦,在 pom.xml 中引入 Jsoup 的依賴

<dependency>
 <groupId>org.jsoup</groupId>
 <artifactId>jsoup</artifactId>
 <version>1.12.1</version>
</dependency>

好了,接下來(lái)我們一起分析頁(yè)面吧,想必你還沒(méi)瀏覽過(guò)吧,點(diǎn)擊這里瀏覽虎撲新聞。在列表頁(yè)中,我們利用 F12 審查元素查看頁(yè)面結(jié)構(gòu),經(jīng)過(guò)我們分析發(fā)現(xiàn)列表新聞在 <div class="news-list">標(biāo)簽下,每一條新聞都是一個(gè)li標(biāo)簽,分析結(jié)果如下圖所示:

由于我們前面已經(jīng)知道了 css 選擇器,我們結(jié)合瀏覽器的 Copy 功能,編寫(xiě)出我們 a標(biāo)簽的 css 選擇器代碼:div.news-list > ul > li > div.list-hd > h4 > a ,一切都準(zhǔn)備好了,我們一起來(lái)編寫(xiě) Jsoup 方式提取信息的代碼:

/**
 * jsoup方式 獲取虎撲新聞列表頁(yè)
 * @param url 虎撲新聞列表頁(yè)url
 */
public void jsoupList(String url){
 try {
  Document document = Jsoup.connect(url).get();
  // 使用 css選擇器 提取列表新聞 a 標(biāo)簽
  // <a  rel="external nofollow" target="_blank">霍華德:夏休期內(nèi)曾節(jié)食30天,這考驗(yàn)了我的身心</a>
  Elements elements = document.select("div.news-list > ul > li > div.list-hd > h4 > a");
  for (Element element:elements){
//    System.out.println(element);
   // 獲取詳情頁(yè)鏈接
   String d_url = element.attr("href");
   // 獲取標(biāo)題
   String title = element.ownText();

   System.out.println("詳情頁(yè)鏈接:"+d_url+" ,詳情頁(yè)標(biāo)題:"+title);

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

使用 Jsoup 方式提取還是非常簡(jiǎn)單的,就5、6行代碼就完成了,關(guān)于更多 Jsoup 如何提取節(jié)點(diǎn)信息的方法可以參考 jsoup 的官網(wǎng)教程。我們編寫(xiě) main 方法,來(lái)執(zhí)行 jsoupList 方法,看看 jsoupList 方法是否正確。

public static void main(String[] args) {
 String url = "https://voice.hupu.com/nba";
 CrawlerBase crawlerBase = new CrawlerBase();
 crawlerBase.jsoupList(url);
}

執(zhí)行 main 方法,得到如下結(jié)果:

從結(jié)果中可以看出,我們已經(jīng)正確的提取到了我們想要的信息,如果你想采集詳情頁(yè)的信息,只需要編寫(xiě)一個(gè)采集詳情頁(yè)的方法,在方法中提取詳情頁(yè)相應(yīng)的節(jié)點(diǎn)信息,然后將列表頁(yè)提取的鏈接傳入提取詳情頁(yè)方法即可。

httpclient + 正則表達(dá)式

上面我們使用了 Jsoup 方式正確提取了虎撲列表新聞,接下來(lái)我們使用 httpclient + 正則表達(dá)式的方式來(lái)提取,看看使用這種方式又會(huì)涉及到哪些問(wèn)題?httpclient + 正則表達(dá)式的方式涉及的知識(shí)點(diǎn)還是蠻多的,它涉及到了正則表達(dá)式、Java 正則表達(dá)式、httpclient。如果你還不知道這些知識(shí),可以點(diǎn)擊下方鏈接簡(jiǎn)單了解一下:

正則表達(dá)式:正則表達(dá)式

Java 正則表達(dá)式:Java 正則表達(dá)式

httpclient:httpclient

我們?cè)?pom.xml 文件中,引入 httpclient 相關(guān) Jar 包

<dependency>
 <groupId>org.apache.httpcomponents</groupId>
 <artifactId>httpclient</artifactId>
 <version>4.5.10</version>
</dependency>
<dependency>
 <groupId>org.apache.httpcomponents</groupId>
 <artifactId>httpcore</artifactId>
 <version>4.4.10</version>
</dependency>
<dependency>
 <groupId>org.apache.httpcomponents</groupId>
 <artifactId>httpmime</artifactId>
 <version>4.5.10</version>
</dependency>

關(guān)于虎撲列表新聞頁(yè)面,我們?cè)谑褂?Jsoup 方式的時(shí)候進(jìn)行了簡(jiǎn)單的分析,這里我們就不在重復(fù)分析了。對(duì)于使用正則表達(dá)式方式提取,我們需要找到能夠代表列表新聞的結(jié)構(gòu)體,比如: <div class="list-hd"> <h4> <a rel="external nofollow" target="_blank">直上云霄!魔術(shù)官方社媒曬富爾茨扣籃炫酷特效圖</a></h4></div>

這段結(jié)構(gòu)體,每個(gè)列表新聞只有鏈接和標(biāo)題不一樣,其他的都一樣,而且 <div class="list-hd">是列表新聞特有的。最好不要直接正則匹配 a標(biāo)簽,因?yàn)?a標(biāo)簽在其他地方也有,這樣我們就還需要做其他的處理,增加我們的難度。現(xiàn)在我們了解了正則結(jié)構(gòu)體的選擇,我們一起來(lái)看看 httpclient + 正則表達(dá)式方式提取的代碼:

/**
 * httpclient + 正則表達(dá)式 獲取虎撲新聞列表頁(yè)
 * @param url 虎撲新聞列表頁(yè)url
 */
public void httpClientList(String url){
 try {
  CloseableHttpClient httpclient = HttpClients.createDefault();
  HttpGet httpGet = new HttpGet(url);
  CloseableHttpResponse response = httpclient.execute(httpGet);
  if (response.getStatusLine().getStatusCode() == 200) {
   HttpEntity entity = response.getEntity();
   String body = EntityUtils.toString(entity,"utf-8");
 
   if (body!=null) {
     /*
     * 替換掉換行符、制表符、回車(chē)符,去掉這些符號(hào),正則表示寫(xiě)起來(lái)更簡(jiǎn)單一些
     * 只有空格符號(hào)和其他正常字體
     */
    Pattern p = Pattern.compile("\t|\r|\n");
    Matcher m = p.matcher(body);
    body = m.replaceAll("");
    /*
     * 提取列表頁(yè)的正則表達(dá)式
     * 去除換行符之后的 li
     * <div class="list-hd">         <h4>          <a  rel="external nofollow" target="_blank">與球迷親切互動(dòng)!凱爾特人官方曬球隊(duì)開(kāi)放訓(xùn)練日照片</a>         </h4>        </div>
     */
    Pattern pattern = Pattern
      .compile("<div class=\"list-hd\">\\s* <h4>\\s* <a href=\"(.*?)\"\\s* target=\"_blank\">(.*?)</a>\\s* </h4>\\s* </div>" );

    Matcher matcher = pattern.matcher(body);
    // 匹配出所有符合正則表達(dá)式的數(shù)據(jù)
    while (matcher.find()){
//      String info = matcher.group(0);
//      System.out.println(info);
     // 提取出鏈接和標(biāo)題
     System.out.println("詳情頁(yè)鏈接:"+matcher.group(1)+" ,詳情頁(yè)標(biāo)題:"+matcher.group(2));
    }
   }else {
    System.out.println("處理失?。。?!獲取正文內(nèi)容為空");
   }
  } else {
   System.out.println("處理失?。。?!返回狀態(tài)碼:" + response.getStatusLine().getStatusCode());
  }
 }catch (Exception e){
  e.printStackTrace();
 }

}

從代碼的行數(shù)可以看出,比 Jsoup 方式要多不少,代碼雖然多,但是整體來(lái)說(shuō)比較簡(jiǎn)單,在上面方法中我做了一段特殊處理,我先替換了 httpclient 獲取的字符串 body 中的換行符、制表符、回車(chē)符,因?yàn)檫@樣處理,在編寫(xiě)正則表達(dá)式的時(shí)候能夠減少一些額外的干擾。接下來(lái)我們修改 main 方法,運(yùn)行 httpClientList 方法。

public static void main(String[] args) {
 String url = "https://voice.hupu.com/nba";
 CrawlerBase crawlerBase = new CrawlerBase();
//  crawlerBase.jsoupList(url);
 crawlerBase.httpClientList(url);
}

運(yùn)行結(jié)果如下圖所示:

使用 httpclient + 正則表達(dá)式的方式同樣正確的獲取到了列表新聞的標(biāo)題和詳情頁(yè)鏈接。到此 Java 爬蟲(chóng)系列博文第一篇就寫(xiě)完了,這一篇主要是 Java 網(wǎng)絡(luò)爬蟲(chóng)的入門(mén),我們使用了 jsoup 和 httpclient + 正則的方式提取了虎撲列表新聞的新聞標(biāo)題和詳情頁(yè)鏈接。當(dāng)然這里還有很多沒(méi)有完成,比如采集詳情頁(yè)信息存入數(shù)據(jù)庫(kù)等。

源代碼:點(diǎn)擊這里

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

相關(guān)文章

  • java8 Math新增方法介紹

    java8 Math新增方法介紹

    這篇文章主要介紹了java8 Math新增方法介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • Java模擬QQ桌面截圖功能實(shí)現(xiàn)方法

    Java模擬QQ桌面截圖功能實(shí)現(xiàn)方法

    這篇文章主要介紹了Java模擬QQ桌面截圖功能實(shí)現(xiàn)方法,涉及java針對(duì)鼠標(biāo)事件及圖片操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • 配置Spring4.0注解Cache+Redis緩存的用法

    配置Spring4.0注解Cache+Redis緩存的用法

    本篇文章主要介紹了詳解配置Spring4.0注解Cache+Redis緩存的用法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Spring自動(dòng)裝配與掃描注解代碼詳解

    Spring自動(dòng)裝配與掃描注解代碼詳解

    這篇文章主要介紹了Spring自動(dòng)裝配與掃描注解代碼詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下。
    2017-12-12
  • Java SpringMVC異常處理機(jī)制詳解

    Java SpringMVC異常處理機(jī)制詳解

    這篇文章主要介紹了springmvc如何進(jìn)行異常處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-09-09
  • Maven打包跳過(guò)測(cè)試的實(shí)現(xiàn)方法

    Maven打包跳過(guò)測(cè)試的實(shí)現(xiàn)方法

    使用Maven打包的時(shí)候,可能會(huì)因?yàn)閱卧獪y(cè)試打包失敗,這時(shí)候就需要跳過(guò)單元測(cè)試。本文就介紹了Maven打包跳過(guò)測(cè)試的實(shí)現(xiàn)方法,感興趣的可以了解一下
    2021-06-06
  • Spring中的@ComponentScan注解詳解

    Spring中的@ComponentScan注解詳解

    這篇文章主要介紹了Spring中的@ComponentScan注解詳解,ComponentScan做的事情就是告訴Spring從哪里找到bean,由你來(lái)定義哪些包需要被掃描,一旦你指定了,Spring將會(huì)在被指定的包及其下級(jí)包中尋找bean,需要的朋友可以參考下
    2024-01-01
  • 淺談Java當(dāng)作數(shù)組的幾個(gè)應(yīng)用場(chǎng)景

    淺談Java當(dāng)作數(shù)組的幾個(gè)應(yīng)用場(chǎng)景

    數(shù)組可以存放多個(gè)同一類(lèi)型的數(shù)據(jù),可以存儲(chǔ)基本數(shù)據(jù)類(lèi)型,引用數(shù)據(jù)類(lèi)型(對(duì)象),下面這篇文章主要給大家介紹了關(guān)于Java當(dāng)作數(shù)組的幾個(gè)應(yīng)用場(chǎng)景,需要的朋友可以參考下
    2022-11-11
  • 淺談Java隨機(jī)數(shù)的原理、偽隨機(jī)和優(yōu)化

    淺談Java隨機(jī)數(shù)的原理、偽隨機(jī)和優(yōu)化

    這篇文章主要介紹了淺談Java隨機(jī)數(shù)的原理、偽隨機(jī)和優(yōu)化,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • MyBatis實(shí)現(xiàn)配置加載的步驟

    MyBatis實(shí)現(xiàn)配置加載的步驟

    本文主要介紹了MyBatis實(shí)現(xiàn)配置加載的步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05

最新評(píng)論