网络爬虫知识 day07

三、案例开发分析

        我们已经学完了WebMagic的基本使用方法,现在准备使用WebMagic实现爬取数据的功能。这里是一个比较完整的实现。

        在这里我们实现的是聚焦网络爬虫,只爬取招聘的相关数据。

3.1 业务分析

        今天要实现的是爬取https://www.51job.com/上的招聘信息。只爬取“计算机软件”和“互联网电子商务”两个行业的信息。

        首先访问页面并搜索两个行业。结果如下:

        点击职位详情页,我们分析发现详情页还有一些数据需要抓取:职位、公司名称、工作地点、薪资、发布时间、职位信息、公司联系方式、公司信息

3.2 数据库表

        根据以上信息,设计数据库表

CREATE TABLE `job_info` (

  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',

  `company_name` varchar(100) DEFAULT NULL COMMENT '公司名称',

  `company_addr` varchar(200) DEFAULT NULL COMMENT '公司联系方式',

  `company_info` text COMMENT '公司信息',

  `job_name` varchar(100) DEFAULT NULL COMMENT '职位名称',

  `job_addr` varchar(50) DEFAULT NULL COMMENT '工作地点',

  `job_info` text COMMENT '职位信息',

  `salary_min` int(10) DEFAULT NULL COMMENT '薪资范围,最小',

  `salary_max` int(10) DEFAULT NULL COMMENT '薪资范围,最大',

  `url` varchar(150) DEFAULT NULL COMMENT '招聘信息详情页',

  `time` varchar(10) DEFAULT NULL COMMENT '职位最近发布时间',

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='招聘信息';

3.3 实现流程

        我们需要解析职位列表页,获取职位的详情页,再解析页面获取数据。

获取url地址的流程如下:

        

        但是在这里有个问题:在解析页面的时候,很可能会解析出相同的url地址(例如商品标题和商品图片超链接,而且url一样),如果不进行处理,同样的url会解析处理多次,浪费资源。所以我们需要有一个url去重的功能

3.3.1 Scheduler组件

        WebMagic提供了Scheduler可以帮助我们解决以上问题。

        Scheduler是WebMagic中进行URL管理的组件。一般来说,Scheduler包括两个作用:

        * 对待抓取的URL队列进行管理。

        * 对已抓取的URL进行去重。

        WebMagic内置了几个常用的Scheduler。如果你只是在本地执行规模比较小的爬虫,那么基本无需定制Scheduler,但是了解一下已经提供的几个Scheduler还是有意义的。

        去重部分被单独抽象成了一个接口:DuplicateRemover,从而可以为同一个Scheduler选择不同的去重方式,以适应不同的需要,目前提供了两种去重方式。

        RedisScheduler是使用Redis的set进行去重,其他的Scheduler默认都使用HashSetDuplicateRemover来进行去重。

        如果要使用BloomFilter,必须要加入以下依赖:

        <!--WebMagic对布隆过滤器的支持-->

        <dependency>

            <groupId>com.google.guava</groupId>

            <artifactId>guava</artifactId>

            <version>16.0</version>

        </dependency>

        修改代码,添加布隆过滤器

3.3.2 三种去重方式

        * HashSet

        使用java中的HashSet不能重复的特点去重。优点是容易理解。使用方便。

        缺点:占用内存大,性能较低。

        * Redis去重

       使用Redis的set进行去重。优点是速度快(Redis本身速度就很快),而且去重不会占用爬虫服务器的资源,可以处理更大数据量的数据爬取。

        缺点:需要准备Redis服务器,增加开发和使用成本。

        * 布隆过滤器(BloomFilter)

        使用布隆过滤器也可以实现去重。优点是占用的内存要比使用HashSet要小的多,也适合大量数据的去重操作。

        缺点:有误判的可能。没有重复可能会判定重复,但是重复数据一定会判定重复。

3.3.3 布隆过滤器 (Bloom Filter)

        布隆过滤器是一种space efficient的概率型数据结构,用于判断一个元素是否在集合中。在垃圾邮件过滤的黑白名单方法、爬虫(Crawler)的网址判重模块中等等经常被用到。

        哈希表也能用于判断元素是否在集合中,但是布隆过滤器只需要哈希表的1/8或1/4的空间复杂度就能完成同样的问题。布隆过滤器可以插入元素,但不可以删除已有元素。其中的元素越多,误报率越大,但是漏报是不可能的。

        原理:

        布隆过滤器需要的是一个位数组(和位图类似)和K个映射函数(和Hash表类似),在初始状态时,对于长度为m的位数组array,它的所有位被置0。

        

        对于有n个元素的集合S={S1,S2...Sn},通过k个映射函数{f1,f2,......fk},将集合S中的每个元素Sj(1<=j<=n)映射为K个值{g1,g2...gk},然后再将位数组array中相对应的array[g1],array[g2]......array[gk]置为1:

        

        如果要查找某个元素item是否在S中,则通过映射函数{f1,f2,...fk}得到k个值{g1,g2...gk},然后再判断array[g1],array[g2]...array[gk]是否都为1,若全为1,则item在S中,否则item不在S中。

        布隆过滤器会造成一定的误判,因为集合中的若干个元素通过映射之后得到的数值恰巧包括g1,g2,...gk,在这种情况下可能会造成误判,但是概率很小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小陈工

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

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

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

打赏作者

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

抵扣说明:

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

余额充值