栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 前沿技术 > 大数据 > 大数据系统

三天学会网络爬虫之Day03

三天学会网络爬虫之Day03

三天学会网络爬虫之Day03

第一章 课程计划第二章 案例扩展

2.1.定时任务。

2.1.1.Cron表达式2.1.2.Cron测试 2.2.网页去重

2.2.1.去重方案介绍2.2.2. SimHash

2.2.2.1.流程介绍2.2.2.2.签名距离计算2.2.2.3.导入simhash 工程 2.3.代理的使思

2.3.1.代理服务器2.3.1.使用代理 第三章 ElasticSearch环境准备

3.1.安装ElasticSearch服务3.2.安装ES的图形化界面插件.3.3.安装IK分词器

第一章 课程计划

1.案例扩展
a)定时任务,
b)网页去重。
c)代理的使用。
2.Elastic环境准备
3. Spring Data ElasticSearch 回顾
a)完成ES基本使用。
b)完成复杂查询。
4.查询案例实现

第二章 案例扩展 2.1.定时任务。

在案例中我们使用的是spring 内置的Spring Task,这是Spring3.0加入的定时任务功能。我们使用注解的方式定时启动爬虫进行数据爬取。
我们使用的是@Scheduled注解,其属性如下:

    cron: cron表达式,指定任务在特定时间执行;fixedDelay:上一次任务执行完后多久再执行,参数类型为long,单位 ms.
    3 ) fixedDelayString: 与fixedDelay含义一样,只是参数类型变为string-.fixedRate:按一定的频率执行任务,参数类型为long,单位 msfixedRateString: 与fixedRate的含义一样,只是将参数类型变为stringinitialDelay:延迟多久再第一次执行任务,参数类型为 long,单位 msinitialDelayString:与initialDelay的含义一样,只是将参数类型变为string.zone:时区,默认为当前时区,一般没有用到.
    我们这里的使用比较简单,固定的间隔时间来启动爬虫。例如可以实现项目启动后,每隔一小时启动一次爬虫。但是有可能业务要求更高,并不是定时定期处理,而是在特定的时间进行处理,这个时候我们之前的使用方式就不能满足需求了。例如我要在工作日(周一到周五)的晚上八点执行。这时我们就需要Cron表达式了。
2.1.1.Cron表达式

Cron 的表达式是字符串,实际上是由七子表达式,描述个别细节的时间表。这些子表达式是分开的空白,代表:

    SecondsMinutesHourseDay-of-MontheMonthDay-of-WeekYear (可选字段)
    例"0012 ? * WED”在每星期三下午12:00执行, “*”代表整个时间段s
    每一个字段都有一套可以指定有效值,如
    Seconds (秒):可以用数字0-59表示,
    Minutes(分):可以用数字0—59表示,
    Hours(时):可以用数字0-23表示,
    Day-of-Month(天):可以用数字1-31中的任一一个值,但要注意一些特别的月份·
    Month(月):可以用0-11或用字符串:JAN,IFEB,MAR,APR,MAY, JUN,JUL,AUG,SEP, OCT, NOV,DEC u
    Day-of-Week(天):可以用数字1-7表示(1=星期日)或用字符口串:SUN,MON,TUE, WED,THU, FRI,SATv
    “/”:为特别单位,表示为“每”如“0/15”表示每隔15分钟执行一次,“0”表示为从“0”分开始,“3/20”表示表示每隔20 分钟执行一次,“3”表示从第3分钟开始执行
    “?”:表示每月的某一天,或第周的某一天
    “L”:用于每月,或每周,表示为每月的最后一天,或每个月的最后星期几如“6L”表示“每月的最后一个星期五”‘
2.1.2.Cron测试

先把之前爬虫的@Component注解取消,避免干扰测试

/ / @component
public class JobProcessor implements PageProcessor {

编写使用cron表达式的测试用例:

@component
public class TaskTest { 
@scheduled( cron = "0/5* **﹐米﹐*")
public void test() {
system.out.println(LocalDateTime.now()+"任务执行了");
}
2.2.网页去重

之前我们对下载的url地址进行了去重操作,避免同样的url下载多次。其实不光url需要去重,我们对下载的内容也需要去重。
在网上我们可以找到许多内容相似的文章。但是实际我们只需要其中一个即可,同样的内容没有必要下载多次,那么如何进行去重就需要进行处理了。

2.2.1.去重方案介绍

指纹码对比
最常见的去重方案是生成文档的指纹门。例如对一篇文章进行MD5加密生成一个字符串,我们可以认为这是文章的指纹码,再和其他的文章指纹码对比,一致则说明文章重复。但是这种方式是完全一致则是重复的,如果文章只是多了几个标点符号,那仍旧被认为是重复的,这种方式并不合理。

BloomFilterv
这种方式就是我们之前对url进行去重的方式,使用在这里的话,也是对文章进行计算得到一个数,再进行对比,缺点和方法1是一样的,如果只有一点点不一样,也会认为不重复,这种方式不合理。

KMP算法
KMP算法是一种改进的字符串匹配算法。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。能够找到两个文章有哪些是一样的,哪些不一样。
这种方式能够解决前面两个方式的“只要一点不一样就是不重复”的问题。但是它的时空复杂度太高了,不适合大数据量的重复比对。
还有一些其他的去重方式:最长公共子串、后缀数组、字典树、DFA等等,但是这些方式的空复杂度并不适合数据量较大的工业应用场景。我们需要找到一款性能高速度快,能够进行相似度对比的去重方案;
Google 的 simhash算法产生的签名,可以满足上述要求。这个算法并不深奥,比较容易理解。这种算法也是目前Google搜索引擎所目前所使用的网页去重算法。

2.2.2. SimHash 2.2.2.1.流程介绍

simhash是由 Charikar在2002年提出来的,为了便于理解尽量不使用数学公式,分为这几步:
1、分词,把需要判断文本分词形成这个文章的特征单词。
2、hash,通过 hash算法把每个词变成hash值,比如“美国”通过hash算法计算为100101,“51区”通过hash算法计算为101011。这样我们的字符串就变成了一串串数字。
3、加权,通过2步骤的 hash 生成结果,需要按照单词的权重形成加权数字串,“美国”的 hash值为“100101”,通过加权计算为“4-4-4 4-4 4” “51区”计算为“5-55-555”。
4、合并,把上面各个单词算出来的序列值累加,变成只有一个序列串。“美国”的“4 -4-44-4 4”,“51区”的“ 5-55-555”.
5、降维,把算出来的“9-91-119”变成01串,形成最终的simhash签名。


2.2.2.2.签名距离计算

我们把库里的文木都转换为simhash签名,并转换为long类型存储,空间大大减少。现在我们虽然解决了空间,但是如何计算两个simhash的相似度呢?,
我们通过海明距离(Hamming distance)就可以计算出两个 simhash到底相似不相似。两个simhash对应二进制(01串)取值不同的数量称为这两个simhash的海明距离。
举例如下:10101和 00110 从第一位开始依次有第一位、第四、第五位不同,则海明距离为3。对于二进制字符串的a和 b,海明距离为等于在a xOR b运算结果中1的个数(普遍算法)。

2.2.2.3.导入simhash 工程

这个算法使用creekLou实现的功能进行使用。
这个项目不能直接使用,因为 jar包的问题,需要进行改造。这里已经改造好的。
导入工程simhash,并打开测试用例。

2.3.代理的使思

有些网站不允许爬虫进行数据爬取,因为会加大服务器的压力。其中一种最有效的方式是通过ip+时间进行鉴别,因为正常人不可能短时间开启太多的页面,发起太多的请求。
我们使用的WebMagic可以很方便的设置爬取数据的时间(参考第二天的的3.1.爬虫的配置、启动和终止)。但是这样会大大降低我们爬取数据的效率,如果不小心ip 被禁了,会让我们无法爬去数据,那么我们就有必要使用代理服务器来爬取数据。

2.3.1.代理服务器

代理(英语: Proxy),也称网络代理,是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。
提供代理服务的电脑系统或其它类型的网络终端称为代理服务器(英文:ProxyServer)。一个完整的代理请求过程为:客户端首先与代理服务器创建连接,接着根据代理服务器所使用的代理协议,请求对目标服务器创建连接、或者获得目标服务器的指定资源。

我们就需要知道代理服务器在哪里( ip和端口号)才可以使用。网上有很多代理服务器的提供商,但是大多是免费的不好用,付费的还行。

2.3.1.使用代理

WebMagic使用的代理APIProxyProvider。因为相对于site 的“配置”,ProxyProvider定位更多是1个“组件”,所以代理不再从 site设置,而是由HttpClientDownloader 设置。

ProxyProvider有一个默认实现:SimpleProxyProvider。它是一个基于简单Round-Robin的、没有失败检查的ProxyProvider。可以配置任意个候选代理,每次会按顺序挑选一个代理使用。它适合用在自己搭建的比较稳定的代理的场景。
如果需要根据实际使用情况对代理服务器进行管理(例如校验是否可用,定期清理、添加代理服务器等),只需要自己实现APIProxyProvider即可。

第三章 ElasticSearch环境准备 3.1.安装ElasticSearch服务

启动服务:

当出现以下内容表示启动完成

访问地址是 http://127.0.0.1:9200访问该地址:

表示ElasticSearch安装启动完成

3.2.安装ES的图形化界面插件.

安装ElasticSearch 的 head插件,完成图形化界面的效果,完成索引数据的查看。采用本地安装方式进行head插件的安装。elasticsearch-5-*以上版本安装head需要安装node和 grunt。
1)安装head插件。
将head 压缩包解压到任意目录,但是要和 elasticsearch的安装目录区别开。
2)安装nodejs
3)将grunt安装为全局命令,Grunt是基于Node.js 的项目构建工具
在cmd控制台中输入如下执行命令:

npm install -g grunt-cli

效果如下:

ps:如果安装不成功或者安装速度慢,可以使用淘宝的镜像进行安装:
npm install -g cnpm -registry=https://registry.npm.taobao.org
后续使用的时候,只需要把npm xxx换成cnpm xxx即可
4)修改elasticsearcb配置文件: elasticsearch.yml,增加以下三句命令:

http.cors.enabled: true
http.cors.allow-origin: "*"
network.host: 127.0.0.1

5)进入head目录启动head,在命令提示符下输入命令:
grunt server根据提示访问,效果如下:

PS:如果第5步失败,执行以下命令

npm install grunt

3.3.安装IK分词器

1.lK分词器安装包
2.解压,将解压后的elasticsearch文件夹拷贝到elasticsearch-5.6.8plugins 下,并重命名文件夹为ik

3.重新启动ElasticSearch,即可加载IK分词器
4.测试
在浏览器发起以下请求
1)最小切分:在浏览器地址栏输入地址
http://127.0.0.1:9200/_analyze?analyzer=ik_smart&pretty=true&text=我是程序员
浏览器显示

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/729267.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号