Scrapy-爬虫多开技能

news/2024/7/5 7:01:30

我们知道,现在运行Scrapy项目中的爬虫文件,需要一个一个地运行,那么是否可以将对应的爬虫文件批量运行呢?如果可以,又该怎么实现呢?在Scrapy中,如果想批量运行爬虫文件,常见的有两种方法:

  • 使用CrawProcess实现
  • 使用修改craw源码 + 自定义命令的方式实现

现在我们创建一个新的爬虫项目,用于实现爬虫多开技能:

scrapy startproject multi_spiders

然后,进入该爬虫项目所在目录,并在该项目中创建3个爬虫文件,如下所示:

vagrant@homestead:~/spider/multi_spiders$ scrapy genspider first_spider baidu.com
Created spider 'first_spider' using template 'basic' in module:
  multi_spiders.spiders.first_spider
  
  
vagrant@homestead:~/spider/multi_spiders$ scrapy genspider second_spider baidu.com
Created spider 'second_spider' using template 'basic' in module:
  multi_spiders.spiders.second_spider
  

vagrant@homestead:~/spider/multi_spiders$ scrapy genspider third_spider baidu.com
Created spider 'third_spider' using template 'basic' in module:
  multi_spiders.spiders.third_spider

此时,我们已经在项目中创建了3个爬虫文件,有了这些转呗工作之后,我们就可以正式进入运行多个爬虫文件的功能的编写。

使用CrawProcess实现

CrawProcess为scrapy.spiders模块下的一个工具类,要实现爬虫多开技能,我们需要先将其导入进来,并且实例化。下面新建一个Python文件multi_manager.py,用于实现爬虫多开操作,实现多开操作的具体代码如下:

# -*- coding: UTF-8 -*-

from multi_spiders.spiders.first_spider import FirstSpiderSpider
from multi_spiders.spiders.second_spider import SecondSpiderSpider
from multi_spiders.spiders.third_spider import ThirdSpiderSpider
from scrapy.crawler import CrawlerProcess


process = CrawlerProcess()
# 将三个爬虫类依次添加进来
process.crawl(FirstSpiderSpider)
process.crawl(SecondSpiderSpider)
process.crawl(ThirdSpiderSpider)
process.start()

运行此模块会发现,三个爬虫都被运行了。

修改crawl源码

Scrapy是开源的,如果要实现运行多个爬虫文件,我们参考crawl命令的源码,进行相应的修改,并写一个自己的Python文件,这相当于定义了一个心明了,所以还需要使用Scrapy添加自定义命令的功能为我们所写的代码添加一个自定义命令。然后就可以根据这个自定义命令,运行多个爬虫文件。

crawl命令的源码可以在Scrapy官方的GitHub项目中找到(地址市:https://github.com/scrapy/scrapy/blob/master/scrapy/commands/crawl.py),找到并打开该源码文件,具体代码如下所示:

import os
from scrapy.commands import ScrapyCommand
from scrapy.utils.conf import arglist_to_dict
from scrapy.utils.python import without_none_values
from scrapy.exceptions import UsageError


class Command(ScrapyCommand):
    ...
    def run(self, args, opts):
        if len(args) < 1:
            raise UsageError()
        elif len(args) > 1:
            raise UsageError("running 'scrapy crawl' with more than one spider is no longer supported")
        spname = args[0]

        self.crawler_process.crawl(spname, **opts.spargs)
        self.crawler_process.start()

部分与我们不相关的代码,我就不贴出来了,有兴趣的同学可以自己上去看一下。这里,我们主要看Command类下面的run()方法,run()方法中指定了要运行哪些爬虫文件,具体通过crawler_process.crawl(spname, **opts.spargs)实现爬虫文件的运行,spname指的是爬虫名称。所以,我们要实现一次运行多个爬虫文件,关键需要修改run()方法。

首先,我们进入到项目目录multi_spiders,而后进入multi_spiders,在这里新建一个文件夹,如下:

vagrant@homestead:~/spider/multi_spiders/multi_spiders$ mkdir mycmd

然后,进入新建的文件夹mycmd并创建一个Python文件,名字可自定义:

vagrant@homestead:~/spider/multi_spiders/multi_spiders/mycmd$ vi mycrawl

将crawl命令的源码复制此文件中,并对run()方法进行如下修改:

import os
from scrapy.commands import ScrapyCommand
from scrapy.utils.conf import arglist_to_dict
from scrapy.utils.python import without_none_values
from scrapy.exceptions import UsageError


class Command(ScrapyCommand):
    ...
    def run(self, args, opts):
        spname_list = self.crawl_process.spider_loader.list()
        for spname in spname_list():
            self.crawl_process.crawl(spname, **opts.spargs)
        self.crawler_process.start()

然后在该文件的同级目录下添加一个初始化文件__init__.py。随后我们还需要在项目的配置文件settings.py中进行相应配置,定义命令源码目录,如下所示:

COMMANDS_MODULE = 'multi_spiders.mycmd'

随后,我们退回到项目所在目录,并输入scrapy -h,将会出现如下所示信息:

vagrant@homestead:~/spider/multi_spiders$ scrapy -h
Scrapy 1.4.0 - project: multi_spiders

Usage:
  scrapy <command> [options] [args]

Available commands:
  bench         Run quick benchmark test
  check         Check spider contracts
  crawl         Run a spider
  edit          Edit spider
  fetch         Fetch a URL using the Scrapy downloader
  genspider     Generate new spider using pre-defined templates
  list          List available spiders
  mycrawl       Run a spider
  parse         Parse URL (using its spider) and print the results
  runspider     Run a self-contained spider (without creating a project)
  settings      Get settings values
  shell         Interactive scraping console
  startproject  Create new project
  version       Print Scrapy version
  view          Open URL in browser, as seen by Scrapy

Use "scrapy <command> -h" to see more info about a command

可以看到,此时已经出现自定义命令mycrawl了。随后我们就可以使用该自定义命令同时启动所有的爬虫文件了,如下所示:

vagrant@homestead:~/spider/multi_spiders$ scrapy mycrawl --nolog

此时已经通过自定义的mycrawl命令同时启动了爬虫文件first_spider、second_spider、third_spider


http://lihuaxi.xjx100.cn/news/1010978.html

相关文章

IPv4 和 IPv6 的组成结构和对比

IPv4 和 IPv6 的组成结构和对比IPv4IPv6互联网协议 (IP) 是互联网通信的基础&#xff0c;IP 地址是互联网上每个设备的唯一标识符。目前最常用的 IP 协议是 IPv4&#xff0c;它已经有近 30 年的历史了。然而&#xff0c;IPv4 存在一些问题&#xff0c;例如: 地址空间不足:IPv4 …

向量的内积外积哈达玛积

1.向量的内积 1.1 定义 从代数角度看&#xff0c;先对两个数字序列中的每组对应元素求积&#xff0c;再对所有积求和&#xff0c;结果即为点积。从几何角度看&#xff0c;点积则是两个向量的长度与它们夹角余弦的积。 表示形式&#xff1a;ATBA^TBATB、<A,B><A,B&g…

[学习笔记]金融风控实战

参考资料&#xff1a; 零基础入门金融风控-贷款违约预测 导包 import pandas as pd import matplotlib.pyplot as plt# 读取数据 train pd.read_csv(train.csv) testA pd.read_csv(testA.csv) print(Train data shape:, train.shape) print(testA data shape:, testA.shape…

我的面试八股(JAVA并发)

程序计数器为什么是线程私有的? 程序计数器主要有下面两个作用&#xff1a; 字节码解释器通过改变程序计数器来依次读取指令&#xff0c;从而实现代码的流程控制&#xff0c;如&#xff1a;顺序执行、选择、循环、异常处理。在多线程的情况下&#xff0c;程序计数器用于记录…

Redis 客户端连接服务器失败

公司项目开发环境需要使用到 Redis&#xff0c;申请基础技术支撑平台的 Redis 中间件比较麻烦&#xff0c;项目组也不知道具体流程&#xff0c;而且时间可能比较长。 现在的情况是&#xff0c;项目因为 Redis 启动报错。 这种情况下&#xff0c;我们项目组就自行在虚拟机上临…

开心档之C++ 多态

目录 C 多态 实例 虚函数 纯虚函数 多态按字面的意思就是多种形态。当类之间存在层次结构&#xff0c;并且类之间是通过继承关联时&#xff0c;就会用到多态。 C 多态意味着调用成员函数时&#xff0c;会根据调用函数的对象的类型来执行不同的函数。 下面的实例中&#x…

【第0篇】从0-1自建个人博客系统【web端,admin管理端,express后端,Nginx部署】--vue3技术 reac+hook技术 umi4

【第0篇】从0-1自建个人博客系统【web端&#xff0c;admin管理端&#xff0c;后端】 文章完整地址&#xff1a;http://www.huxunxun.top/lookArtical?artical_id18 【序言】 我是一个微小的前端开发工程师。 我本不应该是一个前端开发的&#xff0c;我大学学的是计算机科学与…

2023年4月10日下午总结和近日感悟

技术和钱 人生&#xff0c;活到现阶段&#xff0c;已于一月前&#xff0c;深感技术就是这么回事&#xff0c;不再像以前那样为学习某样东西而不问来由&#xff0c;闷头去学&#xff08;也许是因为即将步入下一个人生阶段&#xff09;。虽然&#xff0c;乐于也想去接受新技术&a…