scrapyフレームワークに基づくインクリメンタル爬虫類

2104 ワード

インクリメンタル
  • コンセプト:Webサイトのデータ更新を検出します.最新更新されたデータを取得します.
  • コア:重量除去
  • レコードテーブル:ストレージの永続化が必要です.redis中set
  • 這い出した情報を記録する
  • 爬取した映画詳細ページのurl:対応するのは深さ爬取
  • データフィンガープリント:対応する非深さ登り(1ページのデータ更新)
  • データフィンガープリント:データのセットの一意の識別


  • コード実装:
    # -*- coding: utf-8 -*-
    import scrapy
    from scrapy.linkextractors import LinkExtractor
    from scrapy.spiders import CrawlSpider, Rule
    from redis import Redis
    from moviePro.items import MovieproItem
    class MovieSpider(CrawlSpider):
        name = 'movie'
        # allowed_domains = ['www.xxx.com']
        start_urls = ['https://www.4567tv.tv/frim/index1.html']
    
        conn = Redis(host='127.0.0.1',port=6379)
    
        link = LinkExtractor(allow=r'frim/index1-\d+\.html')#      
        rules = (
            Rule(link, callback='parse_item', follow=False),
        )
    
        def parse_item(self, response):
            #    +    url
            li_list = response.xpath('/html/body/div[1]/div/div/div/div[2]/ul/li')
            for li in li_list:
                name = li.xpath('./div/a/@title').extract_first()
                item = MovieproItem()
                item['name'] = name
                detail_url = 'https://www.4567tv.tv'+li.xpath('./div/a/@href').extract_first()
                ex = self.conn.sadd('movie_record',detail_url)
    
                if ex == 1:#               
                    print('        !!!!!!')
                    yield scrapy.Request(url=detail_url,callback=self.parse_detail,meta={'item':item})
                else:
                    print('        ......')
    
        def parse_detail(self,response):
            item = response.meta['item']
            desc = response.xpath('/html/body/div[1]/div/div/div/div[2]/p[5]/span[2]/text()').extract_first()
            item['desc'] = desc
            yield item
    pipelines.pyファイルのコード:
    class MovieproPipeline(object):
        def process_item(self, item, spider):
            conn = spider.conn
            conn.lpush('movieData',item)
            return item