增量式爬虫

落爺英雄遲暮 提交于 2020-01-07 01:07:13

我们今天来说一个增量式爬虫

相信有很多的同学不太理解为什么要用增量式爬虫 增量式爬虫有什么样的作用 今天我就来为大家絮叨絮叨

增量式爬虫的意义是为了精准的拿到你想要的数据,好比说我们现在需要爬取某某网站,它的数据呢是实时更新的,我能只想要没有爬取过的数据怎么办呢,我们需要第3方库来帮助我们,我个人用的是redis数据库,我们可以对url进行比对,也可以对数据进行比对,这个根据需求来定制。
首先创建scrapy框架:

scrapy startproject ***
cd ***
scrapy genspider *** baidu.com

这样我们的scrapy框架就创建完了,我们现在步入正轨,这个例子是以字段内容为比较对象的小例子

import scrapy
from ..items import LxhItem
from redis import Redis
import hashlib


class XhSpider(scrapy.Spider):
    name = 'xh'
    # allowed_domains = ['baidu.com']
    start_urls = ['http://xiaohua.zol.com.cn/zhengren/']      #定义要爬取的url
    conn = Redis()      #实例化redis

    def parse(self, response):
        li_list = response.xpath('//li[@class="article-summary"]')
        for li in li_list:
            title = li.xpath('./span[2]/a/text()').extract_first()    #爬取的字段
            content = li.xpath('./div[2]/text()').extract_first()    #爬取的字段
            fp = hashlib.md5(content.encode('utf-8')).hexdigest()        #加工为数据指纹
            ret = self.conn.sadd('fp', fp)     #存入redis数据库
            if ret:                              #进行比较
                print('正在爬取数据!!!!!!!!!!!!11')
                yield LxhItem(title=title, content=content)         #如果没有爬取此条信息就存入mongdb库中
            else:
                print('数据存在, 跳过@@@@@@@@@@@')      
                continue     #如果爬取此条信息就跳过本次循环

这个例子是以个别的url为比较对象的小例子

import scrapy
from redis import Redis
from ..items import ZlsItem


class ZlSpider(scrapy.Spider):
    name = 'zl'
    # allowed_domains = ['baidu.com']
    start_urls = ['https://www.4567tv.tv/frim/index9.html']        #定义要爬取的url
    conn = Redis()

    def detail_parse(self, response):
        title = response.xpath('/html/body/div[1]/div/div/div/div[2]/h1/text()').extract_first()
        yield ZlsItem(title=title)

    def parse(self, response):
        durl = response.xpath('//div[@class="stui-vodlist__box"]/a/@href').extract()
        for url in durl:
            ret = self.conn.sadd('mv', url)
            if ret:       #判断是否有这条信息
                print('有数据更新, 正在爬取!!!!!!')
                yield scrapy.Request(url='https://www.4567tv.tv'+url, callback=self.detail_parse)      #回调
            else:
                print('爬过来, pass掉')
                continue

如果觉得对你有帮助,可以私信我,我们可以交流。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!