Python爬虫从入门到精通:(39)增量式爬虫_Python涛哥

45 篇文章 18 订阅

概念

检测网络数据更新的情况,以便于爬取到最新更新出来的数据

实现核心

去重

实战中去重的方式

记录表

记录表需要记录什么?记录的一定是爬取过的相关信息。

例如某电影网:

  • 爬取过的相关信息:每一部电影详情页的url
  • 只需要使用某一组数据,该组数据如果可以作为该部电影的唯一标识即可,刚好电影详情页的url就可以作为电影的唯一标识。

只要可以标识电影唯一标识的数据我们可以统称位数据指纹

去重的方式对应的记录表

  • python中的set集合(不可以)

    set集合无法持久化存储

  • redis中的set可以的

    可以持久化存储


代码案例

zls.py

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from redis import Redis
from zlsPro.items import ZlsproItem


class ZlsSpider(CrawlSpider):
    name = 'zls'
    # allowed_domains = ['www.xxx.com']
    start_urls = ['http://www.4567kp.com/frim/index1.html']
    coon = Redis(host='127.0.0.1', port=6379)
    rules = (
        Rule(LinkExtractor(allow=r'frim/index1-\d+\.html'), callback='parse_item', follow=False),
    )

    def parse_item(self, response):
        li_list = response.xpath('/html/body/div[1]/div/div/div/div[2]/ul/li')
        for li in li_list:
            title = li.xpath('./div/div/h4/a/text()').extract_first()
            detail_url = 'http://www.4567kp.com' + li.xpath('./div/div/h4/a/@href').extract_first()

            ex = self.coon.sadd('movie_urls', detail_url)
            # ex==1插入成功,ex==0插入失败
            if ex == 1:  # detail_url表示的电影没有存在于记录表中
                # 爬取电影数据:发起请求
                print('有新数据更新,正在爬取新数据....')
                item = ZlsproItem()
                item['title'] = title
                yield scrapy.Request(url=detail_url, callback=self.parse_detail, meta={'item': item})
            else:  # 存在于记录表中
                print('暂无数据更新!')

    def parse_detail(self, response):
        # 解析电影简介
        desc = response.xpath('/html/body/div[1]/div/div/div/div[2]/p[5]/span[2]/text()').extract_first()
        item = response.meta['item']
        item['desc'] = desc

        yield item

pipeline.py

class ZlsproPipeline:
    def process_item(self, item, spider):
        coon=spider.coon #redis的连接对象
        coon.lpush('movieDate',item)
        return item

items.py

import scrapy

class ZlsproItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    desc = scrapy.Field()

数据指纹一般是经过加密的

上述案例的数据指纹没有必要加密。

什么情况数据指纹需要加密?

  • 如果数据的唯一标识标识的内容数据量比较大,可以使用hash将数据加密成32位密文。
  • 目的是为了节省空间。

关注Python涛哥!学习更多Python知识!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值