三天学会网络爬虫之Day03

406次阅读
没有评论

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

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

  • Seconds
  • Minutes
  • Hourse
  • Day-of-Monthe
  • Month
  • Day-of-Week
  • Year (可选字段)
    例"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签名。
    三天学会网络爬虫之Day03
    三天学会网络爬虫之Day03
    三天学会网络爬虫之Day03

    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,并打开测试用例。
    三天学会网络爬虫之Day03

    2.3.代理的使思

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

    2.3.1.代理服务器

    代理(英语: Proxy),也称网络代理,是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。
    提供代理服务的电脑系统或其它类型的网络终端称为代理服务器(英文:ProxyServer)。一个完整的代理请求过程为:客户端首先与代理服务器创建连接,接着根据代理服务器所使用的代理协议,请求对目标服务器创建连接、或者获得目标服务器的指定资源。
    三天学会网络爬虫之Day03
    我们就需要知道代理服务器在哪里( ip和端口号)才可以使用。网上有很多代理服务器的提供商,但是大多是免费的不好用,付费的还行。

    2.3.1.使用代理

    WebMagic使用的代理APIProxyProvider。因为相对于site 的“配置”,ProxyProvider定位更多是1个“组件”,所以代理不再从 site设置,而是由HttpClientDownloader 设置。
    三天学会网络爬虫之Day03
    ProxyProvider有一个默认实现:SimpleProxyProvider。它是一个基于简单Round-Robin的、没有失败检查的ProxyProvider。可以配置任意个候选代理,每次会按顺序挑选一个代理使用。它适合用在自己搭建的比较稳定的代理的场景。
    如果需要根据实际使用情况对代理服务器进行管理(例如校验是否可用,定期清理、添加代理服务器等),只需要自己实现APIProxyProvider即可。
    三天学会网络爬虫之Day03

    第三章 ElasticSearch环境准备

    3.1.安装ElasticSearch服务

    启动服务:
    三天学会网络爬虫之Day03
    当出现以下内容表示启动完成
    三天学会网络爬虫之Day03
    访问地址是 http://127.0.0.1:9200访问该地址:
    三天学会网络爬虫之Day03
    表示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 gruntcli

    效果如下:
    三天学会网络爬虫之Day03
    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.alloworigin: "*" network.host: 127.0.0.1

    5)进入head目录启动head,在命令提示符下输入命令:
    grunt server三天学会网络爬虫之Day03根据提示访问,效果如下:
    三天学会网络爬虫之Day03
    PS:如果第5步失败,执行以下命令

    npm install grunt

    三天学会网络爬虫之Day03

    3.3.安装IK分词器

    1.lK分词器安装包
    2.解压,将解压后的elasticsearch文件夹拷贝到elasticsearch-5.6.8\plugins 下,并重命名文件夹为ik
    三天学会网络爬虫之Day03
    3.重新启动ElasticSearch,即可加载IK分词器
    4.测试
    在浏览器发起以下请求
    1)最小切分:在浏览器地址栏输入地址
    http://127.0.0.1:9200/_analyze?analyzer=ik_smart&pretty=true&text=我是程序员
    浏览器显示
    三天学会网络爬虫之Day03

    神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试

    相关文章:

    版权声明:Python教程2022-10-27发表,共计4937字。
    新手QQ群:570568346,欢迎进群讨论 Python51学习