南航计网课设——基于Hadoop的网络爬虫技术

2024-01-28 22:30

本文主要是介绍南航计网课设——基于Hadoop的网络爬虫技术,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者:shmily

文章目录

    • 实验概述
    • 环境搭建
    • 分布式网络爬虫的工作原理
    • 分布式爬虫系统的结构设计
      • 网络爬虫
      • 倒排索引+中文分词
      • 用户搜索模拟
    • 心得体会

实验概述

本实验使用java语言编程,实现了利用分布式爬虫对CSDN社区(http://www.csdn.com)的爬取和搜索。

实现搜索引擎的思路大致分为三步:一、从网上爬取数据;二、对拿到的数据进行整理即分词;三、通过关键字匹配拿到数据。

涉及到的关键技术有:Hadoop 伪分布式环境搭建、正则表达式匹配、HTML语言解析、MapReduce及Lucene中文分词。

环境搭建

这次实验是运行在Linux操作系统(CentOS)上的工程,并在其上搭建了hadoop集群。hadoop采用2.8.5版本,并在做好Master,之后直接用Virtual Box的复制功能复制三份虚拟机后,修改一下每个机器的ip地址,即可得到其他三台slave机器。分配ip地址如下:

192.168.56.101 hp-master

192.168.56.102 hp-slave1

192.168.56.103 hp-slave2

192.168.56.104 hp-slave3

ping一下其他三个slave,都已ping通:

在这里插入图片描述

查看http://192.168.168.101:50070,在datanode里可以看到已经启动的4给node

在这里插入图片描述
到这里hadoop的集群环境就已经搭建好了。

分布式网络爬虫的工作原理

分布式网络爬虫可以看做是多个集中式网络爬虫系统组合而成,运行于机器集群之上的,集群中每一个节点都是一个集中式爬虫,其工作原理与集中式爬虫系统的工作原理相同。这些集中式爬虫在分布式爬虫系统中是由一个主节点控制来协同工作的。由于分布式爬虫系统要求多个节点协同工作,这样多个节点需要相互通信来交互信息,所以搭建分布式爬虫系统的关键是网络通信。因为,分布式爬虫系统可以利用多个节点抓取网页,所以,分布式爬虫系统的效率远远高于集中式爬虫系统。

分布式爬虫系统的体系结构有很多种,工作方式和存储方式也很多。但是,典型的分布式爬虫系统都采取主从方式的体系结构。即有一个主节点控制所有从节点执行抓取任务,这个主节点负责分配URL,保证集群中所有节点的负载均衡。另外,关于存储方式,比较流行的是将抓取的网页保存在分布式文件系统上,这样管理多个节点上的数据更加方便。通常情况下使用的分布式文件系统是都是基于Hadoop的HDFS系统。

分布式爬虫系统的结构设计

本实验的整体框架图如下:
在这里插入图片描述

其功能可大致分为三部分:网络爬虫部分、倒排索引+中文分词部分和用户搜索模拟部分。

网络爬虫

爬虫部分的功能是下载网页数据,为搜索引擎部分提供数据来源。实验中以CSDN网站的URL作为种子URL。网络爬虫系统以种子集合作为初始URL,开始数据的抓取。因为网页中含有链接信息,通过已有网页的 URL会得到一些新的 URL,可以把网页之间的指向结构视为一棵树,种子URL对应的网页是树的根节点。这样,爬虫系统就可以根据广度优先算法或者深度优先算法遍历所有的网页。

由于深度优先搜索算法可能会使爬虫系统陷入一个网站内部,不利于搜索比较靠近网站首页的网页信息,因此本实验采用广度优先搜索算法采集网页。爬虫系统首先将种子URL放入下载队列,然后简单地从队首取出一个URL,解析DNS得到主机ip地址,下载其对应的网页。得到网页的内容将其存储后,再经过解析网页中的链接信息可以得到一些新的URL,将这些URL加入下载队列。然后再取出一个URL,对其对应的网页进行下载,然后再解析,如此反复进行,直到遍历了整个网络或满足某个条件才会停止下来。

在这里插入图片描述

以上面的图为例,遍历路径:A-B-C-D-E-F-G-H-I.

具体实现:

1.建立一个队列对象,首先将传入的url存入代表未爬取的队列中,循环未爬取队列中所有url进行爬取,并将爬取的url转移到代表已爬取的队列中。使用HttpURLConnection获得页面信息,使用正则表达式从页面信息中所需的信息输出到文件中,并将从页面信息中匹配到的超链接存入代表未爬取的队列中,实现垂直爬取数据。

2.通过模拟浏览器,去访问网站,如果返回的code为200,说明访问成功,就可以将这个网页的数据进行下载。

3.拿到爬取后的数据,即将网页转化成一个String的形式,存下来了。然后通过正则表达式,选取我们所需要的标签,这里取的是a标签,这里会对a标签进行过滤和分组,只取到有连接的,在写正则时写多个分组,有利于后面拿到,标题,跟对应的地址。

4.拿到标题跟地址后,将地址中的“/”等进行替换,因为后面要将地址作为文件的名字,标题作为内容存到HDFS中。

源码分析:(以注释的形式体现)

所用到的包:

在这里插入图片描述

一、LinkCollection,建立url的队列:

URL的一般语法格式为:protocol 😕/ hostname[:port] / path / [;parameters][?query]#fragment,本实验中protocol均为http协议。

package com.ls.spider;import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;/***当爬到一个超链接后,将其加入到队列中,接着爬这个超链接,并将这个超链接放入标示已查的队列中***/
public class LinkCollection {//待访问url的集合:队列private List<String> unVisitedUrls=Collections.synchronizedList(new ArrayList<String>());private Set<String> visitedUrls=Collections.synchronizedSet(new HashSet<String>());/**************入队操作***************/public void addUnVisitedUrl(String url){if(url!=null&&!"".equals(url.trim())&&!visitedUrls.contains(url)&&!unVisitedUrls.contains(url)){unVisitedUrls.add(url);}}/***************出队****************/public String deQueueUnVisitedUrl(){if(unVisitedUrls.size()>0){String url=unVisitedUrls.remove(0);visitedUrls.add(url);return url;}return null;}/**********判断队列是否为空************/public boolean isUnVisitedUrisEmpty(){if(unVisitedUrls!=null&&!"".equals(unVisitedUrls)){return false;}else{return true;}}/***********hadoop出队**********/public String deQueueVisitedUrl(){if(visitedUrls.iterator().hasNext()){String url=visitedUrls.iterator().next();visitedUrls.remove(0);return url;}return null;}/***********判断Visited队列是否为空**********/public boolean isVisitedUrisEmpty(){if(visitedUrls!=null&&!"".equals(visitedUrls)){return false;}else{return true;}}
}

二、DownLoadTool,下载页面

package com.ls.spider;import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.net.HttpURLConnection;  //发送请求到网页
import java.net.MalformedURLException;
import java.net.URL;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
import java.util.Scanner;/***************下载页面******************/
public class DownLoadTool {private static String encoding="GBK";//下载的文件保存的位置private String savePath=System.getProperty("user.dir")+File.separator;/******自动生成保存的目录目录名的命名规范:myproject******/public static File createSaveDirectory(){DateFormat df=new SimpleDateFormat("myproject");String directoryName=df.format(new Date());return createSaveDirectory(directoryName);}public static File createSaveDirectory(String directoryName) {File file=new File(directoryName);if(!file.exists()){file.mkdirs();}return file;}/***************下载页面的内容**************/static String downLoadUrl(String addr){StringBuffer sb=new StringBuffer();try {URL url=new URL(addr);HttpURLConnection con=(HttpURLConnection) url.openConnection();con.setConnectTimeout(5000);con.connect();//产生文件名Random r=new Random();try {Thread.sleep(r.nextInt(2000));} catch (InterruptedException e) {e.printStackTrace();}System.out.println(con.getResponseCode());System.out.println(con.getHeaderFields());if(con.getResponseCode()==200){BufferedInputStream bis=new BufferedInputStream(con.

这篇关于南航计网课设——基于Hadoop的网络爬虫技术的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/654978

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

SpringBoot使用OkHttp完成高效网络请求详解

《SpringBoot使用OkHttp完成高效网络请求详解》OkHttp是一个高效的HTTP客户端,支持同步和异步请求,且具备自动处理cookie、缓存和连接池等高级功能,下面我们来看看SpringB... 目录一、OkHttp 简介二、在 Spring Boot 中集成 OkHttp三、封装 OkHttp

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)

《Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)》本文介绍了如何使用Python和Selenium结合ddddocr库实现图片验证码的识别和点击功能,感兴趣的朋友一起看... 目录1.获取图片2.目标识别3.背景坐标识别3.1 ddddocr3.2 打码平台4.坐标点击5.图

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为