zoukankan      html  css  js  c++  java
  • 基于scrapy框架的分布式爬虫

    分布式

    • 概念:可以使用多台电脑组件一个分布式机群,让其执行同一组程序,对同一组网络资源进行联合爬取。

    • 原生的scrapy是无法实现分布式

      • 调度器无法被共享
      • 管道无法被共享
    • 基于 scrapy+redis(scrapy&scrapy-redis组件)实现分布式

    • scrapy-redis组件作用:

      • 提供可被共享的管道和调度器
    • 环境安装:

      pip install scrapy-redis
      
    • 编码流程:

      1.创建工程
      
      2.cd proName
      
      3.创建crawlspider的爬虫文件
      
      4.修改一下爬虫类:
          - 导包:from scrapy_redis.spiders import RedisCrawlSpider
          - 修改当前爬虫类的父类:RedisCrawlSpider
          - allowed_domains和start_urls删除
          - 添加一个新属性:redis_key = 'xxxx'可以被共享的调度器队列的名称
          
      5.修改配置settings.py
          - 指定管道
              ITEM_PIPELINES = {
                      'scrapy_redis.pipelines.RedisPipeline': 400
                  }
          - 指定调度器
      增加了一个去重容器类的配置, 作用使用Redis的set集合来存储请求的指纹数据, 从而实现请求去重的持久化
              DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
              # 使用scrapy-redis组件自己的调度器
              SCHEDULER = "scrapy_redis.scheduler.Scheduler"
              # 配置调度器是否要持久化, 也就是当爬虫结束了, 要不要清空Redis中请求队列和去重指纹的set。如果是True, 就表示要持久化存储, 就不清空数据, 否则清空数据
              SCHEDULER_PERSIST = True
          - 指定redis数据库
              REDIS_HOST = '127.0.0.1'
              REDIS_PORT = 6379
              
       6.配置redis数据库(redis.windows.conf)
          - 关闭默认绑定
              - 56Line:#bind 127.0.0.1
          - 关闭保护模式
              - 75line:protected-mode no
              
       7.启动redis服务(携带配置文件)和客户端
          - redis-server.exe redis.windows.conf
          - redis-cli
          
       8.执行工程
          - scrapy runspider spider.py
          
       9.将起始的url仍入到可以被共享的调度器的队列(sun)中
          - 在redis-cli中操作:lpush sun www.xxx.com
          
       10.redis:
          - xxx:items:存储的就是爬取到的数据
      

      爬虫代码:

      # -*- coding: utf-8 -*-
      import scrapy
      from scrapy.linkextractors import LinkExtractor
      from scrapy.spiders import CrawlSpider, Rule
      from scrapy_redis.spiders import RedisCrawlSpider
      from fbsPro.items import FbsproItem
      class FbsSpider(RedisCrawlSpider):
          name = 'fbs'
          # allowed_domains = ['www.xxx.com']
          # start_urls = ['http://www.xxx.com/']
          
          redis_key = 'sun'     # 可以被共享的调度器队列的名称
          
          link = LinkExtractor(allow=r'type=4&page=d+')
          rules = (
              Rule(link, callback='parse_item', follow=True),
          )
      
          def parse_item(self, response):
              tr_list = response.xpath('//*[@id="morelist"]/div/table[2]//tr/td/table//tr')
              for tr in tr_list:
                  title = tr.xpath('./td[2]/a[2]/@title').extract_first()
                  status = tr.xpath('./td[3]/span/text()').extract_first()
      
                  item = FbsproItem()
                  item['title'] = title
                  item['status'] = status
      
                  yield item
      
      
      
  • 相关阅读:
    Go入门笔记-1 Unbuntu直接安装go 16.5版本
    EdgexGo2.0学习-12 consul不能按服务名获取数据
    EdgexGo2.0学习-11 测试读取ModBus协议
    win10下VirtualBox开启串口
    Linux 开发板通过笔记本上网
    EdgexGo2.0学习-10 edgex-consul 编译 for "-t, --tag" flag: invalid reference format
    EdgexGo2.0学习-9 ERROR: No matching distribution found for PyYAML<4,>=3.10
    EdgexGo2.0学习-8 pip not found
    EdgexGo2.0学习-7 20.10.6: Pulling from library/docker
    EdgexGo2.0学习-6 修改日志时区显示
  • 原文地址:https://www.cnblogs.com/zhufanyu/p/12020536.html
Copyright © 2011-2022 走看看