章摘要:這篇文章將給大家展現(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é)為以下幾點:
網(wǎng)絡(luò)爬蟲涉及的領(lǐng)域包括:
網(wǎng)絡(luò)爬蟲的基本概念
網(wǎng)絡(luò)爬蟲(Web Crawler),又稱為網(wǎng)絡(luò)蜘蛛(Web Spider)或 Web 信息采集器,是一種按照一定規(guī)則,自動抓取或下載網(wǎng)絡(luò)信息的計算機程序或自動化腳本,是目前搜索引擎的重要組成部分。
網(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ò)爬蟲的流程
網(wǎng)絡(luò)爬蟲基本流程可用下圖描述:
具體流程為:
網(wǎng)絡(luò)爬蟲的爬行策略
一般的網(wǎng)絡(luò)爬蟲的爬行策略分為兩種:深度優(yōu)先搜索(Depth-First Search)策略、廣度優(yōu)先搜索(Breadth-First Search)策略。
基于廣度優(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ò)爬蟲的讀者:
第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 的使用
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)容。
新功能:
Workbook wb = new Workbook();
wb.loadFromFile("data/mytest.xlsx");
HTMLOptions.Default.isStandAloneHtmlFile(true);
wb.saveToFile("result.html", FileFormat.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();
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);
sheet.getCellList().get(0).textPartReplace("Office", "Spire");
問題修復(fù):
下載Spire.XLS for Java 13.3.6請點擊:
Spire.XLS for Java | 下載
*請認(rèn)真填寫需求信息,我們會在24小時內(nèi)與您取得聯(lián)系。