整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

HTML大文件上传源代码

TML大文件上传源代码,HTML大文件上传解决方案,HTML大文件上传思路,HTML大文件上传实例,HTML大文件分块上传,HTML大文件分片上传,HTML大文件批量上传,HTML大文件加密上传,HTML文件夹上传,HTML大文件多线程上传,


随着视频网站和大数据应用的普及,特别是高清视频和4K视频应用的到来,超大文件上传已经成为了日常的基础应用需求。

但是在很多情况下,平台运营方并没有大文件上传和断点续传的开发经验,往往在网上找一些简单的PHP或者Java程序来实现基本的上传功能,然而在实际使用中会发现,这些基于脚本语言实现的上传功能模块性能很弱,一是不支持2GB以上的内容上传;二是无法支持断点续传;三是效率极低,单台服务器最多支持几十个并发上传连接。

当前我们要搭建一个运营级的视频服务平台,在尝试了各种产品均无法满足要求,因此最后花精力自主用C++语言实现了这一高性能上传服务器。

而基于PHP、JAVA等技术实现的文件上传服务天生无法支持超大文件上传,无法逾越2GB的最大文件尺寸瓶颈;

支持4GB以上超大文件上传,文件大小不受限制;

支持断点续传,断网、关机重启均不受影响;

对于大文件的处理,无论是用户端还是服务端,如果一次性进行读取发送、接收都是不可取,很容易导致内存问题。所以对于大文件上传,采用切块分段上传

从上传的效率来看,利用多线程并发上传能够达到最大效率。

文件上传页面的前端可以选择使用一些比较好用的上传组件,例如百度的开源组件WebUploader,这些组件基本能满足文件上传的一些日常所需功能,如异步上传文件,文件夹,拖拽式上传,黏贴上传,上传进度监控,文件缩略图,甚至是大文件断点续传,大文件秒传。

在web项目中上传文件夹现在已经成为了一个主流的需求。在OA,或者企业ERP系统中都有类似的需求。上传文件夹并且保留层级结构能够对用户行成很好的引导,用户使用起来也更方便。能够提供更高级的应用支撑。


导入项目:
导入到Eclipse:
http://www.ncmem.com/doc/view.aspx?id=9da9c7c2b91b40b7b09768eeb282e647
导入到IDEA:http://www.ncmem.com/doc/view.aspx?id=9fee385dfc0742448b56679420f22162
springboot统一配置:http://www.ncmem.com/doc/view.aspx?id=7768eec9284b48e3abe08f032f554ea2



下载示例:

https://gitee.com/xproer/up6-jsp-eclipse/tree/6.5.40/




工程



NOSQL

NOSQL示例不需要任何配置,可以直接访问测试



创建数据表

选择对应的数据表脚本,这里以SQL为例




修改数据库连接信息


访问页面进行测试



文件存储路径

up6/upload/年/月/日/guid/filename






相关问题:
1.javax.servlet.http.HttpServlet错误
2.项目无法发布到tomcat
3.md5计算完毕后卡住
4.服务器找不到config.json文件

相关参考:

文件保存位置


源码工程文档:https://drive.weixin.qq.com/s?k=ACoAYgezAAw1dWofra

源码报价单:https://drive.weixin.qq.com/s?k=ACoAYgezAAwoiul8gl



OEM版报价单:https://drive.weixin.qq.com/s?k=ACoAYgezAAwuzp4W0a

产品源代码:https://drive.weixin.qq.com/s?k=ACoAYgezAAwbdKCskc
授权生成器:https://drive.weixin.qq.com/s?k=ACoAYgezAAwTIcFph1

java就业班」2019从网页搭建入门JavaWeb

来百度APP畅享高清图片

//下栽のke:chaoxingit.com/1534/

从网页搭建入门到JavaWeb:2019版详解

一、引言

随着互联网技术的飞速发展,JavaWeb已经成为了一种非常流行的开发技术。通过JavaWeb,我们可以快速地构建出功能强大、安全可靠的Web应用程序。本文将详细介绍如何从网页搭建入门到JavaWeb,帮助你掌握这门技术。

二、JavaWeb简介

JavaWeb指的是使用Java技术开发的Web应用程序。它是基于Java平台的一种开发模式,用于构建和部署在Web服务器上运行的应用程序。JavaWeb通常涉及以下关键组件和技术:

  1. Servlet: Servlet是Java编写的服务器端程序,主要用于处理HTTP请求和生成HTTP响应。它们运行在支持Servlet规范的Web服务器上,如Apache Tomcat、Jetty等。
  2. JSP(JavaServer Pages): JSP是一种服务器端的Java技术,用于创建动态Web页面。JSP页面可以包含HTML、Java代码片段和JSP标签库,它们会在服务器端被解析和执行,最终生成HTML响应发送给客户端。
  3. Servlet容器: Servlet容器是一个Web服务器组件,用于管理和执行Servlet。它负责将HTTP请求路由到相应的Servlet,并将Servlet生成的响应发送回客户端。
  4. JDBC(Java Database Connectivity): JDBC是Java提供的用于与数据库交互的API。它允许Java应用程序通过标准的数据库操作语句与各种关系型数据库进行通信。
  5. Web容器: Web容器是一种用于托管和运行Web应用程序的环境。它提供了Servlet容器、JSP引擎以及其他必要的组件,使得开发者可以部署和管理JavaWeb应用程序。
  6. MVC架构(Model-View-Controller): MVC是一种常用的设计模式,用于将应用程序分为三个核心部分:模型(Model)、视图(View)和控制器(Controller)。在JavaWeb开发中,开发者通常使用MVC架构来组织和管理应用程序的代码。
  7. Web框架: JavaWeb开发中常用的框架包括Spring MVC、Struts、JSF(JavaServer Faces)等。这些框架提供了各种功能和工具,简化了开发过程,并提高了代码的可维护性和可扩展性。

JavaWeb应用程序通常遵循HTTP协议,与客户端通过HTTP请求和响应进行通信。它们可以处理各种类型的请求,包括GET、POST等,并能够生成动态内容以及与数据库等外部资源进行交互。 JavaWeb的发展已经成为构建企业级应用程序的主流方式之一,它提供了强大的功能和丰富的生态系统,使得开发者能够构建高性能、可靠和安全的Web应用程序。

三、学习资源

要想入门JavaWeb,你可以选择以下学习资源:

  1. 官方文档:Java官方文档提供了丰富的JavaWeb学习资源,包括API文档、框架文档和教程等。
  2. 培训课程:网络上有很多免费的JavaWeb培训课程,这些课程可以帮助你快速入门。
  3. 书籍:阅读一些经典的JavaWeb书籍,如《Head First Servlets and JavaServer Pages》等,可以帮助你深入理解JavaWeb技术。

四、搭建开发环境

搭建JavaWeb开发环境涉及到几个主要组件,包括Java Development Kit (JDK)、集成开发环境(IDE)、Servlet容器等。以下是从头开始搭建JavaWeb开发环境的步骤:

  1. 安装Java Development Kit (JDK):
  • 首先,你需要安装Java Development Kit,它包含了Java编译器(javac)和Java运行时环境(JRE)。
  • 前往Oracle JDK官网或OpenJDK官网下载并安装最新版本的JDK。
  • 设置JAVA_HOME环境变量,指向你的JDK安装目录。
  • 安装集成开发环境(IDE):
    • 选择一个JavaWeb开发的IDE。Eclipse、IntelliJ IDEA和NetBeans是常见的选择。
    • 下载并安装你选择的IDE。例如,你可以在IntelliJ IDEA官网下载IntelliJ IDEA。
  • 安装Servlet容器:
    • 选择一个Servlet容器,例如Apache Tomcat。
    • 前往Apache Tomcat官网下载最新版本的Tomcat。
    • 解压下载的文件到你想要安装的目录。
  • 创建JavaWeb项目:
    • 打开你的IDE,创建一个新的JavaWeb项目。
    • 在项目中配置Servlet容器,以便在开发过程中能够轻松部署和调试。
  • 编写第一个Servlet:
    • 在项目中创建一个Servlet类,这是JavaWeb应用程序的基本处理单元。
    • 实现doGet和/或doPost方法,用于处理HTTP请求和生成HTTP响应。
  • 配置Servlet容器:
    • 配置Servlet容器,告诉它在哪里找到你的Web应用程序。
    • 在Tomcat中,你需要配置server.xml文件,添加一个新的<Context>元素,指向你的项目目录。
  • 部署和运行:
    • 将你的JavaWeb项目部署到Servlet容器中。
    • 启动Servlet容器,查看你的JavaWeb应用程序是否成功运行。
  • 学习HTML和基本前端知识:
    • JavaWeb开发通常涉及与前端进行交互,因此学习HTML和基本的前端知识对于构建用户界面是很有帮助的。

    在完成上述步骤后,你就建立了一个基本的JavaWeb开发环境,并且能够开始编写和部署简单的Web应用程序。从这里开始,你可以深入学习JavaWeb的各个方面,包括Servlet、JSP、数据库连接等,以构建更复杂和功能丰富的Web应用程序。

    五、网页搭建基础

    网页搭建是学习JavaWeb的基础,主要包括HTML、CSS和JavaScript等基础知识。通过学习这些基础知识,你可以快速搭建出基本的网页。

    六、JavaWeb核心技术

    JavaWeb 是使用 Java 技术进行 Web 开发的一种方式,它涵盖了多个核心技术和框架。以下是 JavaWeb 的一些核心技术:

    1. Servlet:
    • Servlet 是运行在服务器端的 Java 应用程序,主要用于处理客户端的请求并生成响应。
    • Servlet 继承自 javax.servlet.Servlet 接口,通过覆盖 doGet 和 doPost 等方法来处理不同类型的 HTTP 请求。
  • JSP (JavaServer Pages):
    • JSP 允许在 HTML 页面中嵌入 Java 代码,它最终会被翻译成 Servlet。
    • JSP 提供了简化开发的方式,允许开发人员在页面中使用标签库来调用 JavaBean 等组件。
  • Servlet容器:
    • Servlet 容器是一个 Web 服务器或应用服务器组件,负责管理 Servlet 的生命周期、请求和响应。
    • 常见的 Servlet 容器包括 Apache Tomcat、Jetty 和 WildFly。
  • JavaBeans:
    • JavaBeans 是一种可重用的 Java 组件,通常用于在 Web 应用程序中封装数据和业务逻辑。
    • 在 JavaWeb 中,JavaBeans 可以被用于从数据库中获取数据、在页面中展示数据等任务。
  • JDBC (Java Database Connectivity):
    • JDBC 是 Java 用于与数据库进行交互的 API。
    • 在 JavaWeb 开发中,使用 JDBC 可以连接数据库、执行 SQL 查询和更新等操作。
  • JPA (Java Persistence API):
    • JPA 是 Java 用于对象关系映射(ORM)的 API,简化了 Java 对象与数据库表之间的映射。
    • Hibernate、EclipseLink 等框架实现了 JPA 规范,使得持久化操作更加方便。
  • Spring框架:
    • Spring 是一个综合性的 Java 开发框架,提供了依赖注入、面向切面编程、事务管理等功能。
    • Spring 的模块中有 Spring MVC 用于构建 Web 应用,Spring Boot 则简化了 Spring 应用程序的搭建。
  • Struts框架:
    • Struts 是一个基于 MVC 模式的 Web 应用框架,用于简化开发复杂的 Web 应用程序。
    • Struts 的核心是一个控制器,负责接收用户请求,并将其分发给相应的处理器(Action)。
  • Web Services:
    • JavaWeb 中常用的 Web 服务技术包括 SOAP(Simple Object Access Protocol)和 REST(Representational State Transfer)。
    • JAX-RS(Java API for RESTful Web Services)是 Java EE 中用于构建 RESTful Web 服务的 API。
  • Security:
    • JavaWeb 应用程序的安全性是至关重要的。Java 提供了一些安全机制,例如 Java Authentication and Authorization Service (JAAS) 和 Java Security Architecture。

    以上是 JavaWeb 的一些核心技术,这些技术一起构成了一个完整的 JavaWeb 开发生态系统。开发人员可以根据项目需求选择适当的技术和框架来构建稳健、高效的 Web 应用程序。

    七、实践项目

    实践项目是学习JavaWeb的重要环节,你可以选择以下项目进行实践:

    1. 创建一个简单的Web应用程序,包括用户注册、登录和信息展示等功能;
    2. 实现一个博客网站,包括文章列表、评论和发布等功能;
    3. 与第三方API进行交互,实现一个基于API的移动应用程序。

    通过实践项目,你可以更好地掌握JavaWeb技术,并提高自己的编程能力和团队协作能力。

    八、总结与展望

    通过本文的介绍,相信你已经对从网页搭建入门到JavaWeb有了更深入的了解。要想成为一名优秀的JavaWeb开发者,你需要不断学习、实践和总结。同时,随着技术的不断发展,你需要不断关注新技术和趋势,并努力提升自己的技能水平。希望本文能够帮助你成功迈向后端工程师的高阶之路!

    大数据环境下,数据分析已由业务驱动转变为数据驱动,网络数据资源呈指数级增长,且散落在不同的数据源之中。对大多数企业和研究者而言,用“数据说话”仿佛成了大数据时代的重要武器。网络爬虫作为网络数据获取的重要技术,受到了越来越多数据需求者的青睐和追捧。

    作为网络爬虫的入门采用 Java 开发语言,内容涵盖了网络爬虫的原理以及开发逻辑,Java 网络爬虫基础知识,网络抓包介绍,jsoup 的介绍与使用,HttpClient 的介绍与使用等内容。本课程在介绍网络爬虫基本原理的同时,注重具体的代码实现,加深读者对爬虫的理解,加强读者的实战能力。

    内容

    第01课:网络爬虫原理

    引言

    随着互联网的迅速发展,网络资源越来越丰富,信息需求者如何从网络中抽取信息变得至关重要。目前,有效的获取网络数据资源的重要方式,便是网络爬虫技术。简单的理解,比如您对百度贴吧的一个帖子内容特别感兴趣,而帖子的回复却有1000多页,这时采用逐条复制的方法便不可行。而采用网络爬虫便可以很轻松地采集到该帖子下的所有内容。

    网络爬虫技术最广泛的应用是在搜索引擎中,如百度、Google、Bing 等,它完成了搜索过程中的最关键的步骤,即网页内容的抓取。下图为简单搜索引擎原理图。

    网络爬虫的作用,我总结为以下几点:

    • 舆情分析:企业或政府利用爬取的数据,采用数据挖掘的相关方法,发掘用户讨论的内容、实行事件监测、舆情引导等。
    • 企业的用户分析:企业利用网络爬虫,采集用户对其企业或商品的看法、观点以及态度,进而分析用户的需求、自身产品的优劣势、顾客抱怨等。
    • 科研工作者的必备技术:现有很多研究都以网络大数据为基础,而采集网络大数据的必备技术便是网络爬虫。利用网络爬虫技术采集的数据可用于研究产品个性化推荐、文本挖掘、用户行为模式挖掘等。

    网络爬虫涉及的领域包括:

    网络爬虫的基本概念

    网络爬虫(Web Crawler),又称为网络蜘蛛(Web Spider)或 Web 信息采集器,是一种按照一定规则,自动抓取或下载网络信息的计算机程序或自动化脚本,是目前搜索引擎的重要组成部分。

    • 狭义上理解:利用标准的 HTTP 协议,根据网络超链接(如https://www.baidu.com/)和 Web 文档检索的方法(如深度优先)遍历万维网信息空间的软件程序。
    • 功能上理解:确定待爬的 URL 队列,获取每个 URL 对应的网页内容(如 HTML/JSON),解析网页内容,并存储对应的数据。

    网络爬虫的分类

    网络爬虫按照系统架构和实现技术,大致可以分为以下几种类型:通用网络爬虫(General Purpose Web Crawler)、聚焦网络爬虫(Focused Web Crawler)、增量式网络爬虫(Incremental Web Crawler)、深层网络爬虫(Deep Web Crawler)。实际的网络爬虫系统通常是几种爬虫技术相结合实现的。

    • 通用网络爬虫:爬行对象从一些种子 URL 扩充到整个 Web,主要为门户站点搜索引擎和大型 Web 服务提供商采集数据
    • 通用网络爬虫的爬取范围和数量巨大,对于爬行速度和存储空间要求较高,对于爬行页面的顺序要求较低,通常采用并行工作方式,有较强的应用价值。
    • 聚焦网络爬虫,又称为主题网络爬虫:是指选择性地爬行那些与预先定义好的主题相关的页面。
    • 和通用爬虫相比,聚焦爬虫只需要爬行与主题相关的页面,极大地节省了硬件和网络资源,保存的页面也由于数量少而更新快,可以很好地满足一些特定人群对特定领域信息的需求。
    • 通常在设计聚焦网络爬虫时,需要加入链接和内容筛选模块。一个常见的案例是基于关键字获取符合用户需求的数据,如下图所示:


    • 增量网络爬虫:对已下载网页采取增量式更新和只爬行新产生的或者已经发生变化网页的爬虫,它能够在一定程度上保证所爬行的页面是尽可能新的页面,历史已经采集过的页面不重复采集。
    • 增量网络爬虫避免了重复采集数据,可以减小时间和空间上的耗费。通常在设计网络爬虫时,需要在数据库中,加入时间戳,基于时间戳上的先后,判断程序是否继续执行。
    • 常见的案例有:论坛帖子评论数据的采集(如下图所示论坛的帖子,它包含400多页,每次启动爬虫时,只需爬取最近几天用户所发的帖子);天气数据的采集;新闻数据的采集;股票数据的采集等。


    • Deep Web 爬虫:指大部分内容不能通过静态链接获取,只有用户提交一些表单信息才能获取的 Web 页面。例如,需要模拟登陆的网络爬虫便属于这类网络爬虫。另外,还有一些需要用户提交关键词才能获取的内容,如京东淘宝提交关键字、价格区间获取产品的相关信息。


    网络爬虫的流程

    网络爬虫基本流程可用下图描述:

    具体流程为:

    1. 需求者选取一部分种子 URL(或初始 URL),将其放入待爬取的队列中。如在 Java 网络爬虫中,可以放入 LinkedList 或 List 中。
    2. 判断 URL 队列是否为空,如果为空则结束程序的执行,否则执行第三步骤。
    3. 从待爬取的 URL 队列中取出待爬的一个 URL,获取 URL 对应的网页内容。在此步骤需要使用响应的状态码(如200,403等)判断是否获取数据,如响应成功则执行解析操作;如响应不成功,则将其重新放入待爬取队列(注意这里需要移除无效 URL)。
    4. 针对已经响应成功后获取到的数据,执行页面解析操作。此步骤根据用户需求获取网页内容里的部分数据,如汽车论坛帖子的标题、发表的时间等。
    5. 针对3步骤已解析的数据,将其进行存储。

    网络爬虫的爬行策略

    一般的网络爬虫的爬行策略分为两种:深度优先搜索(Depth-First Search)策略、广度优先搜索(Breadth-First Search)策略

    • 深度优先搜索策略:从根节点的 URL 开始,根据优先级向下遍历该根节点对应的子节点。当访问到某一子节点 URL 时,以该子节点为入口,继续向下层遍历,直到没有新的子节点可以继续访问为止。接着使用回溯的方法,找到没有被访问到的节点,以类似的方式进行搜索。下图给出了理解深度优先搜索的一个简单案例:


    • 广度优先搜索策略:也称为宽度优先,是另外一种非常有效的搜索技术,这种方法按照层进行遍历页面。下图可帮助理解广度优先搜索的遍历方式:


    基于广度优先的爬虫是最简单的爬取网站页面的方法,也是目前使用较为广泛的方法。在本达人课中,所讲的案例皆为宽度优先式的爬虫。

    学习建议

    网络爬虫是入门某一门编程语言的实战技术:很多学习编程语言(如 Java、Python 或 C++ 等)的同学,采用的方式只看书或在网络上看一些视频,而这将导致的后果就是面对一个具体项目时,不知道如何上手,尤其对新手而言。或者,一段时间后,就将之前的书本内容或视频内容遗忘了。

    为此,我建议这些学习者可采用网络爬虫技术入门某一门编程语言(如 Java、Python)。因为爬虫技术是个综合性很强的技术,涉及到编程语言的很多方面。本达人课特别选用了 Java 作为开发语言,将带大家深入了解 Java 网络爬虫背后的核心技术。学完该课程,相信您也已很好地入门 Java 编程语言。

    对于零基础入门 Java 网络爬虫的同学,在学习过程中请注意以下几点:

    • 理解爬虫的基本原理。
    • 学习 Java 网络爬虫涉及的基础知识:基础不牢,地动山摇,学习和掌握网络爬虫的基础知识很重要。
    • 吃透基本的爬虫代码,并在此基础上进行改写。
    • 不断实战,发现爬虫中涉及的新问题,并解决问题。

    最后,提供一些书籍和资料,给入门以及想深入学习 Java 网络爬虫的读者:

    1. 《Java面向对象程序设计》(耿祥义、张跃平编著),由清华大学出版社出版,这是大学的教材,可作为基础学习。
    2. 《Java核心技术》全2册。
    3. 《Effective Java (3rd Edition)》:目前英文版已是第三版,中文版还在第二版,该书是 Java 进阶必备之书,英文比较好的同学可直接看英文版。
    4. 《自己动手写网络爬虫》(罗刚编著),国内第一本专门讲解 Java 网络爬虫的书籍。

    第02课:Java 网络爬虫基础知识

    引言

    Java 网络爬虫具有很好的扩展性可伸缩性,其是目前搜索引擎开发的重要组成部分。例如,著名的网络爬虫工具 Nutch 便是采用 Java 开发,该工具以 Apache Hadoop 数据结构为依托,提供了良好的批处理支持。

    Java 网络爬虫涉及到 Java 的很多知识。本篇中将会介绍网络爬虫中需要了解的 Java 知识以及这些知识主要用于网络爬虫的哪一部分,具体包括以下内容:

    • Maven 的使用;
    • log4j 的使用;
    • 对象的创建;
    • 集合的使用;
    • 正则表达式的使用;
    • HTTP 状态码;
    • 其他。

    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 href="//i.autohome.com.cn/75975500" target="_blank" class="linkblack">尊少来自沈阳</a>

    后面,我会介绍解析工具 jsoup,其可以解析获得“//i.autohome.com.cn/75975500”。接着,便可以使用正则表达式提取 75975500。

    String url = "//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 编程是非常好的方式。在后面的课程中,我会介绍网络爬虫如何使用这些技术。


    上一篇:HTML 元素
    下一篇:HTML 符号