Scrapy-爬虫多开技能

Posted 玉米丛里吃过亏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Scrapy-爬虫多开技能相关的知识,希望对你有一定的参考价值。

我们知道,现在运行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

爬虫篇 | 高级爬虫:Scrapy爬虫框架的安装

戳上面的蓝字关注我们哦!

今天讲讲Scrapy ,必须掌握的爬虫框架。

  1. 介绍Scrapy,以及安装Scrapy

  2. Scrapy初级使用

  3. Scrapy 高级使用

  4. Scrapy 爬虫实战

为什么要学习Scrapy

Scrapy是一个爬虫框架,通过这个爬虫框架,我们能很快的构建出一个强大的爬虫工具!  一般大型爬虫服务都会使用Scrapy 进行爬虫,我们甚至在这个框架基础上进行一些修改,来定制自己的爬虫框架!

Scrapy学前准备

  • 前期的基础,Python基础

  • Python抓取数据的三种方式:Re, Xpath,Bs4

  • 保存数据:数据库,本地

安装Scrapy

首先说明一下,这个网站 https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted 需要的一些资源都已经无效了,这也导致网上大部分安装Scrapy的方法都失效了

接下来说一下我是怎么安装的:

win环境安装,这里我是用 Python 3.6.4 32位版本 这个一定要注意对应版本,防止出错

  1. 安装pyOpenSSL :pip install pyOpenSSL

  2. 安装lxml:使用pip install lxml

  3. 安装Scrapy :使用pip install Scrapy

重来来了

我是在安装第四步的时候出现了Twisted安装失败,提示需要VS C++ 14 ,miscrosoft build tool   打开这个网站下载vs 2017 生成工具.

https://www.visualstudio.com/zh-hans/downloads/?rr=http%3A%2F%2Flandinghub.visualstudio.com%2Fvisual-cpp-build-tools

爬虫篇 | 高级爬虫(一):Scrapy爬虫框架的安装

下载完成后,双击下载的文件,然后会提示勾选爬虫篇 | 高级爬虫(一):Scrapy爬虫框架的安装

然后就是漫长的下载vs build tools工具了. 我大概花了一个小时时间来安装吧,最后把这个vs 2017 build tools工具安装完毕后,提示重启,我重启完后,再打开cmd 然后输入 pip install Scrapy 运行,最后提示安装成功,终于搞定了!

爬虫篇 | 高级爬虫(一):Scrapy爬虫框架的安装

如果你觉得文章还不错,请大家点赞分享下。你的肯定是我最大的鼓励和支持。
【完】
如果觉得有料,来个在看,让朋友知道你越来越优秀了



说句题外话,有不少人想加我微信,看我朋友圈的每日分享,我姑且放出来,但名额有限,先来先得。 我的朋友圈不止有技术分享,更有我的日常感悟,还有我个人商业思维观点 速速扫码添加!


爬虫篇 | 高级爬虫(一):Scrapy爬虫框架的安装


扫码添加,备注:公号铁粉
推荐阅读








喜欢就在看


以上是关于Scrapy-爬虫多开技能的主要内容,如果未能解决你的问题,请参考以下文章

Python爬虫教程-32-Scrapy 爬虫框架项目 Settings.py 介绍

Scrapy爬虫-pipeline.py

4.python爬虫之新建 scrapy 爬虫项目(抓取和保存)

基于python的scrapy爬虫抓取京东商品信息

爬虫进阶必备Scrapy入门使用(深度好文)

scrapy使用