为了账号安全,请及时绑定邮箱和手机立即绑定

Scrapyd学习:入门级教程详解

标签:
爬虫
概述

Scrapyd学习涉及安装、集成、启动和管理Scrapy项目中的爬虫,具体包括安装Scrapyd、部署Scrapy项目到Scrapyd以及通过API启动和监控爬虫任务。通过这些步骤,可以实现Scrapy项目的分布式部署和高效管理。

Scrapyd简介与安装

Scrapyd是什么

Scrapyd是一个由Python编写的Web服务,专门为Scrapy框架设计,用于管理分布式爬虫任务。它允许开发者通过HTTP API来启动、停止、删除、更新和查询爬虫。Scrapyd的主要功能包括:

  1. 部署爬虫:将Scrapy项目部署到远程服务器。
  2. 启动爬虫:启动爬虫项目中的一个或多个爬虫。
  3. 管理爬虫:可以暂停、停止、删除爬虫。
  4. 状态监控:实时监控爬虫状态,获取执行情况。

Scrapyd特别适合用于部署大型的、复杂的、需要长时间运行的爬虫,可以实现多个爬虫的分布式执行和管理。

使用Scrapyd可以提高Scrapy项目的可管理性,特别是当项目需要在多台机器上运行多个爬虫时。它简化了部署流程,提供了直观的API接口,使得爬虫任务的管理和调度更加便捷。

安装Scrapyd的步骤

安装Scrapyd需要先安装Scrapy框架,因为Scrapyd是基于Scrapy的。以下是安装步骤:

  1. 安装Python和pip:确保Python环境已安装且pip可用。可以通过以下命令检查:

    python --version
    pip --version

    如果未安装Python,可以从Python官网下载安装包。如果pip未安装,可以使用以下命令安装:

    python -m ensurepip --upgrade
  2. 安装Scrapy:使用pip安装Scrapy框架:

    pip install scrapy
  3. 安装Scrapyd:使用pip安装Scrapyd:

    pip install scrapyd
  4. 创建和配置Scrapyd服务:在Linux或MacOS上,创建一个启动Scrapyd服务的脚本。例如,创建一个名为start_scrapyd.sh的文件,内容如下:

    #!/bin/bash
    python -m scrapyd

    然后确保脚本具有可执行权限,可以通过以下命令设置:

    chmod +x start_scrapyd.sh
  5. 启动Scrapyd服务:运行脚本以启动Scrapyd服务:

    ./start_scrapyd.sh
  6. 验证服务运行情况:启动后,可以通过访问http://localhost:6800/来查看Scrapyd的Web界面。如果可以成功访问,说明Scrapyd已经正确安装并运行。

验证Scrapyd是否安装成功

要验证Scrapyd是否安装成功,可以通过以下步骤进行:

  1. 检查Scrapyd服务是否启动:确保Scrapyd服务已经按照前面的步骤成功启动。可以通过运行前面的脚本启动Scrapyd服务:

    ./start_scrapyd.sh
  2. 访问Scrapyd的Web界面:打开浏览器,访问http://localhost:6800/。如果Scrapyd安装成功,应该能看到一个类似如下的界面:

    {
       "status": "ok",
       "message": "Scrapyd is ready."
    }
  3. 检查API端点:通过访问http://localhost:6800/dumpsettingshttp://localhost:6800/schedule等API端点,确认Scrapyd是否响应。例如,访问http://localhost:6800/dumpsettings

    curl http://localhost:6800/dumpsettings

    如果返回类似以下内容,说明Scrapyd已成功安装并运行:

    {
       "status": "ok",
       "message": "Settings dumped."
    }

如果以上步骤都能成功,说明Scrapyd已经正确安装并运行在本地。

Scrapy项目与Scrapyd的集成

Scrapy项目的基本构成

Scrapy框架的基本构成主要包括以下几个部分:

  1. 项目目录结构

    • scrapy.cfg:项目的配置文件。
    • items.py:定义爬取数据的结构。
    • settings.py:项目的配置设置。
    • middlewares.py:定义中间件,用于处理请求和响应。
    • pipelines.py:定义管道,用于处理爬取的数据。
    • spiders:包含爬虫的模块,每个爬虫负责抓取特定网站的数据。
  2. 爬虫

    • 爬虫是Scrapy项目的核心,每个爬虫都是一个继承自scrapy.Spider的Python类。
    • 爬虫定义了爬取的起始URL、解析响应的规则(使用parse方法)以及处理数据的方法。
    • 示例代码:

      import scrapy
      
      class ExampleSpider(scrapy.Spider):
       name = 'example'
       start_urls = ['http://example.com']
      
       def parse(self, response):
           for item in response.css('div.item'):
               yield {
                   'title': item.css('a::text').get(),
                   'link': item.css('a::attr(href)').get(),
               }
  3. 项目配置设置

    • settings.py文件用于定义项目的全局配置设置,包含各种参数,如请求头、下载延迟、并发数等。
    • 示例代码:

      # settings.py
      BOT_NAME = 'my_project'
      SPIDER_MODULES = ['my_project.spiders']
      NEWSPIDER_MODULE = 'my_project.spiders'
      
      ROBOTSTXT_OBEY = True
      CONCURRENT_REQUESTS = 16
      DOWNLOAD_DELAY = 1
  4. 管道

    • 管道定义了如何处理爬取的数据,通常用于清洗、保存数据等。
    • 管道定义在pipelines.py文件中。
    • 示例代码:
      # pipelines.py
      class MyProjectPipeline(object):
       def process_item(self, item, spider):
           item['title'] = item['title'].strip()
           return item
  5. 中间件
    • 中间件用于处理请求和响应,可以在数据处理流程中加入自定义的逻辑。
    • 中间件定义在middlewares.py文件中。
    • 示例代码:
      # middlewares.py
      class MyProjectMiddleware(object):
       def process_request(self, request, spider):
           print('Processing request:', request)
           return request

以上是Scrapy项目的构成部分,了解这些部分有助于更好地理解和使用Scrapy框架来创建和管理爬虫。

如何将Scrapy项目部署到Scrapyd上

将Scrapy项目部署到Scrapyd上涉及以下几个步骤:

  1. 创建Scrapy项目:使用Scrapy命令行工具创建一个新的Scrapy项目:

    scrapy startproject my_project
    cd my_project
  2. 编写爬虫:在项目的spiders目录下编写一个爬虫。例如,创建一个名为example.py的文件,内容如下:

    import scrapy
    
    class ExampleSpider(scrapy.Spider):
       name = 'example'
       allowed_domains = ['example.com']
       start_urls = ['http://example.com']
    
       def parse(self, response):
           for item in response.css('div.item'):
               yield {
                   'title': item.css('a::text').get(),
                   'link': item.css('a::attr(href)').get(),
               }
  3. 配置Scrapy项目:修改settings.py文件,确保配置了BOT_NAMESPIDER_MODULES等项。例如:

    # settings.py
    BOT_NAME = 'my_project'
    SPIDER_MODULES = ['my_project.spiders']
    NEWSPIDER_MODULE = 'my_project.spiders'
  4. 打包项目:使用scrapyd-deploy命令将项目打包成一个.egg文件,以便部署到Scrapyd。首先,安装scrapyd-client

    pip install scrapyd-client

    然后,创建一个scrapyd-deploy配置文件deploy.cfg,内容如下:

    [deploy:default]
    url = http://localhost:6800/
    project = my_project
  5. 部署项目:使用scrapyd-deploy命令将项目部署到Scrapyd:

    scrapyd-deploy
  6. 验证部署结果:访问Scrapyd的Web界面(如http://localhost:6800/daemonstatus),检查项目是否已成功部署。例如,访问http://localhost:6800/dav/my_project,确认项目文件夹存在。

  7. 启动爬虫:通过访问Scrapyd的API端点来启动爬虫。例如,使用curl命令:
    curl http://localhost:6800/schedule.json -d project=my_project -d spider=example

完成以上步骤后,Scrapy项目已经成功部署到了Scrapyd,可以通过Scrapyd的API来管理和调度爬虫任务。

项目部署后的验证方法

部署Scrapy项目到Scrapyd后,可以通过以下方法来验证部署是否成功:

  1. 访问Scrapyd的Web界面

    • 打开浏览器,访问http://localhost:6800/daemonstatus,可以看到Scrapyd的运行状态,确认服务正常运行。
    • 访问http://localhost:6800/projects,确认项目已经成功部署到Scrapyd服务器中。
    • 例如,访问http://localhost:6800/dav/my_project,可以看到项目的文件结构,例如settings.pyspiders目录等。
  2. 通过API验证部署

    • 使用curl命令访问Scrapyd的API端点来检查部署情况。
    • 例如,检查所有部署的项目:

      curl http://localhost:6800/listprojects.json

      输出结果中应包含my_project项目。

    • 检查特定项目的详情:
      curl http://localhost:6800/listversions.json?project=my_project

      输出结果中应包含项目的版本信息。

  3. 启动爬虫并查看日志

    • 通过API启动爬虫,并查看启动结果。
    • 例如,启动example爬虫:

      curl http://localhost:6800/schedule.json -d project=my_project -d spider=example
    • 查看爬虫日志,确认爬虫已成功启动并运行:
      curl http://localhost:6800/log.json?project=my_project&spider=example
  4. 检查调度任务
    • 通过API查看当前调度的任务:
      curl http://localhost:6800/schedule.json

      输出结果应能显示出任务的调度情况,包括爬虫名、项目名、启动时间等。

通过以上步骤验证部署情况,若所有步骤均顺利执行且结果符合预期,说明Scrapy项目已经成功部署到Scrapyd,可以进一步通过Scrapyd的API来管理和调度爬虫任务。

使用Scrapyd启动爬虫

启动项目的单个爬虫

启动Scrapy项目中的单个爬虫可以通过Scrapyd提供的API实现,具体步骤如下:

  1. 确保Scrapy项目已部署到Scrapyd:首先,确保你的Scrapy项目已经被成功部署到Scrapyd服务器。参考前文中的方法来验证项目是否已部署。例如,项目名为my_project,爬虫名为example

  2. 启动爬虫:使用Scrapyd的schedule.json接口来启动指定的爬虫。例如,通过curl命令调用API:

    curl http://localhost:6800/schedule.json -d project=my_project -d spider=example

    这个命令会向Scrapyd服务器发送一个HTTP请求,请求启动my_project项目中的example爬虫。Scrapyd接收到请求后,会启动指定的爬虫并执行任务。

  3. 查看爬虫运行状态:启动爬虫后,可以通过Scrapyd的API查看爬虫运行状态。例如,查看特定爬虫的日志文件:

    curl http://localhost:6800/log.json?project=my_project&spider=example

    输出结果将包含爬虫的运行日志,可以从中查看爬虫的执行详情。

  4. 使用其他工具:除了直接使用curl命令,也可以使用Python脚本来调用Scrapyd API。例如,使用requests库来启动爬虫:

    import requests
    
    url = "http://localhost:6800/schedule.json"
    data = {
       "project": "my_project",
       "spider": "example"
    }
    response = requests.post(url, json=data)
    print(response.json())

通过上述步骤,可以成功启动Scrapy项目中的单个爬虫,并通过API查看爬虫的运行状态。

启动项目的多个爬虫

启动Scrapy项目中的多个爬虫可以通过创建多个调度任务来实现。具体步骤如下:

  1. 确保Scrapy项目已部署到Scrapyd:首先,确保你的Scrapy项目已被成功部署到Scrapyd。参考前文中的方法来验证项目是否已部署。例如,项目名为my_project,包含多个爬虫,如example1example2等。

  2. 启动多个爬虫:使用Scrapyd的schedule.json接口,分别启动多个爬虫。例如,通过curl命令调用API:

    # 启动第一个爬虫
    curl http://localhost:6800/schedule.json -d project=my_project -d spider=example1
    # 启动第二个爬虫
    curl http://localhost:6800/schedule.json -d project=my_project -d spider=example2
  3. 批量启动爬虫:如果需要批量启动多个爬虫,可以编写一个脚本来自动化这个过程。例如,使用Python脚本:

    import requests
    
    url = "http://localhost:6800/schedule.json"
    project_name = "my_project"
    spider_names = ["example1", "example2", "example3"]
    
    for spider in spider_names:
       data = {
           "project": project_name,
           "spider": spider
       }
       response = requests.post(url, json=data)
       print(response.json())
  4. 查看爬虫运行状态:启动爬虫后,可以通过Scrapyd的API查看每个爬虫的运行状态。例如,查看特定爬虫的日志文件:
    # 查看第一个爬虫的日志
    curl http://localhost:6800/log.json?project=my_project&spider=example1
    # 查看第二个爬虫的日志
    curl http://localhost:6800/log.json?project=my_project&spider=example2

通过上述步骤,可以成功启动Scrapy项目中的多个爬虫,并通过API查看每个爬虫的运行状态。

查看爬虫运行状态

查看Scrapy项目中爬虫的运行状态可以通过Scrapyd提供的API来实现。具体步骤如下:

  1. 查看爬虫日志

    • 使用log.json接口查看特定爬虫的日志文件。例如,查看example爬虫的日志:
      curl http://localhost:6800/log.json?project=my_project&spider=example

    输出结果会显示爬虫的日志信息,包括日志的时间戳、级别(如INFO、ERROR等)以及日志内容。

  2. 查看调度任务状态

    • 使用listjobs.json接口查看当前所有调度任务的状态。例如:
      curl http://localhost:6800/listjobs.json?project=my_project

    输出结果将包含所有调度任务的状态信息,如pendingrunningfinished等。

  3. 查看所有项目和爬虫信息

    • 使用listprojects.json接口查看所有部署到Scrapyd中的项目:
      curl http://localhost:6800/listprojects.json
    • 使用listversions.json接口查看特定项目的版本信息:
      curl http://localhost:6800/listversions.json?project=my_project
  4. 使用Python脚本:可以通过Python脚本来调用Scrapyd API并获取爬虫状态。

    import requests
    
    url = "http://localhost:6800/listjobs.json"
    data = {"project": "my_project"}
    response = requests.get(url, params=data)
    print(response.json())

通过上述方法,可以实时监控Scrapy项目中爬虫的运行状态,确保任务的执行情况。

Scrapy项目调度与管理

调度任务的设置

在Scrapy项目中,调度任务的设置通过Scrapyd提供的API实现,允许开发者灵活地管理和调度爬虫任务。具体步骤如下:

  1. 设置定时任务

    • 使用addversion.jsonschedule.json接口来设置定时任务。
    • 例如,设置一个定时任务,每天固定时间触发特定爬虫:
      curl http://localhost:6800/schedule.json -d project=my_project -d spider=example -d setting=JOBDIR=job-%Y-%m-%d-%H-%M-%S
    • 其中,setting=JOBDIR=job-%Y-%m-%d-%H-%M-%S设置了唯一的工作目录,确保每个任务的隔离性。
  2. 参数传递

    • 可以传递额外参数给爬虫,例如,传递一个参数date
      curl http://localhost:6800/schedule.json -d project=my_project -d spider=example -d date=2023-10-01
    • 爬虫可以通过settings获取传递的参数:

      import scrapy
      
      class ExampleSpider(scrapy.Spider):
       name = 'example'
       start_urls = ['http://example.com']
      
       def parse(self, response):
           date = self.settings.get('date')
           print(f"Date: {date}")
           # 根据日期进行数据爬取...
  3. 条件触发任务

    • 可以根据特定条件触发任务,例如,当某个URL的状态码发生变化时:
      curl http://localhost:6800/schedule.json -d project=my_project -d spider=example -d condition=url=http://example.com/status=200
    • 爬虫可以根据条件触发爬取:

      import scrapy
      
      class ExampleSpider(scrapy.Spider):
       name = 'example'
       start_urls = ['http://example.com']
      
       def parse(self, response):
           if response.status == 200:
               # 爬取数据...
               pass
  4. 优先级设置
    • 可以通过设置优先级来控制任务的执行顺序:
      curl http://localhost:6800/schedule.json -d project=my_project -d spider=example -d priority=10
    • 优先级数值越小,任务的优先级越高。

通过以上步骤,可以灵活地设置和管理Scrapy项目的调度任务,实现定时、参数传递、条件触发等功能。

项目调度的监控

监控Scrapy项目的调度任务可以通过Scrapyd提供的API实现。具体步骤如下:

  1. 查看调度任务状态

    • 使用listjobs.json接口查看当前所有调度任务的状态。例如:
      curl http://localhost:6800/listjobs.json?project=my_project
    • 输出结果将包含任务的状态信息,如pendingrunningfinished等,以及每个任务的详细信息,如调度时间、执行时间、爬虫名等。
  2. 监控特定爬虫状态

    • 使用listjobs.json接口查看特定爬虫的状态。例如:
      curl http://localhost:6800/listjobs.json?project=my_project&spider=example
    • 输出结果将详细显示特定爬虫的调度任务状态。
  3. 查看爬虫日志

    • 使用log.json接口查看特定爬虫的日志文件。例如:
      curl http://localhost:6800/log.json?project=my_project&spider=example
    • 输出结果将显示爬虫的日志信息,包括日志的时间戳、级别(如INFO、ERROR等)以及日志内容。
  4. 使用Python脚本

    • 通过Python脚本来调用Scrapyd API并获取任务状态。
      
      import requests

    url = "http://localhost:6800/listjobs.json"
    data = {"project": "my_project"}
    response = requests.get(url, params=data)
    print(response.json())

通过上述方法,可以实时监控Scrapy项目的调度任务,确保每个任务的执行情况和状态信息。

调度任务的取消与重启

调度任务的取消与重启可以通过Scrapyd提供的API实现,具体步骤如下:

  1. 取消任务

    • 使用cancel.json接口取消特定任务。例如,取消特定爬虫的指定任务:
      curl http://localhost:6800/cancel.json -d project=my_project -d jobid=jobid123
    • 输出结果将显示任务的取消状态,如ok表示任务已成功取消。
  2. 重启任务

    • 重启任务可以先取消任务,然后再重新启动。例如,先取消任务:
      curl http://localhost:6800/cancel.json -d project=my_project -d jobid=jobid123
    • 然后重新启动任务:
      curl http://localhost:6800/schedule.json -d project=my_project -d spider=example -d jobid=jobid123
    • 重新启动时可以传递额外参数,以确保任务重新启动时满足特定条件。
  3. 使用Python脚本

    • 通过Python脚本来调用Scrapyd API来取消和重启任务。
      
      import requests

    def cancel_job(project, jobid):
    url = "http://localhost:6800/cancel.json"
    data = {"project": project, "jobid": jobid}
    response = requests.post(url, data=data)
    print(response.json())

    def restart_job(project, spider, jobid):
    url = "http://localhost:6800/schedule.json"
    data = {"project": project, "spider": spider, "jobid": jobid}
    response = requests.post(url, data=data)
    print(response.json())

    cancel_job("my_project", "jobid123")
    restart_job("my_project", "example", "jobid123")

通过上述步骤,可以灵活地取消和重启Scrapy项目的调度任务,确保任务在需要时可以被正确管理。

Scrapy与Scrapyd的进阶设置

配置文件详解

Scrapy项目的配置文件包括settings.pyscrapy.cfg等文件。以下是这些文件的详解:

  1. settings.py

    • settings.py文件用于定义项目的全局配置,包括各种参数和设置项。
    • 示例代码:

      # settings.py
      BOT_NAME = 'my_project'
      SPIDER_MODULES = ['my_project.spiders']
      NEWSPIDER_MODULE = 'my_project.spiders'
      
      # 请求头
      USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'
      
      # 下载延迟
      DOWNLOAD_DELAY = 1
      
      # 并发数
      CONCURRENT_REQUESTS = 16
      
      # 日志级别
      LOG_LEVEL = 'INFO'
      
      # 代理设置
      HTTP_PROXY = 'http://proxy.example.com:8080'
  2. scrapy.cfg

    • scrapy.cfg文件是项目的整体配置文件,用于定义项目的名称、设置等。
    • 示例代码:
      [deploy]
      # 设置Scrapyd的部署地址
      url = http://localhost:6800/
      # 设置Scrapy项目的名称
      project = my_project
  3. 其他配置文件
    • deploy.cfg:用于定义Scrapyd的部署配置。
      [deploy:default]
      url = http://localhost:6800/
      project = my_project

通过以上配置文件,可以灵活地定义和调整Scrapy项目的各种参数和设置,确保项目运行符合预期。

高级调度选项设置

Scrapy项目可以通过Scrapyd的API实现更高级的调度选项设置,具体步骤如下:

  1. 设置优先级

    • 可以通过priority参数来设置任务的优先级。优先级数值越小,任务的优先级越高。
    • 例如,启动一个高优先级的任务:
      curl http://localhost:6800/schedule.json -d project=my_project -d spider=example -d priority=10
    • 可以通过Python脚本来设置优先级:

      import requests
      
      url = "http://localhost:6800/schedule.json"
      data = {
       "project": "my_project",
       "spider": "example",
       "priority": 10
      }
      response = requests.post(url, json=data)
      print(response.json())
  2. 设置并发限制

    • 可以通过concurrency参数来设置并发限制,控制多任务的并发执行。
    • 例如,启动一个具有并发限制的任务:
      curl http://localhost:6800/schedule.json -d project=my_project -d spider=example -d concurrency=5
    • 可以通过Python脚本来设置并发限制:

      import requests
      
      url = "http://localhost:6800/schedule.json"
      data = {
       "project": "my_project",
       "spider": "example",
       "concurrency": 5
      }
      response = requests.post(url, json=data)
      print(response.json())
  3. 设置任务重复

    • 可以通过interval参数来设置任务的重复执行时间间隔。
    • 例如,设置一个每10分钟重复一次的任务:
      curl http://localhost:6800/schedule.json -d project=my_project -d spider=example -d interval=600
    • 可以通过Python脚本来设置任务重复:

      import requests
      
      url = "http://localhost:6800/schedule.json"
      data = {
       "project": "my_project",
       "spider": "example",
       "interval": 600
      }
      response = requests.post(url, json=data)
      print(response.json())

通过以上高级调度选项设置,可以灵活地管理Scrapy项目的任务调度,确保任务按预期执行。

日志与数据的导出

Scrapy项目的日志和数据可以通过Scrapyd的API和特定配置来导出。具体步骤如下:

  1. 导出日志

    • 可以通过log.json接口查看特定爬虫的日志文件。
    • 例如,导出example爬虫的运行日志:
      curl http://localhost:6800/log.json?project=my_project&spider=example
    • 输出结果将包含爬虫的日志信息,可以进一步导出到文件:
      curl -o example_log.txt http://localhost:6800/log.json?project=my_project&spider=example
  2. 导出数据

    • 使用管道将爬取的数据保存到文件或其他存储系统。
    • 例如,创建一个输出到文件的管道:

      # pipelines.py
      import json
      
      class FilePipeline(object):
       def __init__(self):
           self.file = open("output.json", 'w', encoding='utf-8')
      
       def process_item(self, item, spider):
           line = json.dumps(dict(item), ensure_ascii=False) + "\n"
           self.file.write(line)
           return item
      
       def close_spider(self, spider):
           self.file.close()
  3. 配置日志输出

    • 可以通过settings.py文件中的LOG_FILE参数来设置日志输出文件。
      # settings.py
      LOG_FILE = 'log.txt'
  4. 使用Python脚本导出

    • 通过Python脚本调用Scrapyd API并将数据导出到文件。
      
      import requests

    url = "http://localhost:6800/log.json"
    data = {"project": "my_project", "spider": "example"}
    response = requests.get(url, params=data)
    with open("example_log.txt", "w", encoding="utf-8") as f:
    f.write(response.text)

通过上述步骤,可以灵活地导出Scrapy项目的日志和数据,确保数据和日志的保存与管理。

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消