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 ,必须掌握的爬虫框架。
介绍Scrapy,以及安装Scrapy
Scrapy初级使用
Scrapy 高级使用
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位版本 这个一定要注意对应版本,防止出错
安装pyOpenSSL :pip install pyOpenSSL
安装lxml:使用pip install lxml
安装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
下载完成后,双击下载的文件,然后会提示勾选
然后就是漫长的下载vs build tools工具了. 我大概花了一个小时时间来安装吧,最后把这个vs 2017 build tools工具安装完毕后,提示重启,我重启完后,再打开cmd 然后输入 pip install Scrapy 运行,最后提示安装成功,终于搞定了!
如果觉得有料,来个在看,让朋友知道你越来越优秀了
扫码添加,备注:公号铁粉
以上是关于Scrapy-爬虫多开技能的主要内容,如果未能解决你的问题,请参考以下文章
Python爬虫教程-32-Scrapy 爬虫框架项目 Settings.py 介绍