网络爬虫知识 day10

一、案例扩展

1.1 定时任务

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

        1)cron:cron表达式,指定任务在特定时间执行;

        2)fixedDelay:上一次任务执行完后多久再执行,参数类型为long,单位ms

        3)fixedDelayString:与fixedDelay含义一样,只是参数类型变为String

        4)fixedRate:按一定的频率执行任务,参数类型为long,单位ms

        5)fixedRateString: 与fixedRate的含义一样,只是将参数类型变为String

        6)initialDelay:延迟多久再第一次执行任务,参数类型为long,单位ms

        7)initialDelayString:与initialDelay的含义一样,只是将参数类型变为String

        8)zone:时区,默认为当前时区,一般没有用到

        注意:我们这里的使用比较简单,固定的间隔时间来启动爬虫。例如可以实现项目启动后,每隔一小时启动一次爬虫。但是有可能业务要求更高,并不是定时定期处理,而是在特定的时间进行处理,这个时候我们之前的使用方式就不能满足需求了。例如我要在工作日(周一到周五)的晚上八点执行。这时我们就需要Cron表达式了。

1.1.1 Cron表达式

        cron的表达式是字符串,实际上是由七子表达式,描述个别细节的时间表。

每一个字段都有一套可以指定有效值,如

        Seconds (秒)            :可以用数字0-59 表示,

        Minutes(分)            :可以用数字0-59 表示,

        Hours(时)                 :可以用数字0-23表示,

        Day-of-Month(天) :可以用数字1-31 中的任一一个值,但要注意一些特别的月份

        

        Month(月)               :可以用0-11 或用字符串:JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC

        

        Day-of-Week(天)   :可以用数字1-7表示(1 = 星期日)或用字符口串:

SUN, MON, TUE, WED, THU, FRI, SAT

     “/”:为特别单位,表示为“每”。如“0/15”表示每隔15分钟执行一次,“0”表示为从“0”分开始, “3/20”表示表示每隔20分钟执行一次,“3”表示从第3分钟开始执行

    “?”:表示每月的某一天,或第周的某一天

    “L”:用于每月,或每周,表示为每月的最后一天,或每个月的最后星期几如“6L”表示“每月的最后一个星期五”

       举例:  "0 0 12 ? * WED" 在每星期三下午12:00 执行,

     “*” 代表整个时间段

       可以使用CronExpBuilder(表达式生成器)生成表达式

1.1.2 Cron测试

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

        

        通过打印结果显示,它每隔5秒执行一次

1.2 网页去重

        之前我们对下载的url地址进行了去重操作,避免同样的url下载多次。其实不光url需要去重,我们对下载的内容也需要去重。

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

1.2.1 去重方案介绍

        (1)指纹码对比:

        最常见的去重方案是生成文档的指纹码。例如对一篇文章进行MD5加密生成一个字符串,我们可以认为这是文章的指纹码,再和其他的文章指纹码对比,一致则说明文章重复。

        但是这种方式是完全一致则是重复的,如果文章只是多了几个标点符号,那仍旧被认为是不重复的,这种方式并不合理。

        (2)BloomFilter

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

        (3)KMP算法

        KMP算法是一种改进的字符串匹配算法。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。能够找到两个文章有哪些是一样的,哪些不一样。

        这种方式能够解决前面两个方式的“只要一点不一样就是不重复”的问题。   但是它的时空复杂度太高了,不适合大数据量的重复比对。

        还有一些其他的去重方式:最长公共子串、后缀数组、字典树、DFA等等,但是这些方式的时空复杂度并不适合数据量较大的工业应用场景。我们需要找到一款性能高速度快,能够进行相似度对比的去重方案

        Google 的 simhash 算法产生的签名,可以满足上述要求。这个算法并不深奥,比较容易理解。这种算法也是目前Google搜索引擎所目前所使用的网页去重算法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小陈工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值