南航计网课设——基于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

相关文章

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

hadoop开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。 开启回收站功能参数说明 (1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。 (2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

ASIO网络调试助手之一:简介

多年前,写过几篇《Boost.Asio C++网络编程》的学习文章,一直没机会实践。最近项目中用到了Asio,于是抽空写了个网络调试助手。 开发环境: Win10 Qt5.12.6 + Asio(standalone) + spdlog 支持协议: UDP + TCP Client + TCP Server 独立的Asio(http://www.think-async.com)只包含了头文件,不依

poj 3181 网络流,建图。

题意: 农夫约翰为他的牛准备了F种食物和D种饮料。 每头牛都有各自喜欢的食物和饮料,而每种食物和饮料都只能分配给一头牛。 问最多能有多少头牛可以同时得到喜欢的食物和饮料。 解析: 由于要同时得到喜欢的食物和饮料,所以网络流建图的时候要把牛拆点了。 如下建图: s -> 食物 -> 牛1 -> 牛2 -> 饮料 -> t 所以分配一下点: s  =  0, 牛1= 1~

poj 3068 有流量限制的最小费用网络流

题意: m条有向边连接了n个仓库,每条边都有一定费用。 将两种危险品从0运到n-1,除了起点和终点外,危险品不能放在一起,也不能走相同的路径。 求最小的费用是多少。 解析: 抽象出一个源点s一个汇点t,源点与0相连,费用为0,容量为2。 汇点与n - 1相连,费用为0,容量为2。 每条边之间也相连,费用为每条边的费用,容量为1。 建图完毕之后,求一条流量为2的最小费用流就行了