Scrapy爬虫框架实现增量式(数据更新)数据抓取 借助redis的set类型

Scrapy爬虫框架实现增量式(数据更新)数据抓取 借助redis的set类型

借助redis的set实现增量式爬虫。增量式意思就是监测网站数据更新情况,爬取最新更新出来的数据,核心就是去重。这里我们只通过redis的set集合来实现。

实现增量:
—-对爬取数据的url进行监测,使用一个记录表存储爬取过的数据的url,但凡记录表中存有的url,说明url对应数据已经爬取过了,否则表示没有爬取过为新数据。
 
—-记录表:
redis的set集合充当记录表,自带去重功能。
插入成功为会返回1,失败输入的数据已经存在,返回0。

以:https://www.4567kan.com/frim/index1.html 这个网站作为演示,主要学习如何实现增量式,数据暂且先不考虑。这里通过CrawlSpider进行翻页,详情页数据使用parse_detail方法来处理。把详情页的url存放到记录表,也就是redis的set集合中去:

# -*- coding: utf-8 -*-
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from redis import StrictRedis
class MeiziSpider(CrawlSpider):
    name = 'meizi'
    start_urls = ['https://www.4567kan.com/frim/index1.html']
    # 创建reids链接对象
    client=StrictRedis(host='127.0.0.1',port=6379)
    rules = (
        # 寻找翻页的url地址,我们不需要拼接url,需要继续跟进
        Rule(LinkExtractor(allow=r'/frim/index1-\d+\.html'),callback='parse_item', follow=True),
    )
    # 解析详情页url 电影标题
    def parse_item(self, response):
        ul_list=response.xpath('//ul[@class="stui-vodlist clearfix"]/li')
        item={}
        for li in ul_list:
           item['title']=li.xpath('./div/a/@title').extract_first()
           item['href']="https://www.4567kan.com/"+li.xpath('./div/a/@href').extract_first()
           excu=self.client.sadd('move_url',item['href'])
           if excu==1:
               print('该条数据没有爬取过,正在爬取....')
               yield scrapy.Request(item['href'],callback=self.parse_detail,meta={"item":item})
           else:
               print('该条数据已经爬取过了...')
    def parse_detail(self,response):
        item=response.meta['item']
        p_list=response.xpath('//div[@class="stui-content__detail"]')
        for p in p_list:
            item['move_type']="".join(p.xpath('./p[1]//text()').extract())
            item['content']="".join(p.xpath('./p[5]//text()').extract())
            print (item)

如果想将item也存储到reids中,可以在parse_detail方法中yield item,然后开启管道

class Myspider1Pipeline:

    def process_item(self, item, spider):
        client=spider.client # 获取redis的链接对象
        client.lpush('moveData',item) # 将item添加到list中
        return item
分享到 :

发表评论

登录... 后才能评论