• Python爬虫之分布式爬虫


    分布式爬虫

    1.详情介绍

            分布式爬虫是指将一个爬虫任务分解成多个子任务,在多个机器上同时执行,从而加快数据的抓取速度和提高系统的可靠性容错性的技术。

            传统的爬虫是在单台机器上运行,一次只能处理一个URL,而分布式爬虫通过将任务分解成多个子任务,可以同时处理多个URL,从而提高爬取数据的效率。在分布式爬虫中,通常有一个主节点负责任务的调度和管理,其他节点(也称为从节点)负责实际的数据采集和处理。

    分布式爬虫的好处包括:

    提高爬取速度通过同时处理多个URL,可以大大加快数据的抓取速度
    提高可靠性和容错性如果某个节点出现故障或者网络中断,其他节点可以继续工作,从而保证任务的完成
    分散资源消耗将任务分布到多个节点上执行,可以分散资源消耗,避免单台机器过载
    扩展性强可以根据需求增加或减少节点数量,从而灵活调整系统的规模

    分布式爬虫可以应用于各种场景,比如搜索引擎抓取网页数据、大规模数据分析和挖掘等。但是分布式爬虫也面临一些挑战,如数据一致性、网络通信、任务调度等问题,需要合理设计和实施。

    2.丰富的工具

    分布式爬虫所涉及的工具:

    分布式任务调度工具用于将任务分发给多个爬虫节点,并协调任务的执行顺序和并发度。常用的工具有Celery、Apache Mesos和Kafka。
    分布式消息队列用于传递任务和数据。爬虫节点通过订阅队列接收任务和发送爬取结果。常用的消息队列有RabbitMQ和Apache Kafka。
    分布式爬虫框架用于构建和管理分布式爬虫。框架提供了任务调度、数据传输和分布式爬取的功能。常用的框架有Scrapy、PySpider和StormCrawler。
    分布式数据库用于存储爬取的数据。分布式数据库提供高可用性和扩展性,可以存储大量的数据,并支持并发读写操作。常用的数据库有MongoDB、Cassandra和HBase。
    分布式存储系统用于存储大量的爬取数据和爬虫代码。分布式存储系统提供高可用性、高吞吐量和容错性。常用的存储系统有Hadoop HDFS、Amazon S3和Google Cloud Storage。
    分布式代理池用于处理反爬虫机制和IP封锁。分布式代理池动态分配代理IP给爬虫节点,以避免被封禁或限制访问。常用的代理池有Scrapy-Proxy、ProxyPool和IPProxyPool。
    分布式解析器用于提取和解析HTML、XML和JSON等数据格式。分布式解析器可以并行解析多个页面,并将数据提供给爬虫节点。常用的解析器有BeautifulSoup、Parsel和Lxml。
    分布式反反爬虫工具用于处理网站的反爬虫机制和封锁策略。分布式反反爬虫工具可以自动处理验证码、动态加载和JS渲染等反爬虫技术。常用的工具有Selenium、Splash和Puppeteer。
    分布式监控和日志工具用于监控爬虫的状态和性能,并记录爬取过程中的日志信息。监控工具可以通过Web界面提供实时监控和报警功能。常用的工具有Prometheus、Grafana和ELK Stack。
    分布式数据处理工具用于对爬取的数据进行清洗、分析和存储。数据处理工具可以进行数据清洗、去重、聚合和转换等操作。常用的工具有Pandas、Spark和Hive。

    这些工具可以帮助构建一个高效、可靠和可扩展的分布式爬虫系统。根据具体的需求和场景,可以选择适合的工具进行组合和配置。

    3.准备工作

            

    scrapy runspider 是 Scrapy 框架提供的一个命令行工具,用于运行指定的 Spider(爬虫)。下面使用 scrapy runspider 的结合Redis实现一个分布式爬虫开始前提:

    1. 创建一个 Spider 类

    首先,你需要创建一个继承自 scrapy.Spider 的 Python 类。这个类定义了你的爬虫的行为和规则。你可以在类中定义起始 URL、提取数据的规则、如何跟踪链接等等。

    1. import scrapy
    2. class MySpider(scrapy.Spider):
    3. name = 'myspider'
    4. start_urls = ['http://example.com']
    5. def parse(self, response):
    6. # 提取数据的代码
    7. pass

    1. 运行 Spider

    要运行这个 Spider,你可以使用以下命令:

    scrapy runspider myspider.py
    

    这个命令会在当前目录下启动 Scrapy 进程并运行指定的 Spider。

    1. 指定输出文件

    默认情况下,Scrapy 会将爬取到的数据打印到屏幕上。如果你想将数据保存到文件中,可以使用 -o 参数指定输出文件的路径和格式。例如,将数据保存为 JSON 文件:

    scrapy runspider myspider.py -o data.json
    

    1. 设置其他选项

    你可以在 scrapy runspider 命令后面添加其他选项来配置你的爬虫。常用的选项包括:

    • -a:传递给 Spider 的参数,例如 -a category=books
    • -s:设置 Scrapy 的设置,例如 -s BOT_NAME=mybot
    • -L:设置日志级别,例如 -L INFO

    以上就是使用 scrapy runspider 运行 Spider 的基本教程。你可以根据自己的需要在 Spider 类中添加更多的功能和配置。详细的文档可以在 Scrapy 的官方网站上找到:https://docs.scrapy.org

     4.redis的下载

    要下载Redis,可以按照以下步骤进行操作:

    1. 打开Redis的官方网站:https://redis.io/.

    2. 在主页上找到并点击"Download"按钮,或者直接访问https://redis.io/download页面。

    3. 在下载页面上,可以看到最新版本的Redis以及之前的版本。根据自己的需求选择适合的版本,例如选择最新的稳定版本。点击所选择版本的下载链接,将会跳转到该版本的下载页面。

    4. 在下载页面上,会列出各种下载选项,根据你的操作系统选择合适的选项。如果你使用Linux,可以下载源代码进行编译安装;如果你使用Windows,可以下载预编译的二进制文件。点击所选择的下载链接,开始下载Redis压缩包。

    5. 下载完成后,解压缩Redis压缩包到你选择的目录中。

    6. 进入解压缩后的Redis目录,你会发现一些可执行文件和配置文件。

    7. 在命令行中进入Redis目录,执行以下命令启动Redis服务。

      • 在Linux或Mac上:

        $ src/redis-server
        

      • 在Windows上:

        > redis-server.exe
        

      如果你想修改默认配置文件,可以使用以下命令启动Redis并指定配置文件路径:

      • 在Linux或Mac上:

        $ src/redis-server /path/to/redis.conf
        
      • 在Windows上:

        > redis-server.exe C:\path\to\redis.conf
        
    8. Redis服务成功启动后,你可以通过Redis客户端连接到Redis服务器进行操作。在命令行中输入以下命令启动Redis客户端:

      • 在Linux或Mac上:

        $ src/redis-cli
        
      • 在Windows上:

        > redis-cli.exe
        

      你可以使用各种Redis命令与服务器进行交互。

    应用案例

    1.前言

            此案例是通过分布式爬虫对一个新闻问政平台的投诉信息进行爬取,结合分布式爬虫Redis缓存实现对数据的快速多量的爬取和存储

    2.实现步骤

    2.1基本项目创建

    1. import scrapy
    2. from scrapy.linkextractors import LinkExtractor
    3. from scrapy.spiders import CrawlSpider, Rule
    4. from scrapy_redis.spiders import RedisCrawlSpider
    5. from sevenBlood.items import SevenbloodItem
    6. class SevenSpider(CrawlSpider):
    7. name = "seven"
    8. # allowed_domains = ["www.baidu.com"]
    9. # 定义调度器的名称
    10. redis_key='sun'
    11. rules = (Rule(LinkExtractor(allow=r"id=1&page=\d+"), callback="parse_item", follow=False))

    2.2获取新闻标题数据

    1. def parse_item(self, response):
    2. tr_list = response.xpath('/html/body/div[2]/div[3]/ul[2]/li')
    3. for tr in tr_list:
    4. new_title = tr.xpath('./span[3]/a/text()').extract_first()
    5. print(new_title)
    6. item = SevenbloodItem()
    7. item['new_title'] = new_title
    8. yield item

    2.3配置item.py文件

    1. import scrapy
    2. class SevenbloodItem(scrapy.Item):
    3. new_title = scrapy.Field()

    2.4配置setting.py文件

    1. ROBOTSTXT_OBEY = False
    2. LOG_LEVEL='ERROR'
    3. USER_AGENT="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0"
    1. # 指定管道
    2. ITEM_PIPELINES = {
    3. "scrapy_redis.pipelines.RedisPipeline" : 400
    4. }
    5. # 指定调度器
    6. #使用scrapy-redis组件的去重队列
    7. DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
    8. #使用scrapy-redis组件自己的调度器
    9. SCHEDULER = "scrapy_redis.scheduler.Scheduler"
    10. #是否允许暂停
    11. SCHEDULER_PERSIST = True
    12. REDIS_HOST = "127.0.0.1"
    13. REDIS_PORT = 6379
    14. REDIS_ENCODING ="utf-8"

    2.5Redis设置 

    在redis的下载安装路径里,点击redis.windows.conf文件

    bind 127.0.0.1进行注释

    然后回到redis的下载安装路径里,先点击redis-server.exe启动redis服务

    在点击打开redis-cil.exe文件

    2.6项目运行 

    cmd打开命令行cd切换到项目目录之中,切记需要切换到根目录之中

    输入scrapy runspider ‘’项目名‘’.py

    然后在redis-cil.exe文件里输入,就成功进行分布式的爬取

    lpush ''redis_key'' “爬取网站URL”

    3.数据的查看

    使用Redis Desktop Manager 0.9.3.817,对缓存数据进行查看

    下载链接:提取码:1631

    http:// https://pan.baidu.com/s/1wyELUhOn_rumFecNAS7L0A

  • 相关阅读:
    基于docker实现JMeter分布式压测
    Oracle设置日志参数-ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
    【JUC并发编程】Synchronized深度分析
    墙裂推荐:GitHub 上这个开源项目可以让你在短短几分钟之内了解一门技术
    Zigbee—网络层地址分配机制
    如何应对红帽不再维护 CentOS
    高通平台Android 蓝牙调试和配置手册-- debug QXDM/OTA/Ring buffer/pt4 pt5/PTS logs
    vue2,props属性和attribute属性的区别和不同
    JAVA单元测试用例——待续
    【Akka】Akka 学习 akka 两本书的读后感
  • 原文地址:https://blog.csdn.net/Tudective/article/details/137355663