Scrapyはインクリメンタルクローラー用のredisを組み合わせています

インクリメンタルクローラー:名前が示すように、以前にクロールされたクローラーはクロールされず、クロールされていないクローラーはクロールされます。
要件:https
//www.4567kan.com/Analysisでアクションムービーのタイトルと紹介をクロールします:URLを指定し、プロジェクトを作成し、プロジェクトにcdして、クローラーファイルを作成し、リンクエクストラクターがページ番号リンクを抽出し、ルールパーサーがルールを実行します調合、データ分析、永続ストレージは実際には同じです。重要なのは、更新されたムービーのみをクロールする方法です。

コア:映画の詳細ページのURLが以前にクロールされているかどうかをチェック
ストアのURLクロール映画の詳細ページ
Redisの一連のデータ構造(自動重複排除)で
ログインした後にクライアントに:(Redisのデータベーステーブルの空のコマンド: flushall)
保存されたurls:smembers urlsを
表示します保存されたmovieDdata:lrange movieDdata 0-1を表示します

#主文件
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.4567kan.com/index.php/vod/show/id/5/page/1.html']

    rules = (
        Rule(LinkExtractor(allow=r'\d+.html'), callback='parse_item', follow=True),
    )
    #创建redis连接对象
    conn = Redis(host='127.0.0.1',port=6379)
    #用于解析每一个页面中对应的电影详情页url
    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:
            detail_url = 'https://www.4567kan.com'+li.xpath('./div/a/@href').extract_first()
            #将详情页的url存入redis的set中
            ex = self.conn.sadd('urls',detail_url)#urls为了进行对比
            if ex==1:
                print('该url未被爬取过可进行数据的爬取')
                yield scrapy.Request(url=detail_url,callback=self.detail_parse)
            else:
                print('该url被爬取过 ,无数据可以爬取')
    def detail_parse(self,response):
        movie_name = response.xpath('/html/body/div[1]/div/div/div/div[2]/h1/text()').extract_first()
        jianjie = response.xpath('/html/body/div[1]/div/div/div/div[2]/p[5]/span[2]/text()').extract_first()
        jianjie = ''.join(jianjie)
        item = MovieproItem()
        item['movie_name'] = movie_name
        item['jianjie']  = jianjie
        yield item
#items
import scrapy


class MovieproItem(scrapy.Item):
    # define the fields for your item here like:
    movie_name = scrapy.Field()
    jianjie = scrapy.Field()
#pipelines
class MovieproPipeline(object):
    conn = None
    def open_spider(self,spider):
        self.conn = spider.conn #连接对象在爬虫文件(spider)中已经创建过,直接调用
    def process_item(self, item, spider):
        dic = {
    
    
            'movie_name':item['movie_name'],
            'jianjie':item['jianjie']
        }
        print(dic)
        self.conn.lpush('movieDdata',dic)#存储我们爬取的数据
        return item

おすすめ

転載: blog.csdn.net/qwerty1372431588/article/details/107311417