Python scrapy-redis分布式实例(二)

scrapy-redis组件本质上提供了三大功能: 

  1. scheduler - 调度器
  2. dupefilter - URL去重规则(被调度器使用)
  3. pipeline - 数据持久化

  爬取顶点小说网具体步骤:

    1、创建工程 scrapy startproject dingdian

    2、进入这个dingdian目录  cd dingdian

    3、创建crawlspider爬虫文件 scrapy genspider -t  crawl  xs  xxx.com

    4、生成文件如下:

      

  5、 items.py文件

 

 6、xs.py爬虫文件

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
# 导入爬虫包
from scrapy_redis.spiders import RedisCrawlSpider



from ..items import DingdianItem

# 当继承RedisCrawlSpider时,需在Redis客户端指定起始URL。
class XsSpider(RedisCrawlSpider):
    name = 'xs'
    # allowed_domains = ['xxx.com']

    redis_key = 'dingdianxs'


    rules = (
            # 必须写这个起始url   start_urls = ['https://www.23wx.cc/']
            # 分析当前页面实现分页
        	# https://www.23wx.cc/class/1_1.html
            # https://www.23wx.cc/class/2_1.html
            # https://www.23wx.cc/class/3_1.html
        # Rule(LinkExtractor(allow=r'/class/\d+_\d+.html'), follow=True),


        # 正则表达式规则: follow=False不分页
        #  https: // www.23wx.cc / du / 180 / 180337 /
        # 必须写这个起始url start_urls = ['https://www.23wx.cc/du/4/184118/']
        Rule(LinkExtractor(allow=r'du/\d'), callback='parse_item',follow=False),
    )

    def parse_item(self, response):
        item = {}
        #item['domain_id'] = response.xpath('//input[@id="sid"]/@value').get()
        #item['name'] = response.xpath('//div[@id="name"]').get()
        #item['description'] = response.xpath('//div[@id="description"]').get()

        #保存对象
        item=DingdianItem()

        #响应的请求路径
        url =  response.url

        #判断不是以html结尾的,就保存数据:https://www.23wx.cc/du/4/184118/50823152.html
        if  not url.endswith(".html"):
            # 获取数据
            item['name'] = response.xpath('//*[@id="info"]/h1/text()').get()
            item['author'] = response.xpath('//*[@id="info"]/p[1]/text()').get()
            item['chapter'] = response.xpath('//*[@id="info"]/p[3]/text()').get()
            item['last_time'] = response.xpath('//*[@id="info"]/p[4]/text()').get()
            #这个是找到小说下面章节所对应的超链接路径,那么就必须返回完整的路径
            # 这个https://www.23wx.cc/du/4/184118/50617294.html
            # item['url'] = response.xpath('//*[@id="list"]/dl/dd[*]/a/@href').getall()
            #使用是请求的路径url
            item['url'] = url

            # print("url=>>>",response.url)
            # print('name===>>>',item['name'])
            # print('author===>>>',item['author'])
            # print('chapter===>>>',item['chapter'])
            # print('last_time===>>>',item['last_time'])
        else: #获取小说章节和内容
            content=''
            # 使用是请求的路径url
            item['url'] =url
            item['title']=response.xpath('//div[@class="bookname"]/h1/text()').get()
            content_list=response.xpath('//*[@id="content"]/text()').getall()
            # print(content_list)
            #循环列表
            for ct in content_list:
                content+=ct
            # 保存数据
            item['content']=content
            # print(item['content'])

        print('item===>>>',item)
        return item

7、settings.py设置文件

# 使用scrapy-redis里的去重组件,不使用scrapy默认的去重方式
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 使用scrapy-redis里的调度器组件,不使用默认的调度器
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 允许暂停,redis请求记录不丢失
SCHEDULER_PERSIST = True
# 默认的scrapy-redis请求队列形式(按优先级)
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"
# 队列形式,请求先进先出
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderQueue"
# 栈形式,请求先进后出
#SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderStack"

# 只是将数据放到redis数据库,不需要写pipelines文件
ITEM_PIPELINES = {
#    'Sina.pipelines.SinaPipeline': 300,
    'scrapy_redis.pipelines.RedisPipeline': 400,
}

# LOG_LEVEL = 'DEBUG'

# Introduce an artifical delay to make use of parallelism. to speed up the
# crawl.
DOWNLOAD_DELAY = 3

8、启动redis服务,再启动爬虫  scrapy crawl sx

9、打开redis客户端

10、控制台打印数据

文章的内容和标题

 

11、在redis下显示数据

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值