TML大文件上傳源代碼,HTML大文件上傳解決方案,HTML大文件上傳思路,HTML大文件上傳實(shí)例,HTML大文件分塊上傳,HTML大文件分片上傳,HTML大文件批量上傳,HTML大文件加密上傳,HTML文件夾上傳,HTML大文件多線程上傳,
隨著視頻網(wǎng)站和大數(shù)據(jù)應(yīng)用的普及,特別是高清視頻和4K視頻應(yīng)用的到來(lái),超大文件上傳已經(jīng)成為了日常的基礎(chǔ)應(yīng)用需求。
但是在很多情況下,平臺(tái)運(yùn)營(yíng)方并沒(méi)有大文件上傳和斷點(diǎn)續(xù)傳的開(kāi)發(fā)經(jīng)驗(yàn),往往在網(wǎng)上找一些簡(jiǎn)單的PHP或者Java程序來(lái)實(shí)現(xiàn)基本的上傳功能,然而在實(shí)際使用中會(huì)發(fā)現(xiàn),這些基于腳本語(yǔ)言實(shí)現(xiàn)的上傳功能模塊性能很弱,一是不支持2GB以上的內(nèi)容上傳;二是無(wú)法支持?jǐn)帱c(diǎn)續(xù)傳;三是效率極低,單臺(tái)服務(wù)器最多支持幾十個(gè)并發(fā)上傳連接。
當(dāng)前我們要搭建一個(gè)運(yùn)營(yíng)級(jí)的視頻服務(wù)平臺(tái),在嘗試了各種產(chǎn)品均無(wú)法滿足要求,因此最后花精力自主用C++語(yǔ)言實(shí)現(xiàn)了這一高性能上傳服務(wù)器。
而基于PHP、JAVA等技術(shù)實(shí)現(xiàn)的文件上傳服務(wù)天生無(wú)法支持超大文件上傳,無(wú)法逾越2GB的最大文件尺寸瓶頸;
支持4GB以上超大文件上傳,文件大小不受限制;
支持?jǐn)帱c(diǎn)續(xù)傳,斷網(wǎng)、關(guān)機(jī)重啟均不受影響;
對(duì)于大文件的處理,無(wú)論是用戶端還是服務(wù)端,如果一次性進(jìn)行讀取發(fā)送、接收都是不可取,很容易導(dǎo)致內(nèi)存問(wèn)題。所以對(duì)于大文件上傳,采用切塊分段上傳
從上傳的效率來(lái)看,利用多線程并發(fā)上傳能夠達(dá)到最大效率。
文件上傳頁(yè)面的前端可以選擇使用一些比較好用的上傳組件,例如百度的開(kāi)源組件WebUploader,這些組件基本能滿足文件上傳的一些日常所需功能,如異步上傳文件,文件夾,拖拽式上傳,黏貼上傳,上傳進(jìn)度監(jiān)控,文件縮略圖,甚至是大文件斷點(diǎn)續(xù)傳,大文件秒傳。
在web項(xiàng)目中上傳文件夾現(xiàn)在已經(jīng)成為了一個(gè)主流的需求。在OA,或者企業(yè)ERP系統(tǒng)中都有類似的需求。上傳文件夾并且保留層級(jí)結(jié)構(gòu)能夠?qū)τ脩粜谐珊芎玫囊龑?dǎo),用戶使用起來(lái)也更方便。能夠提供更高級(jí)的應(yīng)用支撐。
導(dǎo)入項(xiàng)目:
導(dǎo)入到Eclipse:http://www.ncmem.com/doc/view.aspx?id=9da9c7c2b91b40b7b09768eeb282e647
導(dǎo)入到IDEA:http://www.ncmem.com/doc/view.aspx?id=9fee385dfc0742448b56679420f22162
springboot統(tǒng)一配置:http://www.ncmem.com/doc/view.aspx?id=7768eec9284b48e3abe08f032f554ea2
下載示例:
https://gitee.com/xproer/up6-jsp-eclipse/tree/6.5.40/
工程
NOSQL
NOSQL示例不需要任何配置,可以直接訪問(wèn)測(cè)試
創(chuàng)建數(shù)據(jù)表
選擇對(duì)應(yīng)的數(shù)據(jù)表腳本,這里以SQL為例
修改數(shù)據(jù)庫(kù)連接信息
訪問(wèn)頁(yè)面進(jìn)行測(cè)試
文件存儲(chǔ)路徑
up6/upload/年/月/日/guid/filename
相關(guān)問(wèn)題:
1.javax.servlet.http.HttpServlet錯(cuò)誤
2.項(xiàng)目無(wú)法發(fā)布到tomcat
3.md5計(jì)算完畢后卡住
4.服務(wù)器找不到config.json文件
相關(guān)參考:
文件保存位置
源碼工程文檔:https://drive.weixin.qq.com/s?k=ACoAYgezAAw1dWofra
源碼報(bào)價(jià)單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwoiul8gl
OEM版報(bào)價(jià)單:https://drive.weixin.qq.com/s?k=ACoAYgezAAwuzp4W0a
產(chǎn)品源代碼:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc
授權(quán)生成器:https://drive.weixin.qq.com/s?k=ACoAYgezAAwTIcFph1
來(lái)百度APP暢享高清圖片
//下栽のke:chaoxingit.com/1534/
從網(wǎng)頁(yè)搭建入門到JavaWeb:2019版詳解
一、引言
隨著互聯(lián)網(wǎng)技術(shù)的飛速發(fā)展,JavaWeb已經(jīng)成為了一種非常流行的開(kāi)發(fā)技術(shù)。通過(guò)JavaWeb,我們可以快速地構(gòu)建出功能強(qiáng)大、安全可靠的Web應(yīng)用程序。本文將詳細(xì)介紹如何從網(wǎng)頁(yè)搭建入門到JavaWeb,幫助你掌握這門技術(shù)。
二、JavaWeb簡(jiǎn)介
JavaWeb指的是使用Java技術(shù)開(kāi)發(fā)的Web應(yīng)用程序。它是基于Java平臺(tái)的一種開(kāi)發(fā)模式,用于構(gòu)建和部署在Web服務(wù)器上運(yùn)行的應(yīng)用程序。JavaWeb通常涉及以下關(guān)鍵組件和技術(shù):
JavaWeb應(yīng)用程序通常遵循HTTP協(xié)議,與客戶端通過(guò)HTTP請(qǐng)求和響應(yīng)進(jìn)行通信。它們可以處理各種類型的請(qǐng)求,包括GET、POST等,并能夠生成動(dòng)態(tài)內(nèi)容以及與數(shù)據(jù)庫(kù)等外部資源進(jìn)行交互。 JavaWeb的發(fā)展已經(jīng)成為構(gòu)建企業(yè)級(jí)應(yīng)用程序的主流方式之一,它提供了強(qiáng)大的功能和豐富的生態(tài)系統(tǒng),使得開(kāi)發(fā)者能夠構(gòu)建高性能、可靠和安全的Web應(yīng)用程序。
三、學(xué)習(xí)資源
要想入門JavaWeb,你可以選擇以下學(xué)習(xí)資源:
四、搭建開(kāi)發(fā)環(huán)境
搭建JavaWeb開(kāi)發(fā)環(huán)境涉及到幾個(gè)主要組件,包括Java Development Kit (JDK)、集成開(kāi)發(fā)環(huán)境(IDE)、Servlet容器等。以下是從頭開(kāi)始搭建JavaWeb開(kāi)發(fā)環(huán)境的步驟:
在完成上述步驟后,你就建立了一個(gè)基本的JavaWeb開(kāi)發(fā)環(huán)境,并且能夠開(kāi)始編寫(xiě)和部署簡(jiǎn)單的Web應(yīng)用程序。從這里開(kāi)始,你可以深入學(xué)習(xí)JavaWeb的各個(gè)方面,包括Servlet、JSP、數(shù)據(jù)庫(kù)連接等,以構(gòu)建更復(fù)雜和功能豐富的Web應(yīng)用程序。
五、網(wǎng)頁(yè)搭建基礎(chǔ)
網(wǎng)頁(yè)搭建是學(xué)習(xí)JavaWeb的基礎(chǔ),主要包括HTML、CSS和JavaScript等基礎(chǔ)知識(shí)。通過(guò)學(xué)習(xí)這些基礎(chǔ)知識(shí),你可以快速搭建出基本的網(wǎng)頁(yè)。
六、JavaWeb核心技術(shù)
JavaWeb 是使用 Java 技術(shù)進(jìn)行 Web 開(kāi)發(fā)的一種方式,它涵蓋了多個(gè)核心技術(shù)和框架。以下是 JavaWeb 的一些核心技術(shù):
以上是 JavaWeb 的一些核心技術(shù),這些技術(shù)一起構(gòu)成了一個(gè)完整的 JavaWeb 開(kāi)發(fā)生態(tài)系統(tǒng)。開(kāi)發(fā)人員可以根據(jù)項(xiàng)目需求選擇適當(dāng)?shù)募夹g(shù)和框架來(lái)構(gòu)建穩(wěn)健、高效的 Web 應(yīng)用程序。
七、實(shí)踐項(xiàng)目
實(shí)踐項(xiàng)目是學(xué)習(xí)JavaWeb的重要環(huán)節(jié),你可以選擇以下項(xiàng)目進(jìn)行實(shí)踐:
通過(guò)實(shí)踐項(xiàng)目,你可以更好地掌握J(rèn)avaWeb技術(shù),并提高自己的編程能力和團(tuán)隊(duì)協(xié)作能力。
八、總結(jié)與展望
通過(guò)本文的介紹,相信你已經(jīng)對(duì)從網(wǎng)頁(yè)搭建入門到JavaWeb有了更深入的了解。要想成為一名優(yōu)秀的JavaWeb開(kāi)發(fā)者,你需要不斷學(xué)習(xí)、實(shí)踐和總結(jié)。同時(shí),隨著技術(shù)的不斷發(fā)展,你需要不斷關(guān)注新技術(shù)和趨勢(shì),并努力提升自己的技能水平。希望本文能夠幫助你成功邁向后端工程師的高階之路!
紹
大數(shù)據(jù)環(huán)境下,數(shù)據(jù)分析已由業(yè)務(wù)驅(qū)動(dòng)轉(zhuǎn)變?yōu)閿?shù)據(jù)驅(qū)動(dòng),網(wǎng)絡(luò)數(shù)據(jù)資源呈指數(shù)級(jí)增長(zhǎng),且散落在不同的數(shù)據(jù)源之中。對(duì)大多數(shù)企業(yè)和研究者而言,用“數(shù)據(jù)說(shuō)話”仿佛成了大數(shù)據(jù)時(shí)代的重要武器。網(wǎng)絡(luò)爬蟲(chóng)作為網(wǎng)絡(luò)數(shù)據(jù)獲取的重要技術(shù),受到了越來(lái)越多數(shù)據(jù)需求者的青睞和追捧。
作為網(wǎng)絡(luò)爬蟲(chóng)的入門采用 Java 開(kāi)發(fā)語(yǔ)言,內(nèi)容涵蓋了網(wǎng)絡(luò)爬蟲(chóng)的原理以及開(kāi)發(fā)邏輯,Java 網(wǎng)絡(luò)爬蟲(chóng)基礎(chǔ)知識(shí),網(wǎng)絡(luò)抓包介紹,jsoup 的介紹與使用,HttpClient 的介紹與使用等內(nèi)容。本課程在介紹網(wǎng)絡(luò)爬蟲(chóng)基本原理的同時(shí),注重具體的代碼實(shí)現(xiàn),加深讀者對(duì)爬蟲(chóng)的理解,加強(qiáng)讀者的實(shí)戰(zhàn)能力。
內(nèi)容
第01課:網(wǎng)絡(luò)爬蟲(chóng)原理
引言
隨著互聯(lián)網(wǎng)的迅速發(fā)展,網(wǎng)絡(luò)資源越來(lái)越豐富,信息需求者如何從網(wǎng)絡(luò)中抽取信息變得至關(guān)重要。目前,有效的獲取網(wǎng)絡(luò)數(shù)據(jù)資源的重要方式,便是網(wǎng)絡(luò)爬蟲(chóng)技術(shù)。簡(jiǎn)單的理解,比如您對(duì)百度貼吧的一個(gè)帖子內(nèi)容特別感興趣,而帖子的回復(fù)卻有1000多頁(yè),這時(shí)采用逐條復(fù)制的方法便不可行。而采用網(wǎng)絡(luò)爬蟲(chóng)便可以很輕松地采集到該帖子下的所有內(nèi)容。
網(wǎng)絡(luò)爬蟲(chóng)技術(shù)最廣泛的應(yīng)用是在搜索引擎中,如百度、Google、Bing 等,它完成了搜索過(guò)程中的最關(guān)鍵的步驟,即網(wǎng)頁(yè)內(nèi)容的抓取。下圖為簡(jiǎn)單搜索引擎原理圖。
網(wǎng)絡(luò)爬蟲(chóng)的作用,我總結(jié)為以下幾點(diǎn):
網(wǎng)絡(luò)爬蟲(chóng)涉及的領(lǐng)域包括:
網(wǎng)絡(luò)爬蟲(chóng)的基本概念
網(wǎng)絡(luò)爬蟲(chóng)(Web Crawler),又稱為網(wǎng)絡(luò)蜘蛛(Web Spider)或 Web 信息采集器,是一種按照一定規(guī)則,自動(dòng)抓取或下載網(wǎng)絡(luò)信息的計(jì)算機(jī)程序或自動(dòng)化腳本,是目前搜索引擎的重要組成部分。
網(wǎng)絡(luò)爬蟲(chóng)的分類
網(wǎng)絡(luò)爬蟲(chóng)按照系統(tǒng)架構(gòu)和實(shí)現(xiàn)技術(shù),大致可以分為以下幾種類型:通用網(wǎng)絡(luò)爬蟲(chóng)(General Purpose Web Crawler)、聚焦網(wǎng)絡(luò)爬蟲(chóng)(Focused Web Crawler)、增量式網(wǎng)絡(luò)爬蟲(chóng)(Incremental Web Crawler)、深層網(wǎng)絡(luò)爬蟲(chóng)(Deep Web Crawler)。實(shí)際的網(wǎng)絡(luò)爬蟲(chóng)系統(tǒng)通常是幾種爬蟲(chóng)技術(shù)相結(jié)合實(shí)現(xiàn)的。
網(wǎng)絡(luò)爬蟲(chóng)的流程
網(wǎng)絡(luò)爬蟲(chóng)基本流程可用下圖描述:
具體流程為:
網(wǎng)絡(luò)爬蟲(chóng)的爬行策略
一般的網(wǎng)絡(luò)爬蟲(chóng)的爬行策略分為兩種:深度優(yōu)先搜索(Depth-First Search)策略、廣度優(yōu)先搜索(Breadth-First Search)策略。
基于廣度優(yōu)先的爬蟲(chóng)是最簡(jiǎn)單的爬取網(wǎng)站頁(yè)面的方法,也是目前使用較為廣泛的方法。在本達(dá)人課中,所講的案例皆為寬度優(yōu)先式的爬蟲(chóng)。
學(xué)習(xí)建議
網(wǎng)絡(luò)爬蟲(chóng)是入門某一門編程語(yǔ)言的實(shí)戰(zhàn)技術(shù):很多學(xué)習(xí)編程語(yǔ)言(如 Java、Python 或 C++ 等)的同學(xué),采用的方式只看書(shū)或在網(wǎng)絡(luò)上看一些視頻,而這將導(dǎo)致的后果就是面對(duì)一個(gè)具體項(xiàng)目時(shí),不知道如何上手,尤其對(duì)新手而言?;蛘撸欢螘r(shí)間后,就將之前的書(shū)本內(nèi)容或視頻內(nèi)容遺忘了。
為此,我建議這些學(xué)習(xí)者可采用網(wǎng)絡(luò)爬蟲(chóng)技術(shù)入門某一門編程語(yǔ)言(如 Java、Python)。因?yàn)榕老x(chóng)技術(shù)是個(gè)綜合性很強(qiáng)的技術(shù),涉及到編程語(yǔ)言的很多方面。本達(dá)人課特別選用了 Java 作為開(kāi)發(fā)語(yǔ)言,將帶大家深入了解 Java 網(wǎng)絡(luò)爬蟲(chóng)背后的核心技術(shù)。學(xué)完該課程,相信您也已很好地入門 Java 編程語(yǔ)言。
對(duì)于零基礎(chǔ)入門 Java 網(wǎng)絡(luò)爬蟲(chóng)的同學(xué),在學(xué)習(xí)過(guò)程中請(qǐng)注意以下幾點(diǎn):
最后,提供一些書(shū)籍和資料,給入門以及想深入學(xué)習(xí) Java 網(wǎng)絡(luò)爬蟲(chóng)的讀者:
第02課:Java 網(wǎng)絡(luò)爬蟲(chóng)基礎(chǔ)知識(shí)
引言
Java 網(wǎng)絡(luò)爬蟲(chóng)具有很好的擴(kuò)展性可伸縮性,其是目前搜索引擎開(kāi)發(fā)的重要組成部分。例如,著名的網(wǎng)絡(luò)爬蟲(chóng)工具 Nutch 便是采用 Java 開(kāi)發(fā),該工具以 Apache Hadoop 數(shù)據(jù)結(jié)構(gòu)為依托,提供了良好的批處理支持。
Java 網(wǎng)絡(luò)爬蟲(chóng)涉及到 Java 的很多知識(shí)。本篇中將會(huì)介紹網(wǎng)絡(luò)爬蟲(chóng)中需要了解的 Java 知識(shí)以及這些知識(shí)主要用于網(wǎng)絡(luò)爬蟲(chóng)的哪一部分,具體包括以下內(nèi)容:
Maven 的使用
Maven 是什么
Maven 是由 Apache 軟件基金會(huì)所提供一款工具,用于項(xiàng)目管理及自動(dòng)構(gòu)建。我們知道在構(gòu)建一個(gè) Java 工程時(shí),需要使用到很多 Jar 包,例如操作數(shù)據(jù)庫(kù)需要使用到 mysql-connector-java 以及其相關(guān)依賴的 Jar 包。而 Maven 工具便可以很方便的對(duì)我們?cè)陧?xiàng)目中使用到的開(kāi)源 Jar 包,進(jìn)行很好的管理,比如下載某 Java 工程需要的 Jar 包及相關(guān)依賴 Java 包。
Maven 如何使用
Maven 使用項(xiàng)目對(duì)象模型(Project Object Model,POM)來(lái)配置,項(xiàng)目對(duì)象模型存儲(chǔ)在名為 pom.xml 的文件中。以 Java 為例,我們可以在 Eclipse 中創(chuàng)建一個(gè) Maven 工程。其中,Maven Dependencies 便存放著由 Maven 管理的 Jar 包。
正如前面所說(shuō),構(gòu)建一個(gè) Java 工程需要使用很多 Jar 包,比如,在 Java 網(wǎng)絡(luò)爬蟲(chóng)中,我們需要用到數(shù)據(jù)庫(kù)連接、請(qǐng)求網(wǎng)頁(yè)內(nèi)容、解析網(wǎng)頁(yè)內(nèi)容的相關(guān) Jar 包時(shí),我們可以在上圖所示的 pom 文件中添加如下語(yǔ)句:
<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>
之后,我們會(huì)驚訝地發(fā)現(xiàn),工程的 Maven Dependencies 中自動(dòng)下載了相關(guān) Jar 包以及其依賴的 Jar 包。
讀者可以在 Maven Repository 網(wǎng)站中檢索自己想要的 Jar 包,以及 Maven 操作語(yǔ)句。
log4j 的使用
log4j 是什么
log4j 是一個(gè)基于 Java 的日志記錄工具,曾是 Apache 軟件基金會(huì)的一個(gè)項(xiàng)目。目前,日志是應(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)于每個(gè)配置的具體含義,讀者可參考博文 《詳細(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 級(jí)別以上的日志到=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 級(jí)別以上的日志到=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. 實(shí)例程序,如下所示:
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."); }}
基于此程序,我們就可以看到在我們工程的根目錄下會(huì)產(chǎn)生一個(gè)日志文件 error.log 和 log.log。
在網(wǎng)絡(luò)爬蟲(chóng)中,我們可以使用日志記錄程序可能出錯(cuò)的地方,監(jiān)控程序的運(yùn)行狀態(tài)。
對(duì)象的創(chuàng)建
在 Java 中,經(jīng)常使用 new 關(guān)鍵字來(lái)創(chuàng)建一個(gè)對(duì)象。例如,在爬取京東商品的id、product_name(商品名稱)、price(價(jià)格)時(shí),我們需要將每個(gè)商品的信息封裝到對(duì)象里。
JdInfoModel jingdongproduct = new JdInfoModel();
在爬蟲(chóng)中,我們要操作 JdInfoModel 類中的變量(即id、product_name、price),可以使用 private 變量定義的方式。并且,使用 set() 與 get() 方法對(duì)數(shù)據(jù)進(jìn)行設(shè)置(爬取數(shù)據(jù)的封裝)和獲取使用(爬取數(shù)據(jù)的存儲(chǔ))。下面的代碼為 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ò)爬蟲(chóng)離不開(kāi)對(duì)集合的操作,這里涉及到 List、Set、Queue、Map 等集合的操作。
List 和 Set 集合的使用
List 的特征是其元素以線性方式存儲(chǔ),集合中可以存放重復(fù)對(duì)象。對(duì)比而言,Set 集合中的對(duì)象不按特定的方式排序,并且沒(méi)有重復(fù)對(duì)象。在網(wǎng)絡(luò)爬蟲(chóng)中,可以使用 List<String> 存儲(chǔ)待爬的 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());}
同時(shí)我們也可以使用上面 List<JdInfoModel> 來(lái)封裝具體的實(shí)例,即爬蟲(chóng)所采集到的數(shù)據(jù)。Set 集合的使用與 List 集合類似,這里就不過(guò)多講解了。
Map 的使用
Map 是一種把鍵對(duì)象和值對(duì)象進(jìn)行映射的集合,它的每一個(gè)元素都包含一對(duì)鍵對(duì)象和值對(duì)象,其中鍵對(duì)象不可以重復(fù)。Map 不僅在網(wǎng)絡(luò)爬蟲(chóng)中常用,也常在文本挖掘算法的編寫(xiě)中使用。在網(wǎng)絡(luò)爬蟲(chóng)中,可以使用 Map 過(guò)濾一些重復(fù)數(shù)據(jù),但并建議使用 Map 對(duì)大規(guī)模數(shù)據(jù)去重過(guò)濾,原因是 Map 有空間大小的限制。比如,使用網(wǎng)絡(luò)爬蟲(chóng)爬取帖子時(shí),可能遇到置頂帖,而置頂帖可能會(huì)與下面的帖子重復(fù)出現(xiàn)。以下程序?yàn)?Map 的使用案例:
//Map的創(chuàng)建Map<String,Integer> map = new HashMap<String,Integer>();//值的添加,這里假設(shè)是爬蟲(chóng)中的產(chǎn)品id以及每個(gè)產(chǎn)品id對(duì)應(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 的使用
隊(duì)列(Queue)使用鏈表結(jié)構(gòu)存儲(chǔ)數(shù)據(jù),是一種特殊的線性表,它只允許在表的前端進(jìn)行刪除操作,而在表的后端進(jìn)行插入操作。LinkedList 類實(shí)現(xiàn)了 Queue 接口,因此我們可以把 LinkedList 當(dāng)成 Queue 來(lái)用。Queue 常用來(lái)存待爬 URL 隊(duì)列。
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隊(duì)列為空,停止執(zhí)行程序,否則請(qǐng)求Url if( queue.isEmpty() ){ t = false; }else { //請(qǐng)求的url String url = queue.poll(); System.out.println(url); //這里要寫(xiě)請(qǐng)求數(shù)據(jù),獲取相應(yīng)狀態(tài)碼,如果狀態(tài)碼為200,則解析數(shù)據(jù);如果為404,url移除隊(duì)列;否則該url重新如列 }
正則表達(dá)式的使用
正則表達(dá)式,是在解析數(shù)據(jù)(HTML 或 JSON 等)時(shí),常用的方法。舉個(gè)列子,我想從下面的語(yǔ)句中提取用戶的 id(75975500):
<a target="_blank" class="linkblack">尊少來(lái)自沈陽(yáng)</a>
后面,我會(huì)介紹解析工具 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á)式寫(xiě)法含義\d代表0-9的任意數(shù)字\D代表任何非數(shù)字字符\s代表空格類字符\S代表非空格類字符\p{Lower}代表小寫(xiě)字母[a-z]\p{Upper}代表大寫(xiě)字母[A-Z]\p{Alpha}代表字母\p{Blank}代表空格或制表符
HTTP 狀態(tài)碼
當(dāng)瀏覽者訪問(wèn)一個(gè)網(wǎng)頁(yè)時(shí),瀏覽者的瀏覽器會(huì)向網(wǎng)頁(yè)所在服務(wù)器發(fā)出請(qǐng)求。當(dāng)瀏覽器接收并顯示網(wǎng)頁(yè)前,此網(wǎng)頁(yè)所在的服務(wù)器會(huì)返回一個(gè)包含 HTTP 狀態(tài)碼的信息頭(Server Header)用以響應(yīng)瀏覽器的請(qǐng)求。在網(wǎng)絡(luò)爬蟲(chóng)向后臺(tái)請(qǐng)求一個(gè) URL 地址時(shí),便會(huì)返回狀態(tài)碼,該狀態(tài)碼中包含豐富的信息。例如,200表示請(qǐng)求成功,成功獲取到了后臺(tái)傳的數(shù)據(jù)(HTML 或 JSON 等);301資源(網(wǎng)頁(yè)等)被永久轉(zhuǎn)移到其它 URL;404請(qǐng)求的資源(網(wǎng)頁(yè)等)不存在等。以下是 HTTP 狀態(tài)碼的分類。
分類描述1**信息,服務(wù)器收到請(qǐng)求,需要請(qǐng)求者繼續(xù)執(zhí)行操作。2**成功,操作被成功接收并處理。3**重定向,需要進(jìn)一步的操作以完成請(qǐng)求。4**客戶端錯(cuò)誤,請(qǐng)求包含語(yǔ)法錯(cuò)誤或無(wú)法完成請(qǐng)求。5**服務(wù)器錯(cuò)誤,服務(wù)器在處理請(qǐng)求的過(guò)程中發(fā)生了錯(cuò)誤。
詳細(xì)的 HTTP 狀態(tài)碼列表,讀者可以參考這個(gè)地址。
其他
另外,網(wǎng)絡(luò)爬蟲(chóng)還涉及到其他方面的 Java 知識(shí),比如說(shuō)Java 輸入輸出流、Java 操作數(shù)據(jù)庫(kù)、Java 多線程操作、Java 對(duì)日期的處理、Java 中的接口與繼承。所以,以網(wǎng)絡(luò)爬蟲(chóng),入門 Java 編程是非常好的方式。在后面的課程中,我會(huì)介紹網(wǎng)絡(luò)爬蟲(chóng)如何使用這些技術(shù)。
*請(qǐng)認(rèn)真填寫(xiě)需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。