整合營銷服務(wù)商

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

          免費咨詢熱線:

          java開發(fā)工程師基礎(chǔ)學(xué)習(xí)一:HTML初識

          章摘要:這篇文章將給大家展現(xiàn)一個大致的html的世界,讓大家心里對一個大致的方向以及格式有一個較為大概的了解,內(nèi)容中可能會出現(xiàn)較為深入的代碼知識,不必驚慌,這些代碼知識以后都會持續(xù)在文中講解,想要學(xué)習(xí)請持續(xù)關(guān)注我的文章。

          html初識:首先,推薦大家2個比較好用的寫html頁面的軟件,editplus和sublime ,在這里,我將使用sublime作為html開發(fā)軟件來給大家進(jìn)行代碼的展示。特別提醒一下,不要使用一些非常強大的專業(yè)工具來幫助實現(xiàn)html代碼,不要依賴自動提示,這樣對初期沒有基礎(chǔ)的人來講是一種災(zāi)難!

          在這里,有些同學(xué)可能會想找前端的工作,或者說剛接觸這行不久對方向有比較大的一個迷茫的區(qū)域,那么,如果想要找到前端的工作。以下這些知識必須要學(xué)到一個比較精通的程度:

          1.html + div + css:

          這是基礎(chǔ),不必多說。

          2.Html5 + css3:

          目前最流行的前端頁面技術(shù),除了IE6、7、8以外,IE9及很多瀏覽器已經(jīng)對h5+css3 有很好的技術(shù)支持,css3的出現(xiàn)替代了很多的圖片以及特效,許多效果是JS所難以實現(xiàn)的,我舉個例子:

          這是一段普通的一個按鈕的代碼,加了一些普通的css樣式,最后結(jié)果如下:

          那么,我們?nèi)绻由弦恍ヽss3和h5的樣式呢?話不多,具體代碼貼上:

          這一段加上了h5和css3的樣式,最后效果如下:

          這樣給客戶的感覺是不是要比第一種普通的好很多呢?自己看著也舒服。

          H5給我們增加了很多語義化的標(biāo)簽,包括selection,nav,article,foot,head等,還對媒體標(biāo)簽進(jìn)行了擴增,最重要的是增入了畫布(canvas),svg等效果非常酷炫的一套代碼。但是canvas和svg對JS的要求非常高,甚至?xí)?yīng)用到很多的設(shè)計模式以及算法。回復(fù)java獲取更多相關(guān)知識內(nèi)容。

          大數(shù)據(jù)環(huán)境下,數(shù)據(jù)分析已由業(yè)務(wù)驅(qū)動轉(zhuǎn)變?yōu)閿?shù)據(jù)驅(qū)動,網(wǎng)絡(luò)數(shù)據(jù)資源呈指數(shù)級增長,且散落在不同的數(shù)據(jù)源之中。對大多數(shù)企業(yè)和研究者而言,用“數(shù)據(jù)說話”仿佛成了大數(shù)據(jù)時代的重要武器。網(wǎng)絡(luò)爬蟲作為網(wǎng)絡(luò)數(shù)據(jù)獲取的重要技術(shù),受到了越來越多數(shù)據(jù)需求者的青睞和追捧。

          作為網(wǎng)絡(luò)爬蟲的入門采用 Java 開發(fā)語言,內(nèi)容涵蓋了網(wǎng)絡(luò)爬蟲的原理以及開發(fā)邏輯,Java 網(wǎng)絡(luò)爬蟲基礎(chǔ)知識,網(wǎng)絡(luò)抓包介紹,jsoup 的介紹與使用,HttpClient 的介紹與使用等內(nèi)容。本課程在介紹網(wǎng)絡(luò)爬蟲基本原理的同時,注重具體的代碼實現(xiàn),加深讀者對爬蟲的理解,加強讀者的實戰(zhàn)能力。

          內(nèi)容

          第01課:網(wǎng)絡(luò)爬蟲原理

          引言

          隨著互聯(lián)網(wǎng)的迅速發(fā)展,網(wǎng)絡(luò)資源越來越豐富,信息需求者如何從網(wǎng)絡(luò)中抽取信息變得至關(guān)重要。目前,有效的獲取網(wǎng)絡(luò)數(shù)據(jù)資源的重要方式,便是網(wǎng)絡(luò)爬蟲技術(shù)。簡單的理解,比如您對百度貼吧的一個帖子內(nèi)容特別感興趣,而帖子的回復(fù)卻有1000多頁,這時采用逐條復(fù)制的方法便不可行。而采用網(wǎng)絡(luò)爬蟲便可以很輕松地采集到該帖子下的所有內(nèi)容。

          網(wǎng)絡(luò)爬蟲技術(shù)最廣泛的應(yīng)用是在搜索引擎中,如百度、Google、Bing 等,它完成了搜索過程中的最關(guān)鍵的步驟,即網(wǎng)頁內(nèi)容的抓取。下圖為簡單搜索引擎原理圖。

          網(wǎng)絡(luò)爬蟲的作用,我總結(jié)為以下幾點:

          • 輿情分析:企業(yè)或政府利用爬取的數(shù)據(jù),采用數(shù)據(jù)挖掘的相關(guān)方法,發(fā)掘用戶討論的內(nèi)容、實行事件監(jiān)測、輿情引導(dǎo)等。
          • 企業(yè)的用戶分析:企業(yè)利用網(wǎng)絡(luò)爬蟲,采集用戶對其企業(yè)或商品的看法、觀點以及態(tài)度,進(jìn)而分析用戶的需求、自身產(chǎn)品的優(yōu)劣勢、顧客抱怨等。
          • 科研工作者的必備技術(shù):現(xiàn)有很多研究都以網(wǎng)絡(luò)大數(shù)據(jù)為基礎(chǔ),而采集網(wǎng)絡(luò)大數(shù)據(jù)的必備技術(shù)便是網(wǎng)絡(luò)爬蟲。利用網(wǎng)絡(luò)爬蟲技術(shù)采集的數(shù)據(jù)可用于研究產(chǎn)品個性化推薦、文本挖掘、用戶行為模式挖掘等。

          網(wǎng)絡(luò)爬蟲涉及的領(lǐng)域包括:

          網(wǎng)絡(luò)爬蟲的基本概念

          網(wǎng)絡(luò)爬蟲(Web Crawler),又稱為網(wǎng)絡(luò)蜘蛛(Web Spider)或 Web 信息采集器,是一種按照一定規(guī)則,自動抓取或下載網(wǎng)絡(luò)信息的計算機程序或自動化腳本,是目前搜索引擎的重要組成部分。

          • 狹義上理解:利用標(biāo)準(zhǔn)的 HTTP 協(xié)議,根據(jù)網(wǎng)絡(luò)超鏈接(如https://www.baidu.com/)和 Web 文檔檢索的方法(如深度優(yōu)先)遍歷萬維網(wǎng)信息空間的軟件程序。
          • 功能上理解:確定待爬的 URL 隊列,獲取每個 URL 對應(yīng)的網(wǎng)頁內(nèi)容(如 HTML/JSON),解析網(wǎng)頁內(nèi)容,并存儲對應(yīng)的數(shù)據(jù)。

          網(wǎng)絡(luò)爬蟲的分類

          網(wǎng)絡(luò)爬蟲按照系統(tǒng)架構(gòu)和實現(xiàn)技術(shù),大致可以分為以下幾種類型:通用網(wǎng)絡(luò)爬蟲(General Purpose Web Crawler)、聚焦網(wǎng)絡(luò)爬蟲(Focused Web Crawler)、增量式網(wǎng)絡(luò)爬蟲(Incremental Web Crawler)、深層網(wǎng)絡(luò)爬蟲(Deep Web Crawler)。實際的網(wǎng)絡(luò)爬蟲系統(tǒng)通常是幾種爬蟲技術(shù)相結(jié)合實現(xiàn)的。

          • 通用網(wǎng)絡(luò)爬蟲:爬行對象從一些種子 URL 擴充到整個 Web,主要為門戶站點搜索引擎和大型 Web 服務(wù)提供商采集數(shù)據(jù)
          • 通用網(wǎng)絡(luò)爬蟲的爬取范圍和數(shù)量巨大,對于爬行速度和存儲空間要求較高,對于爬行頁面的順序要求較低,通常采用并行工作方式,有較強的應(yīng)用價值。
          • 聚焦網(wǎng)絡(luò)爬蟲,又稱為主題網(wǎng)絡(luò)爬蟲:是指選擇性地爬行那些與預(yù)先定義好的主題相關(guān)的頁面。
          • 和通用爬蟲相比,聚焦爬蟲只需要爬行與主題相關(guān)的頁面,極大地節(jié)省了硬件和網(wǎng)絡(luò)資源,保存的頁面也由于數(shù)量少而更新快,可以很好地滿足一些特定人群對特定領(lǐng)域信息的需求。
          • 通常在設(shè)計聚焦網(wǎng)絡(luò)爬蟲時,需要加入鏈接和內(nèi)容篩選模塊。一個常見的案例是基于關(guān)鍵字獲取符合用戶需求的數(shù)據(jù),如下圖所示:


          • 增量網(wǎng)絡(luò)爬蟲:對已下載網(wǎng)頁采取增量式更新和只爬行新產(chǎn)生的或者已經(jīng)發(fā)生變化網(wǎng)頁的爬蟲,它能夠在一定程度上保證所爬行的頁面是盡可能新的頁面,歷史已經(jīng)采集過的頁面不重復(fù)采集。
          • 增量網(wǎng)絡(luò)爬蟲避免了重復(fù)采集數(shù)據(jù),可以減小時間和空間上的耗費。通常在設(shè)計網(wǎng)絡(luò)爬蟲時,需要在數(shù)據(jù)庫中,加入時間戳,基于時間戳上的先后,判斷程序是否繼續(xù)執(zhí)行。
          • 常見的案例有:論壇帖子評論數(shù)據(jù)的采集(如下圖所示論壇的帖子,它包含400多頁,每次啟動爬蟲時,只需爬取最近幾天用戶所發(fā)的帖子);天氣數(shù)據(jù)的采集;新聞數(shù)據(jù)的采集;股票數(shù)據(jù)的采集等。


          • Deep Web 爬蟲:指大部分內(nèi)容不能通過靜態(tài)鏈接獲取,只有用戶提交一些表單信息才能獲取的 Web 頁面。例如,需要模擬登陸的網(wǎng)絡(luò)爬蟲便屬于這類網(wǎng)絡(luò)爬蟲。另外,還有一些需要用戶提交關(guān)鍵詞才能獲取的內(nèi)容,如京東淘寶提交關(guān)鍵字、價格區(qū)間獲取產(chǎn)品的相關(guān)信息。


          網(wǎng)絡(luò)爬蟲的流程

          網(wǎng)絡(luò)爬蟲基本流程可用下圖描述:

          具體流程為:

          1. 需求者選取一部分種子 URL(或初始 URL),將其放入待爬取的隊列中。如在 Java 網(wǎng)絡(luò)爬蟲中,可以放入 LinkedList 或 List 中。
          2. 判斷 URL 隊列是否為空,如果為空則結(jié)束程序的執(zhí)行,否則執(zhí)行第三步驟。
          3. 從待爬取的 URL 隊列中取出待爬的一個 URL,獲取 URL 對應(yīng)的網(wǎng)頁內(nèi)容。在此步驟需要使用響應(yīng)的狀態(tài)碼(如200,403等)判斷是否獲取數(shù)據(jù),如響應(yīng)成功則執(zhí)行解析操作;如響應(yīng)不成功,則將其重新放入待爬取隊列(注意這里需要移除無效 URL)。
          4. 針對已經(jīng)響應(yīng)成功后獲取到的數(shù)據(jù),執(zhí)行頁面解析操作。此步驟根據(jù)用戶需求獲取網(wǎng)頁內(nèi)容里的部分?jǐn)?shù)據(jù),如汽車論壇帖子的標(biāo)題、發(fā)表的時間等。
          5. 針對3步驟已解析的數(shù)據(jù),將其進(jìn)行存儲。

          網(wǎng)絡(luò)爬蟲的爬行策略

          一般的網(wǎng)絡(luò)爬蟲的爬行策略分為兩種:深度優(yōu)先搜索(Depth-First Search)策略、廣度優(yōu)先搜索(Breadth-First Search)策略

          • 深度優(yōu)先搜索策略:從根節(jié)點的 URL 開始,根據(jù)優(yōu)先級向下遍歷該根節(jié)點對應(yīng)的子節(jié)點。當(dāng)訪問到某一子節(jié)點 URL 時,以該子節(jié)點為入口,繼續(xù)向下層遍歷,直到?jīng)]有新的子節(jié)點可以繼續(xù)訪問為止。接著使用回溯的方法,找到?jīng)]有被訪問到的節(jié)點,以類似的方式進(jìn)行搜索。下圖給出了理解深度優(yōu)先搜索的一個簡單案例:


          • 廣度優(yōu)先搜索策略:也稱為寬度優(yōu)先,是另外一種非常有效的搜索技術(shù),這種方法按照層進(jìn)行遍歷頁面。下圖可幫助理解廣度優(yōu)先搜索的遍歷方式:


          基于廣度優(yōu)先的爬蟲是最簡單的爬取網(wǎng)站頁面的方法,也是目前使用較為廣泛的方法。在本達(dá)人課中,所講的案例皆為寬度優(yōu)先式的爬蟲。

          學(xué)習(xí)建議

          網(wǎng)絡(luò)爬蟲是入門某一門編程語言的實戰(zhàn)技術(shù):很多學(xué)習(xí)編程語言(如 Java、Python 或 C++ 等)的同學(xué),采用的方式只看書或在網(wǎng)絡(luò)上看一些視頻,而這將導(dǎo)致的后果就是面對一個具體項目時,不知道如何上手,尤其對新手而言。或者,一段時間后,就將之前的書本內(nèi)容或視頻內(nèi)容遺忘了。

          為此,我建議這些學(xué)習(xí)者可采用網(wǎng)絡(luò)爬蟲技術(shù)入門某一門編程語言(如 Java、Python)。因為爬蟲技術(shù)是個綜合性很強的技術(shù),涉及到編程語言的很多方面。本達(dá)人課特別選用了 Java 作為開發(fā)語言,將帶大家深入了解 Java 網(wǎng)絡(luò)爬蟲背后的核心技術(shù)。學(xué)完該課程,相信您也已很好地入門 Java 編程語言。

          對于零基礎(chǔ)入門 Java 網(wǎng)絡(luò)爬蟲的同學(xué),在學(xué)習(xí)過程中請注意以下幾點:

          • 理解爬蟲的基本原理。
          • 學(xué)習(xí) Java 網(wǎng)絡(luò)爬蟲涉及的基礎(chǔ)知識:基礎(chǔ)不牢,地動山搖,學(xué)習(xí)和掌握網(wǎng)絡(luò)爬蟲的基礎(chǔ)知識很重要。
          • 吃透基本的爬蟲代碼,并在此基礎(chǔ)上進(jìn)行改寫。
          • 不斷實戰(zhàn),發(fā)現(xiàn)爬蟲中涉及的新問題,并解決問題。

          最后,提供一些書籍和資料,給入門以及想深入學(xué)習(xí) Java 網(wǎng)絡(luò)爬蟲的讀者:

          1. 《Java面向?qū)ο蟪绦蛟O(shè)計》(耿祥義、張躍平編著),由清華大學(xué)出版社出版,這是大學(xué)的教材,可作為基礎(chǔ)學(xué)習(xí)。
          2. 《Java核心技術(shù)》全2冊。
          3. 《Effective Java (3rd Edition)》:目前英文版已是第三版,中文版還在第二版,該書是 Java 進(jìn)階必備之書,英文比較好的同學(xué)可直接看英文版。
          4. 《自己動手寫網(wǎng)絡(luò)爬蟲》(羅剛編著),國內(nèi)第一本專門講解 Java 網(wǎng)絡(luò)爬蟲的書籍。

          第02課:Java 網(wǎng)絡(luò)爬蟲基礎(chǔ)知識

          引言

          Java 網(wǎng)絡(luò)爬蟲具有很好的擴展性可伸縮性,其是目前搜索引擎開發(fā)的重要組成部分。例如,著名的網(wǎng)絡(luò)爬蟲工具 Nutch 便是采用 Java 開發(fā),該工具以 Apache Hadoop 數(shù)據(jù)結(jié)構(gòu)為依托,提供了良好的批處理支持。

          Java 網(wǎng)絡(luò)爬蟲涉及到 Java 的很多知識。本篇中將會介紹網(wǎng)絡(luò)爬蟲中需要了解的 Java 知識以及這些知識主要用于網(wǎng)絡(luò)爬蟲的哪一部分,具體包括以下內(nèi)容:

          • Maven 的使用;
          • log4j 的使用;
          • 對象的創(chuàng)建;
          • 集合的使用;
          • 正則表達(dá)式的使用;
          • HTTP 狀態(tài)碼;
          • 其他。

          Maven 的使用

          Maven 是什么

          Maven 是由 Apache 軟件基金會所提供一款工具,用于項目管理及自動構(gòu)建。我們知道在構(gòu)建一個 Java 工程時,需要使用到很多 Jar 包,例如操作數(shù)據(jù)庫需要使用到 mysql-connector-java 以及其相關(guān)依賴的 Jar 包。而 Maven 工具便可以很方便的對我們在項目中使用到的開源 Jar 包,進(jìn)行很好的管理,比如下載某 Java 工程需要的 Jar 包及相關(guān)依賴 Java 包。

          Maven 如何使用

          Maven 使用項目對象模型(Project Object Model,POM)來配置,項目對象模型存儲在名為 pom.xml 的文件中。以 Java 為例,我們可以在 Eclipse 中創(chuàng)建一個 Maven 工程。其中,Maven Dependencies 便存放著由 Maven 管理的 Jar 包。

          正如前面所說,構(gòu)建一個 Java 工程需要使用很多 Jar 包,比如,在 Java 網(wǎng)絡(luò)爬蟲中,我們需要用到數(shù)據(jù)庫連接、請求網(wǎng)頁內(nèi)容、解析網(wǎng)頁內(nèi)容的相關(guān) Jar 包時,我們可以在上圖所示的 pom 文件中添加如下語句:

          <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.35</version></dependency><dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version> 1.8.2</version></dependency><dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient </artifactId> <version> 4.2.3</version></dependency>

          之后,我們會驚訝地發(fā)現(xiàn),工程的 Maven Dependencies 中自動下載了相關(guān) Jar 包以及其依賴的 Jar 包。

          讀者可以在 Maven Repository 網(wǎng)站中檢索自己想要的 Jar 包,以及 Maven 操作語句。

          log4j 的使用

          log4j 是什么

          log4j 是一個基于 Java 的日志記錄工具,曾是 Apache 軟件基金會的一個項目。目前,日志是應(yīng)用軟件中不可或缺的部分。

          log4j 怎么使用

          1. 使用 Maven 下載 log4j 的 Jar 包,代碼如下:

          <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version></dependency>

          2. 在 src 目錄下創(chuàng)建 log4j.properties 文本文件,并做相關(guān)配置(關(guān)于每個配置的具體含義,讀者可參考博文 《詳細(xì)的 Log4j 使用教程》):

          ### 設(shè)置###log4j.rootLogger = debug,stdout,D,E### 輸出信息到控制抬 ###log4j.appender.stdout = org.apache.log4j.ConsoleAppenderlog4j.appender.stdout.Target = System.outlog4j.appender.stdout.layout = org.apache.log4j.PatternLayoutlog4j.appender.stdout.layout.ConversionPattern = [%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n### 輸出DEBUG 級別以上的日志到=error.log ###log4j.appender.D = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.D.File = E://logs/log.loglog4j.appender.D.Append = truelog4j.appender.D.Threshold = DEBUG log4j.appender.D.layout = org.apache.log4j.PatternLayoutlog4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n### 輸出ERROR 級別以上的日志到=error.log ###log4j.appender.E = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.E.File =E://logs/error.log log4j.appender.E.Append = truelog4j.appender.E.Threshold = ERROR log4j.appender.E.layout = org.apache.log4j.PatternLayoutlog4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n

          3. 實例程序,如下所示:

          package log4j;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;public class Test { static final Log logger = LogFactory.getLog(Test.class); public static void main(String[] args) { System.out.println("hello"); logger.info("hello world"); logger.debug("This is debug message."); logger.warn("This is warn message."); logger.error("This is error message."); }}

          基于此程序,我們就可以看到在我們工程的根目錄下會產(chǎn)生一個日志文件 error.log 和 log.log。

          在網(wǎng)絡(luò)爬蟲中,我們可以使用日志記錄程序可能出錯的地方,監(jiān)控程序的運行狀態(tài)。

          對象的創(chuàng)建

          在 Java 中,經(jīng)常使用 new 關(guān)鍵字來創(chuàng)建一個對象。例如,在爬取京東商品的id、product_name(商品名稱)、price(價格)時,我們需要將每個商品的信息封裝到對象里。

          JdInfoModel jingdongproduct = new JdInfoModel();

          在爬蟲中,我們要操作 JdInfoModel 類中的變量(即id、product_name、price),可以使用 private 變量定義的方式。并且,使用 set() 與 get() 方法對數(shù)據(jù)進(jìn)行設(shè)置(爬取數(shù)據(jù)的封裝)和獲取使用(爬取數(shù)據(jù)的存儲)。下面的代碼為 JdInfoModel 類:

          package model;public class JdInfoModel { private int id; private String product_name; private double price; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getProduct_name() { return product_name; } public void setProduct_name(String product_name) { this.product_name = product_name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } }

          集合的使用

          網(wǎng)絡(luò)爬蟲離不開對集合的操作,這里涉及到 List、Set、Queue、Map 等集合的操作。

          List 和 Set 集合的使用

          List 的特征是其元素以線性方式存儲,集合中可以存放重復(fù)對象。對比而言,Set 集合中的對象不按特定的方式排序,并且沒有重復(fù)對象。在網(wǎng)絡(luò)爬蟲中,可以使用 List<String> 存儲待爬的 URL 列表。例如:

          //List集合的創(chuàng)建List<String> urllist = new ArrayList<String>();urllist.add("https://movie.douban.com/subject/27608425");urllist.add("https://movie.douban.com/subject/26968024");//第一種遍歷方式for( String url : urllist ){ System.out.println(url);}//第二種遍歷方式for( int i=0; i<urllist.size(); i++ ){ System.out.println(i+":"+urllist.get(i));}//第三種遍歷方式Iterator<String> it = urllist.iterator();while ( it.hasNext() ){ System.out.println(it.next());}

          同時我們也可以使用上面 List<JdInfoModel> 來封裝具體的實例,即爬蟲所采集到的數(shù)據(jù)。Set 集合的使用與 List 集合類似,這里就不過多講解了。

          Map 的使用

          Map 是一種把鍵對象和值對象進(jìn)行映射的集合,它的每一個元素都包含一對鍵對象和值對象,其中鍵對象不可以重復(fù)。Map 不僅在網(wǎng)絡(luò)爬蟲中常用,也常在文本挖掘算法的編寫中使用。在網(wǎng)絡(luò)爬蟲中,可以使用 Map 過濾一些重復(fù)數(shù)據(jù),但并建議使用 Map 對大規(guī)模數(shù)據(jù)去重過濾,原因是 Map 有空間大小的限制。比如,使用網(wǎng)絡(luò)爬蟲爬取帖子時,可能遇到置頂帖,而置頂帖可能會與下面的帖子重復(fù)出現(xiàn)。以下程序為 Map 的使用案例:

          //Map的創(chuàng)建Map<String,Integer> map = new HashMap<String,Integer>();//值的添加,這里假設(shè)是爬蟲中的產(chǎn)品id以及每個產(chǎn)品id對應(yīng)的銷售量map.put("jd1515", 100);map.put("jd1516", 300);map.put("jd1515", 100);map.put("jd1517", 200);map.put("jd1518", 100);//第一種方法遍歷for (String key : map.keySet()) { Integer value = map.get(key); System.out.println("Key = " + key + ", Value = " + value); } //第二種方法遍歷Iterator<Entry<String, Integer>> entries = map.entrySet().iterator(); while (entries.hasNext()) { Entry<String, Integer> entry = entries.next(); System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue()); } //第三種方法遍歷for (Entry<String, Integer> entry : map.entrySet()) { System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue()); }

          Queue 的使用

          隊列(Queue)使用鏈表結(jié)構(gòu)存儲數(shù)據(jù),是一種特殊的線性表,它只允許在表的前端進(jìn)行刪除操作,而在表的后端進(jìn)行插入操作。LinkedList 類實現(xiàn)了 Queue 接口,因此我們可以把 LinkedList 當(dāng)成 Queue 來用。Queue 常用來存待爬 URL 隊列。

          Queue<String> queue = new LinkedList<String>();//添加元素queue.offer("https://www.douban.com/people/46077896/likes/topic/");queue.offer("https://www.douban.com/people/1475408/likes/topic");queue.offer("https://www.douban.com/people/3853295/likes/topic/");boolean t = true;while (t) { //如果Url隊列為空,停止執(zhí)行程序,否則請求Url if( queue.isEmpty() ){ t = false; }else { //請求的url String url = queue.poll(); System.out.println(url); //這里要寫請求數(shù)據(jù),獲取相應(yīng)狀態(tài)碼,如果狀態(tài)碼為200,則解析數(shù)據(jù);如果為404,url移除隊列;否則該url重新如列 }

          正則表達(dá)式的使用

          正則表達(dá)式,是在解析數(shù)據(jù)(HTML 或 JSON 等)時,常用的方法。舉個列子,我想從下面的語句中提取用戶的 id(75975500):

          <a target="_blank" class="linkblack">尊少來自沈陽</a>

          后面,我會介紹解析工具 jsoup,其可以解析獲得“//i.autohome.com.cn/75975500”。接著,便可以使用正則表達(dá)式提取 75975500。

          String url = "http://i.autohome.com.cn/75975500";String user_id = url.replaceAll("\D", ""); //取代所有的非數(shù)字字符System.out.println(user_id); //輸出的結(jié)果即為75975500

          如下表所示,是 Java 中一些常用的基本正則表達(dá)式。

          正則表達(dá)式寫法含義\d代表0-9的任意數(shù)字\D代表任何非數(shù)字字符\s代表空格類字符\S代表非空格類字符\p{Lower}代表小寫字母[a-z]\p{Upper}代表大寫字母[A-Z]\p{Alpha}代表字母\p{Blank}代表空格或制表符

          HTTP 狀態(tài)碼

          當(dāng)瀏覽者訪問一個網(wǎng)頁時,瀏覽者的瀏覽器會向網(wǎng)頁所在服務(wù)器發(fā)出請求。當(dāng)瀏覽器接收并顯示網(wǎng)頁前,此網(wǎng)頁所在的服務(wù)器會返回一個包含 HTTP 狀態(tài)碼的信息頭(Server Header)用以響應(yīng)瀏覽器的請求。在網(wǎng)絡(luò)爬蟲向后臺請求一個 URL 地址時,便會返回狀態(tài)碼,該狀態(tài)碼中包含豐富的信息。例如,200表示請求成功,成功獲取到了后臺傳的數(shù)據(jù)(HTML 或 JSON 等);301資源(網(wǎng)頁等)被永久轉(zhuǎn)移到其它 URL;404請求的資源(網(wǎng)頁等)不存在等。以下是 HTTP 狀態(tài)碼的分類。

          分類描述1**信息,服務(wù)器收到請求,需要請求者繼續(xù)執(zhí)行操作。2**成功,操作被成功接收并處理。3**重定向,需要進(jìn)一步的操作以完成請求。4**客戶端錯誤,請求包含語法錯誤或無法完成請求。5**服務(wù)器錯誤,服務(wù)器在處理請求的過程中發(fā)生了錯誤。

          詳細(xì)的 HTTP 狀態(tài)碼列表,讀者可以參考這個地址。

          其他

          另外,網(wǎng)絡(luò)爬蟲還涉及到其他方面的 Java 知識,比如說Java 輸入輸出流、Java 操作數(shù)據(jù)庫、Java 多線程操作、Java 對日期的處理、Java 中的接口與繼承。所以,以網(wǎng)絡(luò)爬蟲,入門 Java 編程是非常好的方式。在后面的課程中,我會介紹網(wǎng)絡(luò)爬蟲如何使用這些技術(shù)。

          pire.XLS for Java 13.3.6 已發(fā)布。本次更新支持將Excel轉(zhuǎn)換為獨立的HTML文件,支持了保存整個Excel到HTML流,支持了給透視表的透視域字段(PivotFields)和數(shù)據(jù)域字段(DataFields)添加條件格式,并且支持取代一個單元格內(nèi)部分文本的功能。同時,該版本還Excel 到 PDF和圖片的轉(zhuǎn)換。此外,一些已知問題也得到了修復(fù),如修復(fù)了轉(zhuǎn)換圖表到圖片時引導(dǎo)線丟失的問題。詳情請閱讀以下內(nèi)容。

          新功能:

          • 支持了將Excel轉(zhuǎn)換為獨立的HTML文件。
          Workbook wb = new Workbook();
          wb.loadFromFile("data/mytest.xlsx");
          HTMLOptions.Default.isStandAloneHtmlFile(true);
          wb.saveToFile("result.html", FileFormat.HTML);
          • 支持了保存整個Excel到HTML流。
          Workbook wb = new Workbook();
          wb.loadFromFile("data/mytest.xlsx");
          FileOutputStream fileStream = new FileOutputStream("output/saveStream_result.html");
          wb.saveToStream(fileStream, FileFormat.HTML);
          fileStream.close();
          • 支持了給透視表的透視域字段(PivotFields)和數(shù)據(jù)域字段(DataFields)添加條件格式。
          PivotTable table = (PivotTable)worksheet.getPivotTables().get(0);
          PivotConditionalFormatCollection pcfs = table.getPivotConditionalFormats();
          PivotConditionalFormat pc = pcfs.addPivotConditionalFormat(table.getColumnFields().get(0));
          //PivotConditionalFormat pc = pcfs.addPivotConditionalFormat(table.getRowFields().get(0));
          //PivotConditionalFormat pc = pcfs.addPivotConditionalFormat(table.getDataFields().get(0));
          //PivotConditionalFormat pc = pcfs.addPivotConditionalFormat(table.getPageFields().get(0));
          IConditionalFormat cf = pc.addCondition();
          cf.setFormatType(ConditionalFormatType.ContainsBlanks);
          cf.setFillPattern(ExcelPatternType.Solid);
          cf.setBackColor(Color.Red);
          • 支持了取代一個單元格內(nèi)部分文本的功能。
          sheet.getCellList().get(0).textPartReplace("Office", "Spire");

          問題修復(fù):

          • 修復(fù)了轉(zhuǎn)換圖表到圖片時引導(dǎo)線丟失的問題。
          • 修復(fù)了轉(zhuǎn)換Excel到圖片時部分?jǐn)?shù)據(jù)位置下移的問題。
          • 修復(fù)了轉(zhuǎn)換Excel到圖片時雙下劃線變單下劃線的問題。
          • 修復(fù)了為Excel添加頁腳時程序報錯java.lang.NullPointerException的問題。
          • 修復(fù)了轉(zhuǎn)換Excel到PDF時程序報錯Invalid sectionId of Header Footer image 的問題。
          • 修復(fù)了轉(zhuǎn)換Excel到圖片時進(jìn)度條中的進(jìn)度顏色丟失的問題。
          • 修復(fù)了轉(zhuǎn)換圖表到圖片時X軸數(shù)據(jù)偏移的問題。
          • 修復(fù)了轉(zhuǎn)換Excel到PDF時內(nèi)容不正確的問題。

          下載Spire.XLS for Java 13.3.6請點擊:

          Spire.XLS for Java | 下載


          主站蜘蛛池模板: 97精品国产福利一区二区三区| 另类一区二区三区| 中文字幕亚洲一区| 性色av闺蜜一区二区三区| 毛片一区二区三区无码| 亚洲国产成人久久一区二区三区| 久久精品国产AV一区二区三区 | 无码人妻精品一区二区三区在线 | 日韩人妻无码一区二区三区综合部| 免费一区二区无码视频在线播放 | 97久久精品一区二区三区| 国产91大片精品一区在线观看| 波多野结衣AV一区二区三区中文| 国产成人无码aa精品一区| 国产福利电影一区二区三区| 久久久人妻精品无码一区 | 精品一区二区久久| 亚洲乱色熟女一区二区三区蜜臀| 国产日韩精品一区二区在线观看 | 国产av天堂一区二区三区| 伦精品一区二区三区视频| 国产精品亚洲综合一区在线观看| 亲子乱av一区二区三区| 国内精品视频一区二区三区八戒 | 成人区精品一区二区不卡亚洲| 综合一区自拍亚洲综合图区| 国产凹凸在线一区二区| 日本免费精品一区二区三区| 精品一区二区三区在线成人| 一区精品麻豆入口| 黑巨人与欧美精品一区| 一区二区三区四区视频| 一区二区三区在线观看中文字幕| 国产精品一区二区久久| 国产精品污WWW一区二区三区| 无码中文字幕人妻在线一区二区三区| а天堂中文最新一区二区三区| 亚洲大尺度无码无码专线一区 | 亚洲综合在线一区二区三区| 久久久久一区二区三区| 中文字幕一区二区三区有限公司|