java爬虫抓取网页数据(Java网络爬虫的分类及开发逻辑【一课一】)

优采云 发布时间: 2022-03-28 06:16

  java爬虫抓取网页数据(Java网络爬虫的分类及开发逻辑【一课一】)

  介绍

  在大数据环境下,数据分析从业务驱动向数据驱动转变,网络数据资源呈指数级增长,分散在不同的数据源中。对于大多数公司和研究人员来说,用“数据说话”似乎是大数据时代的重要武器。网络爬虫作为网络数据获取的重要技术,受到越来越多数据需求者的青睐和追捧。

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

  内容

  第01课:网络爬虫原理

  介绍

  随着互联网的飞速发展,网络资源越来越丰富,如何从网络中提取信息对于信息需求者来说变得非常重要。目前,有效获取网络数据资源的重要途径是网络爬虫技术。简单理解,比如你对*敏*感*词*上一个帖子的内容特别感兴趣,但是帖子的回复却有1000多页。在这种情况下,使用一个一个复制的方法是不可行的。并且使用网络爬虫可以轻松采集到帖子下的所有内容。

  最广泛使用的网络爬虫技术是在搜索引擎中,如百度、谷歌、必应等,它完成了搜索过程中最关键的一步,即对网页内容的爬取。下图是一个简单的搜索引擎的*敏*感*词*。

  

  网络爬虫的作用可以总结如下:

  网络爬虫覆盖的领域包括:

  

  网络爬虫的基本概念

  Web Crawler,也称为Web Spider或Web Information采集器,是一种计算机程序或自动化脚本,根据一定的规则自动爬取或下载网络信息。它是当前搜索引擎的重要组成部分。

  网络爬虫的分类

  网络爬虫根据系统架构和实现技术大致可以分为以下几种:通用网络爬虫、聚焦网络爬虫、增量网络爬虫、深度网络爬虫(Deep Web Crawler)。实际的网络爬虫系统通常是通过结合几种爬虫技术来实现的。

  

  

  

  网络爬虫的过程

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

  

  具体流程为:

  请求者选择*敏*感*词* URL(或初始 URL)的一部分并将其放入待爬取的队列中。与Java网络爬虫一样,可以放入LinkedList或List。判断URL队列是否为空,如果为空,则结束程序的执行,否则,执行第三步。从待爬取URL队列中取出一个待爬取URL,获取该URL对应的网页内容。在这一步中,需要使用响应的状态码(如200、403等)来判断是否获取数据。如果响应成功,则进行解析操作;如果响应不成功,则放回待爬取队列中(注意这里需要去掉。无效的URL)。对响应成功后获取的数据执行页面解析操作。

  网络爬虫抓取策略

  一般的网络爬虫爬取策略有两种:深度优先搜索策略和广度优先搜索策略。

  

  

  基于广度优先的爬虫是爬取网站页面最简单的方法,也是目前应用最广泛的方法。在这个大师班里,提到的案例都是广度优先爬虫。

  学习建议

  网络爬虫是对某种编程语言入门的实用技术:很多学习编程语言(如Java、Python或C++等)的同学只是在网上看书或看一些视频,后果不堪设想。这将是面对面的,当涉及到一个具体的项目时,我不知道如何开始,尤其是对于初学者。或者,一段时间后,之前的书籍内容或视频内容就被遗忘了。

  为此,我建议这些学习者可以使用网络爬虫技术来入门一种编程语言(如Java、Python)。因为爬虫技术是一门综合性很强的技术,它涉及到编程语言的很多方面。本次大师班特别选择Java作为开发语言,带你了解Java爬虫背后的核心技术。完成本课程后,相信您对 Java 编程语言有了很好的介绍。

  零基础开始Java爬虫的同学,在学习过程中请注意以下几点:

  最后,提供一些书籍和资料,供刚入门并想进一步了解 Java 网络爬虫的读者使用:

  清华大学出版社出版的《Java Object-Oriented Programming》(耿祥一、张月平主编)是一本可以作为基础学习的大学教材。《Java 核心技术》2 卷。《Effective Java (3rd Edition)》:目前英文版是第三版,中文版还在第二版。本书是高级Java的必备书籍。英语较好的同学可以直接看英文版。《Do It Yourself Web Crawler》(罗刚主编),国内第一本专门研究Java网络爬虫的书籍。

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

  介绍

  Java网络爬虫具有良好的扩展性和可扩展性,是当前搜索引擎开发的重要组成部分。例如,著名的网络爬虫工具 Nutch 是用 Java 开发的,它基于 Apache Hadoop 数据结构,提供了良好的批处理支持。

  Java网页爬取涉及到大量的Java知识。本文将介绍网络爬虫需要了解的Java知识以及这些知识主要用于网络爬虫的哪个部分,包括以下内容:

  使用Maven

  什么是马文

  Maven 是 Apache 软件基金会提供的用于项目管理和自动化构建的工具。我们知道,在构建Java项目的时候,需要用到很多Jar包。例如,需要使用mysql-connector-java及其相关依赖来操作数据库。Maven工具可以方便的管理我们在项目中使用的开源Jar包,比如下载Java项目需要的Jar包以及相关的Java依赖包。

  如何使用 Maven

  Maven 使用存储在名为 pom.xml 的文件中的项目对象模型 (POM) 进行配置。以Java为例,我们可以在Eclipse中创建一个Maven项目。其中,Maven Dependencies 存放的是由 Maven 管理的 Jar 包。

  

  如前所述,构建 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包。

  

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

  

  log4j 的使用

  什么是 log4j

  log4j 是一个基于 Java 的日志记录工具,曾经是 Apache 软件基金会的一个项目。今天,日志是应用软件的一个组成部分。

  如何使用 log4j

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

  log4j log4j 1.2.17

  2. 在src目录下创建一个log4j.properties文本文件并进行配置(各个配置的具体含义,读者可以参考博文《Log4j详解》):

  ### set ###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} 方法:%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 。日志###log4j.appender.E=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.E.File=E://logs/error.log log4j.appender.E.Append=truelog4j.appender.E.Threshold=错误log4j.appender.E.layout = org.apache.log4j.PatternLayoutlog4j。

  3. 示例程序,如下:

  包 log4j;import mons.logging.Log;import mons.logging.LogFactory;public class Test { static final Log logger = LogFactory.getLog(Test.class); 公共静态 void main(String[] args) { System.out. println("你好"); (“你好世界”); logger.debug("这是调试信息。"); logger.warn("这是警告信息。"); logger.error("这是错误信息。"); "); }}

  基于这个程序,我们可以看到在我们项目的根目录下会生成一个日志文件error.log和log.log。

  

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

  对象创建

  在 Java 中,new 关键字通常用于创建对象。比如在爬取京东商品的id、product_name(商品名)、price(价格)时,我们需要将每个商品的信息封装成一个对象。

  JdInfoModel jingdongproduct = new JdInfoModel();

  在爬虫中,我们要操作JdInfoModel类中的变量(即id、product_name、price),可以通过私有变量来定义。并且,使用 set() 和 get() 方法设置数据(爬取数据的封装)和获取使用(爬取数据的存储)。以下代码用于 JdInfoModel 类:

  包模型;公共类 JdInfoModel { 私有 int id;私有字符串产品名称;私人双倍价格;public int getId() { 返回 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() { 返回价格;} public void setPrice(double price) { this.price = price; } }

  采集品的使用

  网络爬虫离不开对集合的操作,这涉及到对List、Set、Queue、Map等集合的操作。

  List 和 Set 集合的使用

  List 的特点是它的元素以线性方式存储,重复的对象可以存储在集合中。相比之下,Set 集合中的对象没有按特定方式排序,也没有重复的对象。在网络爬虫中,List 可用于存储要爬取的 URL 列表。例如:

  //创建List集合List urllist = new ArrayList();urllist.add("

  ");urllist.add("");//第一种遍历方法for(String url : urllist){ System.out.println(url);}//第二种遍历方法for(int i=0; i it = urllist.iterator();while (it.hasNext()){ System.out.println(it.next());}

  同时,我们也可以使用上面的List来封装具体的实例,也就是爬虫接收到的数据采集。Set集合的使用和List集合的用法类似,这里就不过多解释了。

  地图的使用

  Map 是映射键对象和值对象的集合。它的每个元素都收录一对键对象和值对象,其中键对象不能重复。地图不仅常用于网络爬虫,也常用于文本挖掘算法的编写。在网络爬虫中,可以使用 Map 过滤一些重复数据,但建议使用 Map 去重和过滤*敏*感*词*数据,因为 Map 有空间大小限制。例如,在使用网络爬虫抓取帖子时,您可能会遇到置顶帖子,并且置顶帖子可能会与以下帖子重复。以下程序是 Map 的一个用例:

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

  队列的使用

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

  queue queue = new LinkedList();//添加元素 queue.offer("

  ");queue.offer("");queue.offer("");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)):

  ///75975500" target="_blank">尊少是沉阳人

  后面会介绍解析工具jsoup,可以解析获取“

  ///75975500"。然后,您可以使用正则表达式提取75975500。

  字符串网址 = "

  ///75975500";String user_id = url.replaceAll("\\D", ""); //替换所有非数字字符 System.out.println(user_id); //输出结果为75975500

  下表显示了 Java 中常用的一些基本正则表达式。

  正则表达式书写的含义\d代表0-9之间的任意数字\D代表任意非数字字符\s代表空格类字符\S代表非空格类字符\p{Lower}代表小写字母[az ]\p{Upper} 代表大写字母 [AZ]\p{Alpha} 代表字母\p{Blank} 代表空格或制表符

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线