java爬虫基础知识,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 包。

ed70ce2e445038a43e800b24617e12d9.png

正如前面所说,构建一个 Java 工程需要用很多 Jar 包,比方,在 Java 网络爬虫中,我们需要使用到数据库连接、请求网页内容、解析网页内容的相关 Jar 包时,我们可以在上图所示的 pom 文件中增加如下语句:

mysql

mysql-connector-java

5.1.35

org.jsoup

jsoup

1.8.2

org.apache.httpcomponents

httpclient

4.2.3

之后,我们会惊讶地发现,工程的 Maven Dependencies 中自动下载了相关 Jar 包以及其依赖的 Jar 包。

20833c36f0703657277c47fe3340866e.png

读者可以在 Maven Repository 网站中检索自己想要的 Jar 包,以及 Maven 操作语句。

5bb5a6c1e69246ade21359b6ce4f4912.png

log4j 的用

log4j 是什么

log4j 是一个基于 Java 的日志记录工具,曾是 Apache 软件基金会的一个项目。目前,日志是应使用软件中不可或者缺的部分。

log4j 怎样用

1. 用 Maven 下载 log4j 的 Jar 包,代码如下:

log4j

log4j

1.2.17

2. 在 src 目录下创立 log4j.properties 文本文件,并做相关配置(关于每个配置的具体含义,读者可参考博文 《详细的 Log4j 用教程》):

### 设置###

log4j.rootLogger = debug,stdout,D,E

### 输出信息到控制抬 ###

log4j.appender.stdout = org.apache.log4j.ConsoleAppender

log4j.appender.stdout.Target = System.out

log4j.appender.stdout.layout = org.apache.log4j.PatternLayout

log4j.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.DailyRollingFileAppender

log4j.appender.D.File = E://logs/log.log

log4j.appender.D.Append = true

log4j.appender.D.Threshold = DEBUG

log4j.appender.D.layout = org.apache.log4j.PatternLayout

log4j.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.DailyRollingFileAppender

log4j.appender.E.File =E://logs/error.log

log4j.appender.E.Append = true

log4j.appender.E.Threshold = ERROR

log4j.appender.E.layout = org.apache.log4j.PatternLayout

log4j.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。

5b6fbd3b007c4c72bd95e6cc2ae84f8e.png

在网络爬虫中,我们可以用日志记录程序可能出错的地方,监控程序的运行状态。

对象的创立

在 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存储待爬的 URL 列表。例如:

//List集合的创立

Listurllist =new ArrayList();

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; iSystem.out.println(i+":"+urllist.get(i));

}

//第三种遍历方式

Iteratorit = urllist.iterator();

while ( it.hasNext() ){

System.out.println(it.next());

}

同时我们也可以用上面 List来封装具体的实例,即爬虫所采集到的数据。Set 集合的用与 List 集合相似,这里就不过多讲解了。

Map 的用

Map 是一种把键对象和值对象进行映射的集合,它的每一个元素都包含一对键对象和值对象,其中键对象不可以重复。Map 不仅在网络爬虫中常使用,也常在文本挖掘算法的编写中用。在网络爬虫中,可以用 Map 过滤少量重复数据,但并建议用 Map 对大规模数据去重过滤,起因是 Map 有空间大小的限制。比方,用网络爬虫爬取帖子时,可能遇到置顶帖,而置顶帖可能会与下面的帖子重复出现。以下程序为 Map 的用案例:

//Map的创立

Mapmap = new HashMap();

//值的增加,这里假设是爬虫中的产品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> entries =map.entrySet().iterator();

while (entries.hasNext()) {

Entryentry = entries.next();

System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());

}

//第三种方法遍历

for (Entryentry : map.entrySet()) {

System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());

}

Queue 的用

队列(Queue)用链表结构存储数据,是一种特殊的线性表,它只允许在表的前台进行删除操作,而在表的后台进行插入操作。LinkedList 类实现了 Queue 接口,因而我们可以把 LinkedList 当成 Queue 来使用。Queue 常使用来存待爬 URL 队列。

Queuequeue = new LinkedList();

//增加元素

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):

后面,我会详情解析工具 jsoup,其可以解析取得“http://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 中少量常使用的基本正则表达式。

9bb7b3406025afffbfffaa6124e76603.png

HTTP 状态码

当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含 HTTP 状态码的信息头(Server Header)使用以响应浏览器的请求。在网络爬虫向后端请求一个 URL 地址时,便会返回状态码,该状态码中包含丰富的信息。例如,200表示请求成功,成功获取到了后端传的数据(HTML 或者 JSON 等);301资源(网页等)被永久转移到其它 URL;404请求的资源(网页等)不存在等。以下是 HTTP 状态码的分类。

a2237478cfc135b2ea01b72e598e0815.png

详细的 HTTP 状态码列表,读者可以参考这个地址。

其余

另外,网络爬虫还涉及到其余方面的 Java 知识,比方说Java 输入输出流、Java 操作数据库、Java 多线程操作、Java 对日期的解决、Java 中的接口与继承。所以,以网络爬虫,入门 Java 编程是非常好的方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/306920.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET5都来了,你还不知道怎么部署到linux?最全部署方案,总有一款适合你

随着2020进入4季度,.NET5正式版也已经与大家见面了。不过,尽管 .NET Core发布已经有四五年的时间,但到目前为止,依旧有很多.NET开发者在坚守者.NET4,原因不尽相同,但最大的问题可能还是不熟悉Linux&#xf…

好用的平板电脑_平板选择华为M6,这里有几点建议

大家好,我是师兄。平板几乎已经成大学生生活中必备的物品之一了,现在的学生实在是太会享受了。作为华为M6的重度使用用户,在这里给大家在购买华为平板M6时提几点建议。1.质量挺好的,品制有保证购买华为平板M6已经半年了&#xff0…

读取oracle bfile字段,ORACLE中BFILE字段的使用研究_oracle

因为做项目,需要使用BFILE字段存储图像文件,所以进行了一些研究。bfile字段实际的文件存储在文件系统中,字段中存储的是文件定位指针.bfile对oracle来说是只读的,也不参与事务性控制和数据恢复bfile的基本操作如下:1.先在oracle数据库中下面我…

客户的一个紧急bug,我用了两种方式进行 C# 反编译修改源码

一:背景 1. 讲故事周五下午运营反馈了一个紧急bug,说客户那边一个信息列表打不开,急需解决,附带的日志文件也发过来了,看了下日志大概是这样的:日期:2020-11-13 12:25:45,923 线程ID:[3924] 日志级别:INFO …

离线语音识别软件_从音乐识别软件起家,这家公司如何备战车载AI语音市场GGAI对话...

加入高工智能汽车专业行业群(自动驾驶5群,车联网智能座舱3群,智能网联商用车2群),加微信:17157613659,出示名片,仅限智能网联汽车软硬件供应商及OEM厂商。早在2016年,亚马逊推出的语音助手Alexa…

int函数在Oracle,vb中int是什么意思 ?

VB语言中int函数的意思是取整数。即:int(x)函数是取不大于x的最大整数。例如:1、int(4.88)4int(4.88)即是取一个不大于4.88且最接近4.88的整数,所以int(4.88)4。2、int(8.1)8int(8.1)即是取一个不大于8.1且最接近8的整数,所以int(…

windows如何添加本机dns记录_运维必看!超清晰的 DNS 原理入门指南

来源:阮一峰的网络日志作者:阮一峰链接:http://www.ruanyifeng.com/blog/2016/06/dns.htmlDNS 是互联网核心协议之一。不管是上网浏览,还是编程开发,都需要了解一点它的知识。本文详细介绍DNS的原理,以及如…

天际数见数据质量巡检架构优化

源宝导读:天际数见平台是一个数据可视化的BI平台,定位于为高层决策提供数据可视化赋能。数据准确性是生命线,如何提前发现数据问题,快速定位和修复问题,成为我们必须攻克的难点。本文将介绍数见平台通过架构优化&#…

db2 删除存储过程_蚂蚁金服OceanBase挑战TPCC | TPCC基准测试之存储优化

蚂蚁金服自研数据库 OceanBase 登顶 TPC-C 引起业内广泛关注,为了更清楚的展示其中的技术细节,我们特意邀请 OceanBase 核心研发人员对本次测试进行技术解读,共包括五篇:1)TPC-C基准测试介绍2)OceanBase如何做TPC-C测试3)TPC-C基准…

Github Actions 中 Service Container 的使用

Github Actions 中 Service Container 的使用Intro之前写过一个 StackExchange.Redis 的一个扩展,测试项目依赖 redis,所以之前测试一直只是在本地跑一下,最近通过 Github Action 中的 Service Container 来通过 CI 来跑测试,分享…

深度探秘.NET 5.0

2020 中国.NET 开发者峰会正式启动 ,欢迎大家提交演讲主题或者购买超级早鸟票。今年11月10号 .NET 5.0 如约而至。这是.NET All in one后的第一个版本,虽然不是LTS(Long term support)版本,但是是生产环境可用的。微软从.NET 5 Preview 1就开…

vuex保存用户信息_Vuex状态管理

一个组件可以分为数据和视图,数据更新时,视图也会自动更新。在视图中又可以绑定一些事件,它们触发methods里面指定的方法,从而又可以改变数据、更新视图,这就是一个组件基本的运行模式。但实际的业务中,经常…

使用 docker 构建分布式调用链跟踪框架skywalking

一旦你的程序docker化之后,你会遇到各种问题,比如原来采用的本地记日志的方式就不再方便了,虽然你可以挂载到宿主机,但你使用 --scale 的话,会导致记录日志异常,所以最好的方式还是要做日志中心化,另一个问…

excel同一单元格怎么换行_excel表格内怎么换行 方法有两种 一看就会 新手教程...

很多人在用excel表格的时候都需要用到换行,但是有一些小伙伴还不知道如何去换行。今天就介绍两种单元格内换行的方法,这两种换行方式的效果不一样,大家可以根据自己的需求来选择使用哪种换行方式。方法一:单元格内自动换行操作&am…

持续交付一:从开发到上线的环境

团队开发中,开发,测试,预发布,生产,不同的角色工作在不同的环境中,不同的环境有不同的作用(有些公司的环境更多,按照自己的交付流程设计),当然不同的环境,配置也不能相同…

win10控制面板快捷键_你没玩过的全新版本 Win10这些操作你知多少

不知不觉,Win10与我们相伴已经整整四个年头了,从最开始的组团抗拒到现在的默默接受,个中滋味相信谁心里都有个数。近日微软开始推送“Win10更新五月版”,那么Win10中到底都有哪些“骚”操作?一起来看看吧。1、夜间模式…

C# 中的数字分隔符 _

编写 C# 代码时,我们时常会用到很大的数字,例如下面定义的变量:const long loops 50000000000;您能快速读出这是多少吗?是不是还是会有很多人把光标定位到最后一位,然后按键盘上的向左键一个一个往上数:个…

数字调制系统工作原理_空间光调制器工作原理是什么 空间光调制器工作原理...

空间光调制器(SLM), 空间光调制器(SLM)工作原理是什么?实时空间光调制器使得相干处理系统能输入非相干光图像和随时间变化的图像的器件。相干光处理系统的最大优点是二维平行处理、信息容量大,运算速度快。但是目前的输入图像和空间滤波都用银盐胶片作记录媒质&…

使用 .NET 5 体验大数据和机器学习

2020 中国.NET 开发者峰会正式启动 ,欢迎大家提交演讲主题或者购买超级早鸟票。翻译:精致码农-王亮原文:http://dwz.win/XnM.NET 5 旨在提供统一的运行时和框架,使其在各平台都有统一的运行时行为和开发体验。微软发布了与 .NET 协…

linux监控目录容量,利用ZABBIX监控某个目录大小

近期,因为JMS的消息堆积导致ApacheMQ频率故障(消息没有被消费掉,导致其数据库达到1.2G,JMS此时直接挂掉),很是郁闷!刚好自己在研究zabbix.既然zabbix如此强大,那么它可以监控我的这个目录大小吗&#xff1f…