1. 程式人生 > >Java 網路爬蟲,就是這麼的簡單

Java 網路爬蟲,就是這麼的簡單

這是 Java 網路爬蟲系列文章的第一篇,如果你還不知道 Java 網路爬蟲系列文章,請參看 學 Java 網路爬蟲,需要哪些基礎知識。第一篇是關於 Java 網路爬蟲入門內容,在該篇中我們以採集虎撲列表新聞的新聞標題和詳情頁為例,需要提取的內容如下圖所示:

我們需要提取圖中圈出來的文字及其對應的連結,在提取的過程中,我們會使用兩種方式來提取,一種是 Jsoup 的方式,另一種是 httpclient + 正則表示式的方式,這也是 Java 網路爬蟲常用的兩種方式,你不瞭解這兩種方式沒關係,後面會有相應的使用手冊。在正式編寫提取程式之前,我先交代一下 Java 爬蟲系列博文的環境,該系列博文所有的 demo 都是使用 SpringBoot 搭建的,不管你使用哪種環境,只需要正確的匯入相應的包即可。

Jsoup 方式提取資訊

我們先來使用 Jsoup 的方式提取新聞資訊,如果你還不知道 Jsoup ,請參考 https://jsoup.org/

先建立一個 Springboot 專案,名字就隨意啦,在 pom.xml 中引入 Jsoup 的依賴

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

好了,接下來我們一起分析頁面吧,想必你還沒瀏覽過吧,點選這裡瀏覽虎撲新聞。在列表頁中,我們利用 F12 審查元素檢視頁面結構,經過我們分析發現列表新聞在 <div class="news-list">

標籤下,每一條新聞都是一個li標籤,分析結果如下圖所示:

由於我們前面已經知道了 css 選擇器,我們結合瀏覽器的 Copy 功能,編寫出我們 a標籤的 css 選擇器程式碼:div.news-list > ul > li > div.list-hd > h4 > a ,一切都準備好了,我們一起來編寫 Jsoup 方式提取資訊的程式碼:

/**
 * jsoup方式 獲取虎撲新聞列表頁
 * @param url 虎撲新聞列表頁url
 */
public void jsoupList(String url){
    try {
        Document document = Jsoup.connect(url).get();
        // 使用 css選擇器 提取列表新聞 a 標籤
        // <a href="https://voice.hupu.com/nba/2484553.html" target="_blank">霍華德:夏休期內曾節食30天,這考驗了我的身心</a>
        Elements elements = document.select("div.news-list > ul > li > div.list-hd > h4 > a");
        for (Element element:elements){
//                System.out.println(element);
            // 獲取詳情頁連結
            String d_url = element.attr("href");
            // 獲取標題
            String title = element.ownText();

            System.out.println("詳情頁連結:"+d_url+" ,詳情頁標題:"+title);

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

使用 Jsoup 方式提取還是非常簡單的,就5、6行程式碼就完成了,關於更多 Jsoup 如何提取節點資訊的方法可以參考 jsoup 的官網教程。我們編寫 main 方法,來執行 jsoupList 方法,看看 jsoupList 方法是否正確。

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

執行 main 方法,得到如下結果:


從結果中可以看出,我們已經正確的提取到了我們想要的資訊,如果你想採集詳情頁的資訊,只需要編寫一個採集詳情頁的方法,在方法中提取詳情頁相應的節點資訊,然後將列表頁提取的連結傳入提取詳情頁方法即可。

httpclient + 正則表示式

上面我們使用了 Jsoup 方式正確提取了虎撲列表新聞,接下來我們使用 httpclient + 正則表示式的方式來提取,看看使用這種方式又會涉及到哪些問題?httpclient + 正則表示式的方式涉及的知識點還是蠻多的,它涉及到了正則表示式、Java 正則表示式、httpclient。如果你還不知道這些知識,可以點選下方連結簡單瞭解一下:

正則表示式:正則表示式

Java 正則表示式:Java 正則表示式

httpclient:httpclient

我們在 pom.xml 檔案中,引入 httpclient 相關 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>

關於虎撲列表新聞頁面,我們在使用 Jsoup 方式的時候進行了簡單的分析,這裡我們就不在重複分析了。對於使用正則表示式方式提取,我們需要找到能夠代表列表新聞的結構體,比如:<div class="list-hd"> <h4> <a href="https://voice.hupu.com/nba/2485508.html" target="_blank">直上雲霄!魔術官方社媒晒富爾茨扣籃炫酷特效圖</a></h4></div>這段結構體,每個列表新聞只有連結和標題不一樣,其他的都一樣,而且 <div class="list-hd">是列表新聞特有的。最好不要直接正則匹配 a標籤,因為 a標籤在其他地方也有,這樣我們就還需要做其他的處理,增加我們的難度。現在我們瞭解了正則結構體的選擇,我們一起來看看 httpclient + 正則表示式方式提取的程式碼:

/**
 * httpclient + 正則表示式 獲取虎撲新聞列表頁
 * @param url 虎撲新聞列表頁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) {
                 /*
                 * 替換掉換行符、製表符、回車符,去掉這些符號,正則表示寫起來更簡單一些
                 * 只有空格符號和其他正常字型
                 */
                Pattern p = Pattern.compile("\t|\r|\n");
                Matcher m = p.matcher(body);
                body = m.replaceAll("");
                /*
                 * 提取列表頁的正則表示式
                 * 去除換行符之後的 li
                 * <div class="list-hd">                                    <h4>                                        <a href="https://voice.hupu.com/nba/2485167.html"  target="_blank">與球迷親切互動!凱爾特人官方晒球隊開放訓練日照片</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);
                // 匹配出所有符合正則表示式的資料
                while (matcher.find()){
//                        String info = matcher.group(0);
//                        System.out.println(info);
                    // 提取出連結和標題
                    System.out.println("詳情頁連結:"+matcher.group(1)+" ,詳情頁標題:"+matcher.group(2));
                }
            }else {
                System.out.println("處理失敗!!!獲取正文內容為空");
            }
        } else {
            System.out.println("處理失敗!!!返回狀態碼:" + response.getStatusLine().getStatusCode());
        }
    }catch (Exception e){
        e.printStackTrace();
    }

}

從程式碼的行數可以看出,比 Jsoup 方式要多不少,程式碼雖然多,但是整體來說比較簡單,在上面方法中我做了一段特殊處理,我先替換了 httpclient 獲取的字串 body 中的換行符、製表符、回車符,因為這樣處理,在編寫正則表示式的時候能夠減少一些額外的干擾。接下來我們修改 main 方法,執行 httpClientList 方法。

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

執行結果如下圖所示:

使用 httpclient + 正則表示式的方式同樣正確的獲取到了列表新聞的標題和詳情頁連結。到此 Java 爬蟲系列博文第一篇就寫完了,這一篇主要是 Java 網路爬蟲的入門,我們使用了 jsoup 和 httpclient + 正則的方式提取了虎撲列表新聞的新聞標題和詳情頁連結。當然這裡還有很多沒有完成,比如採集詳情頁資訊存入資料庫等。

希望以上內容對你有所幫助,下一篇是模擬登陸相關的,如果你對 Java 網路爬蟲感興趣,不妨關注一波,一起學習,一起進步。

原始碼:點選這裡

文章不足之處,望大家多多指點,共同學習,共同進步

最後

打個小廣告,歡迎掃碼關注微信公眾號:「平頭哥的技術博文」,一起進步吧。

相關推薦

Java 網路爬蟲就是這麼簡單

這是 Java 網路爬蟲系列文章的第一篇,如果你還不知道 Java 網路爬蟲系列文章,請參看 學 Java 網路爬蟲,需要哪些基礎知識。第一篇是關於 Java 網路爬蟲入門內容,在該篇中我們以採集虎撲列表新聞的新聞標題和詳情頁為例,需要提取的內容如下圖所示: 我們需要提取圖中圈出來的文字及其對應的連結,在

Java 網路爬蟲需要哪些基礎知識?

說起網路爬蟲,大家想起的估計都是 Python ,誠然爬蟲已經是 Python 的代名詞之一,相比 Java 來說就要遜色不少。有不少人都不知道 Java 可以做網路爬蟲,其實 Java 也能做網路爬蟲而且還能做的非常好,在開源社群中有不少優秀的 Java 網路爬蟲框架,例如 webmagic 。我的第一份正

SQL入門這麼簡單

   隨著時代的發展,人類活動產生的資訊越來越多,大家常說,現在這個時代是大資料時代。在這樣一個前提下,資料的儲存成為我們必須要認真對待和研究的問題了。SQL(Structured Query Language)結構化查詢語言,是當今三大主流關係型資料庫(MsSQL,MySQL,Oracle)的通用

超實用的Excel自動排序小技巧原來這麼簡單早點知道好了!

日常製作表格中,我們總是要給Excel資料進行排列,這樣更利於我們預覽。大家知道有哪幾種比較實用的排序方法嗎?如果不知道的話,請跟我一起動動手吧! 第一種:最為實用普遍的方法:升序降序排列 步驟:單擊【資料】--【排序和篩選】--選擇【升序】或【降序】就可以進行資料的簡單排序。

三、亞馬遜產品定價其實這麼簡單一個公式解決

目錄 海貓跨境作者:海貓跨境 2016-11-24 16:33:51 如果產品銷量不好,很多賣家首先想到的是圖片、listing是不是做的不夠好,很少賣家會想想是不是自己的定價有問題,定價對銷量的影響也是至關重要的,定價是一門高深的學問,如果產品

剛學了兩天python爬蟲寫了一個分享給大家!爬蟲真的很簡單

經過兩天的摸索,終於寫出了一個小小小爬蟲。這其中的波折是這樣的,聽我娓娓道來。我的電腦是沒有配置python環境的,所以首先要上官網下載python的環境檔案。 當然在學習Python的道路上肯定會困難,沒有好的學習資料,怎麼去學習呢? 學習Python中有不明白推薦加入交流群

聽聽段子吹吹牛皮學C也這麼簡單

今天就跟大家吹吹牛。有人說學C難,我也不知道他們是怎麼學的,學c其實也很簡單,一節課,聽聽故事,吹吹牛皮,學得輕鬆,也學得有趣。有很多人跟我吐槽,怎麼了吹牛皮就學好了呢,老師,C語言從入門到放棄啊。 “多年老司機,邀請你們請上最後一班,末班車”,來上車嘛 我是七月,面熟一下,好久沒分享了,最近事

微信公眾號開發原來這麼簡單?[java框架]

下面都是舊的教程,建議參考上面最新的教程~~ 可能你不知道,有個框架叫wx-tools(小心翼翼地說) Wx-tools是基於微信公眾平臺API的輕量級框架。 基於Wx-tools你可以開速開發一個訂閱號/服務號的web應用後臺。

可提供二次開發介面的車牌識別相機原來這麼簡單

車牌識別系統是計算機視訊影象識別技術在車輛牌照識別中的一種應用。車牌識別技術要求能夠將運動中的汽車牌照從複雜背景中提取並識別出來,通過車牌提取、影象預處理、特徵提取、車牌字元識別等技術,識別車輛牌號、顏色等資訊,目前最新的技術水平為字母和數字的識別率可達到99.7%。 易泊

《Wireshark網路分析的藝術》《Wireshark網路分析這麼簡單》書評

這兩本書是應該算是同一個作者寫的兩個版本吧。兩本書獨立看,都是沒有問題的。書籍內容這兩本書基本就是講述作者如何使用wireshark解決在工作,生活中遇到的網路問題。每一個小節都是一個獨立的網路問題,涉及面非常廣,幾個tcp協議效能調優案例,幾個ssh登陸延遲原因分析,幾個防

Wireshark網路分析這麼簡單 -- 目錄

這不僅僅是一本講解 Wireshark 的書,更重要的,理解:從巨集觀層面看微觀,用工具的手段看協議。 Wireshark 是強大的協議分析工具,有 Window、Mac、Linux 等多種版本,依靠它,可以洞悉各種協議的巨集觀和微觀,可以更快的學習協議。相比較 Char

這個神器火了做個高大上的PPT演示竟然這麼簡單

► 90%的人做的PPT都吸引不到觀眾說到製作PPT演示,大家都會想到PowerPoint,從上

使用ping鑰匙臨時開啟SSH:22埠實現遠端安全SSH登入管理這麼簡單

# 規則1 只接受Data為1078位元組的ping包,並將源IP記錄到自定義名為sshKeyList的列表中 # iptables -A INPUT -p icmp -m icmp --icmp-type 8 -m length --length 1078 -m recent --name sshKey

java 開發用到網路爬蟲抓取汽車之家網站全部資料經歷

經歷了兩個禮拜的折騰,某某知名網站的資料終於到手了。犯罪沒被發現這種心情感覺很爽。 說一下我的犯罪經歷,之前公司總是抓取某某網站資料,可能是被發現了。某某網站改變了策略。通過各種技術終止了我們的行為,導致我們的抓取功能報錯,逐步跟蹤,發現我們之前是在人家的網站,通過Webh

Spring Boot 整合 Swagger生成介面文件這麼簡單

開發十年,就只剩下這套架構體系了! >>>   

在伺服器中安裝jdk1.8版本的安裝原來這麼簡單(詳解)

因為在烏班圖的系統中由於只能註冊普通的使用者,不能註冊root使用者。 所以需要先把jdk-8u11-linux-x64.tar.gz的安裝包拷貝到普通使用者的許可權中去。 我們可以使用WinSCP視覺化工具直接對壓縮包進行拖拽到指定的目錄下,也可以使用Xshell工具使用命令列對檔

H5網頁適配 iPhoneX就是這麼簡單(轉)

iPhoneX 取消了物理按鍵,改成底部小黑條,這一改動導致網頁出現了比較尷尬的螢幕適配問題。對於網頁而言,頂部(劉海部位)的適配問題瀏覽器已經做了處理,所以我們只需要關注底部與小黑條的適配問題即可(即常見的吸底導航、返回頂部等各種相對底部 fixed 定位的元素)。筆者通過查閱了一些官方文件,以及結合實際專

Java網路爬蟲初體驗

一.什麼是爬蟲 引用百度百科的介紹:“網路爬蟲(又被稱為網頁蜘蛛,網路機器人,在FOAF社群中間,更經常的稱為網頁追逐者),是一種按照一定的規則,自動地抓取全球資訊網資訊的程式或者指令碼。另外一些不常使用的名字還有螞蟻、自動索引、模擬程式或著蠕蟲” 以上介紹關鍵資訊:自動的抓取資訊的程式或指

讀懂IL程式碼這麼簡單 (一)

轉:https://www.cnblogs.com/zery/p/3366175.html 讀懂IL程式碼就這麼簡單 (一) 一前言   感謝 @冰麟輕武 指出文章的錯誤之處,現已更正   對於IL程式碼沒了解之前總感覺很神奇,初一看完全不知所云,只聽高手們說,

java實現爬蟲爬取網易歌單資訊

之前一直對爬蟲很好奇,覺得它很神祕,而我有個朋友是做爬蟲的,最近有空就向他學習了一下,並試著寫了個小程式。 首先是獲得httpclient物件及httpresponse物件,此兩者是用於傳送請求及接受資料。 CloseableHttpClient httpClient