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
章摘要:這篇文章將給大家展現一個大致的html的世界,讓大家心里對一個大致的方向以及格式有一個較為大概的了解,內容中可能會出現較為深入的代碼知識,不必驚慌,這些代碼知識以后都會持續在文中講解,想要學習請持續關注我的文章。
html初識:首先,推薦大家2個比較好用的寫html頁面的軟件,editplus和sublime ,在這里,我將使用sublime作為html開發軟件來給大家進行代碼的展示。特別提醒一下,不要使用一些非常強大的專業工具來幫助實現html代碼,不要依賴自動提示,這樣對初期沒有基礎的人來講是一種災難!
在這里,有些同學可能會想找前端的工作,或者說剛接觸這行不久對方向有比較大的一個迷茫的區域,那么,如果想要找到前端的工作。以下這些知識必須要學到一個比較精通的程度:
1.html + div + css:
這是基礎,不必多說。
2.Html5 + css3:
目前最流行的前端頁面技術,除了IE6、7、8以外,IE9及很多瀏覽器已經對h5+css3 有很好的技術支持,css3的出現替代了很多的圖片以及特效,許多效果是JS所難以實現的,我舉個例子:
這是一段普通的一個按鈕的代碼,加了一些普通的css樣式,最后結果如下:
那么,我們如果加上一些css3和h5的樣式呢?話不多,具體代碼貼上:
這一段加上了h5和css3的樣式,最后效果如下:
這樣給客戶的感覺是不是要比第一種普通的好很多呢?自己看著也舒服。
H5給我們增加了很多語義化的標簽,包括selection,nav,article,foot,head等,還對媒體標簽進行了擴增,最重要的是增入了畫布(canvas),svg等效果非常酷炫的一套代碼。但是canvas和svg對JS的要求非常高,甚至會應用到很多的設計模式以及算法。回復java獲取更多相關知識內容。
紹
大數據環境下,數據分析已由業務驅動轉變為數據驅動,網絡數據資源呈指數級增長,且散落在不同的數據源之中。對大多數企業和研究者而言,用“數據說話”仿佛成了大數據時代的重要武器。網絡爬蟲作為網絡數據獲取的重要技術,受到了越來越多數據需求者的青睞和追捧。
作為網絡爬蟲的入門采用 Java 開發語言,內容涵蓋了網絡爬蟲的原理以及開發邏輯,Java 網絡爬蟲基礎知識,網絡抓包介紹,jsoup 的介紹與使用,HttpClient 的介紹與使用等內容。本課程在介紹網絡爬蟲基本原理的同時,注重具體的代碼實現,加深讀者對爬蟲的理解,加強讀者的實戰能力。
內容
第01課:網絡爬蟲原理
引言
隨著互聯網的迅速發展,網絡資源越來越豐富,信息需求者如何從網絡中抽取信息變得至關重要。目前,有效的獲取網絡數據資源的重要方式,便是網絡爬蟲技術。簡單的理解,比如您對百度貼吧的一個帖子內容特別感興趣,而帖子的回復卻有1000多頁,這時采用逐條復制的方法便不可行。而采用網絡爬蟲便可以很輕松地采集到該帖子下的所有內容。
網絡爬蟲技術最廣泛的應用是在搜索引擎中,如百度、Google、Bing 等,它完成了搜索過程中的最關鍵的步驟,即網頁內容的抓取。下圖為簡單搜索引擎原理圖。
網絡爬蟲的作用,我總結為以下幾點:
網絡爬蟲涉及的領域包括:
網絡爬蟲的基本概念
網絡爬蟲(Web Crawler),又稱為網絡蜘蛛(Web Spider)或 Web 信息采集器,是一種按照一定規則,自動抓取或下載網絡信息的計算機程序或自動化腳本,是目前搜索引擎的重要組成部分。
網絡爬蟲的分類
網絡爬蟲按照系統架構和實現技術,大致可以分為以下幾種類型:通用網絡爬蟲(General Purpose Web Crawler)、聚焦網絡爬蟲(Focused Web Crawler)、增量式網絡爬蟲(Incremental Web Crawler)、深層網絡爬蟲(Deep Web Crawler)。實際的網絡爬蟲系統通常是幾種爬蟲技術相結合實現的。
網絡爬蟲的流程
網絡爬蟲基本流程可用下圖描述:
具體流程為:
網絡爬蟲的爬行策略
一般的網絡爬蟲的爬行策略分為兩種:深度優先搜索(Depth-First Search)策略、廣度優先搜索(Breadth-First Search)策略。
基于廣度優先的爬蟲是最簡單的爬取網站頁面的方法,也是目前使用較為廣泛的方法。在本達人課中,所講的案例皆為寬度優先式的爬蟲。
學習建議
網絡爬蟲是入門某一門編程語言的實戰技術:很多學習編程語言(如 Java、Python 或 C++ 等)的同學,采用的方式只看書或在網絡上看一些視頻,而這將導致的后果就是面對一個具體項目時,不知道如何上手,尤其對新手而言。或者,一段時間后,就將之前的書本內容或視頻內容遺忘了。
為此,我建議這些學習者可采用網絡爬蟲技術入門某一門編程語言(如 Java、Python)。因為爬蟲技術是個綜合性很強的技術,涉及到編程語言的很多方面。本達人課特別選用了 Java 作為開發語言,將帶大家深入了解 Java 網絡爬蟲背后的核心技術。學完該課程,相信您也已很好地入門 Java 編程語言。
對于零基礎入門 Java 網絡爬蟲的同學,在學習過程中請注意以下幾點:
最后,提供一些書籍和資料,給入門以及想深入學習 Java 網絡爬蟲的讀者:
第02課:Java 網絡爬蟲基礎知識
引言
Java 網絡爬蟲具有很好的擴展性可伸縮性,其是目前搜索引擎開發的重要組成部分。例如,著名的網絡爬蟲工具 Nutch 便是采用 Java 開發,該工具以 Apache Hadoop 數據結構為依托,提供了良好的批處理支持。
Java 網絡爬蟲涉及到 Java 的很多知識。本篇中將會介紹網絡爬蟲中需要了解的 Java 知識以及這些知識主要用于網絡爬蟲的哪一部分,具體包括以下內容:
Maven 的使用
Maven 是什么
Maven 是由 Apache 軟件基金會所提供一款工具,用于項目管理及自動構建。我們知道在構建一個 Java 工程時,需要使用到很多 Jar 包,例如操作數據庫需要使用到 mysql-connector-java 以及其相關依賴的 Jar 包。而 Maven 工具便可以很方便的對我們在項目中使用到的開源 Jar 包,進行很好的管理,比如下載某 Java 工程需要的 Jar 包及相關依賴 Java 包。
Maven 如何使用
Maven 使用項目對象模型(Project Object Model,POM)來配置,項目對象模型存儲在名為 pom.xml 的文件中。以 Java 為例,我們可以在 Eclipse 中創建一個 Maven 工程。其中,Maven Dependencies 便存放著由 Maven 管理的 Jar 包。
正如前面所說,構建一個 Java 工程需要使用很多 Jar 包,比如,在 Java 網絡爬蟲中,我們需要用到數據庫連接、請求網頁內容、解析網頁內容的相關 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>
之后,我們會驚訝地發現,工程的 Maven Dependencies 中自動下載了相關 Jar 包以及其依賴的 Jar 包。
讀者可以在 Maven Repository 網站中檢索自己想要的 Jar 包,以及 Maven 操作語句。
log4j 的使用
log4j 是什么
log4j 是一個基于 Java 的日志記錄工具,曾是 Apache 軟件基金會的一個項目。目前,日志是應用軟件中不可或缺的部分。
log4j 怎么使用
1. 使用 Maven 下載 log4j 的 Jar 包,代碼如下:
<dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.17</version></dependency>
2. 在 src 目錄下創建 log4j.properties 文本文件,并做相關配置(關于每個配置的具體含義,讀者可參考博文 《詳細的 Log4j 使用教程》):
### 設置###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."); }}
基于此程序,我們就可以看到在我們工程的根目錄下會產生一個日志文件 error.log 和 log.log。
在網絡爬蟲中,我們可以使用日志記錄程序可能出錯的地方,監控程序的運行狀態。
對象的創建
在 Java 中,經常使用 new 關鍵字來創建一個對象。例如,在爬取京東商品的id、product_name(商品名稱)、price(價格)時,我們需要將每個商品的信息封裝到對象里。
JdInfoModel jingdongproduct = new JdInfoModel();
在爬蟲中,我們要操作 JdInfoModel 類中的變量(即id、product_name、price),可以使用 private 變量定義的方式。并且,使用 set() 與 get() 方法對數據進行設置(爬取數據的封裝)和獲取使用(爬取數據的存儲)。下面的代碼為 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; } }
集合的使用
網絡爬蟲離不開對集合的操作,這里涉及到 List、Set、Queue、Map 等集合的操作。
List 和 Set 集合的使用
List 的特征是其元素以線性方式存儲,集合中可以存放重復對象。對比而言,Set 集合中的對象不按特定的方式排序,并且沒有重復對象。在網絡爬蟲中,可以使用 List<String> 存儲待爬的 URL 列表。例如:
//List集合的創建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> 來封裝具體的實例,即爬蟲所采集到的數據。Set 集合的使用與 List 集合類似,這里就不過多講解了。
Map 的使用
Map 是一種把鍵對象和值對象進行映射的集合,它的每一個元素都包含一對鍵對象和值對象,其中鍵對象不可以重復。Map 不僅在網絡爬蟲中常用,也常在文本挖掘算法的編寫中使用。在網絡爬蟲中,可以使用 Map 過濾一些重復數據,但并建議使用 Map 對大規模數據去重過濾,原因是 Map 有空間大小的限制。比如,使用網絡爬蟲爬取帖子時,可能遇到置頂帖,而置頂帖可能會與下面的帖子重復出現。以下程序為 Map 的使用案例:
//Map的創建Map<String,Integer> map = new HashMap<String,Integer>();//值的添加,這里假設是爬蟲中的產品id以及每個產品id對應的銷售量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)使用鏈表結構存儲數據,是一種特殊的線性表,它只允許在表的前端進行刪除操作,而在表的后端進行插入操作。LinkedList 類實現了 Queue 接口,因此我們可以把 LinkedList 當成 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隊列為空,停止執行程序,否則請求Url if( queue.isEmpty() ){ t = false; }else { //請求的url String url = queue.poll(); System.out.println(url); //這里要寫請求數據,獲取相應狀態碼,如果狀態碼為200,則解析數據;如果為404,url移除隊列;否則該url重新如列 }
正則表達式的使用
正則表達式,是在解析數據(HTML 或 JSON 等)時,常用的方法。舉個列子,我想從下面的語句中提取用戶的 id(75975500):
<a target="_blank" class="linkblack">尊少來自沈陽</a>
后面,我會介紹解析工具 jsoup,其可以解析獲得“//i.autohome.com.cn/75975500”。接著,便可以使用正則表達式提取 75975500。
String url = "http://i.autohome.com.cn/75975500";String user_id = url.replaceAll("\D", ""); //取代所有的非數字字符System.out.println(user_id); //輸出的結果即為75975500
如下表所示,是 Java 中一些常用的基本正則表達式。
正則表達式寫法含義\d代表0-9的任意數字\D代表任何非數字字符\s代表空格類字符\S代表非空格類字符\p{Lower}代表小寫字母[a-z]\p{Upper}代表大寫字母[A-Z]\p{Alpha}代表字母\p{Blank}代表空格或制表符
HTTP 狀態碼
當瀏覽者訪問一個網頁時,瀏覽者的瀏覽器會向網頁所在服務器發出請求。當瀏覽器接收并顯示網頁前,此網頁所在的服務器會返回一個包含 HTTP 狀態碼的信息頭(Server Header)用以響應瀏覽器的請求。在網絡爬蟲向后臺請求一個 URL 地址時,便會返回狀態碼,該狀態碼中包含豐富的信息。例如,200表示請求成功,成功獲取到了后臺傳的數據(HTML 或 JSON 等);301資源(網頁等)被永久轉移到其它 URL;404請求的資源(網頁等)不存在等。以下是 HTTP 狀態碼的分類。
分類描述1**信息,服務器收到請求,需要請求者繼續執行操作。2**成功,操作被成功接收并處理。3**重定向,需要進一步的操作以完成請求。4**客戶端錯誤,請求包含語法錯誤或無法完成請求。5**服務器錯誤,服務器在處理請求的過程中發生了錯誤。
詳細的 HTTP 狀態碼列表,讀者可以參考這個地址。
其他
另外,網絡爬蟲還涉及到其他方面的 Java 知識,比如說Java 輸入輸出流、Java 操作數據庫、Java 多線程操作、Java 對日期的處理、Java 中的接口與繼承。所以,以網絡爬蟲,入門 Java 編程是非常好的方式。在后面的課程中,我會介紹網絡爬蟲如何使用這些技術。
pire.XLS for Java 13.3.6 已發布。本次更新支持將Excel轉換為獨立的HTML文件,支持了保存整個Excel到HTML流,支持了給透視表的透視域字段(PivotFields)和數據域字段(DataFields)添加條件格式,并且支持取代一個單元格內部分文本的功能。同時,該版本還Excel 到 PDF和圖片的轉換。此外,一些已知問題也得到了修復,如修復了轉換圖表到圖片時引導線丟失的問題。詳情請閱讀以下內容。
新功能:
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");
問題修復:
下載Spire.XLS for Java 13.3.6請點擊:
Spire.XLS for Java | 下載
*請認真填寫需求信息,我們會在24小時內與您取得聯系。