有很多时候我们需要从多个网站爬取所需要的数据,比如我们想爬取多个网站的新闻,将其存储到数据库同一个表中。我们是不是要对每个网站都得去定义一个Spider类呢? 其实不需要,我们可以通过维护一个规则配置表或者一个规则配置文件来动态增加或修改爬取规则,然后程序代码不需要更改就能实现多个网站爬取。
要这样做,我们就不能再使用前面的scrapy crawl test
这种命令了,我们需要使用编程的方式运行Scrapy spid
可以利用scrapy提供的核心API通过编程方式启动scrapy,代替传统的scrapy crawl
启动方式。Scrapy构建于Twisted异步网络框架基础之上,因此你需要在Twisted reactor里面运行。首先你可以使用scrapy.crawler.CrawlerProcess
这个类来运行你的spider,这个类会为你启动一个Twisted reactor,并能配置你的日志和shutdown处理器。所有的scrapy命令都使用这个类
首先在main.py文件中修改代码,不能用excute,使用如下代码:
import scrapy
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
process = CrawlerProcess(get_project_settings())
process.crawl('maoyan')#爬虫名称
process.crawl('maoyan2')#爬虫名称
process.start() # the script will block here until the crawling is finished
测试同进程的的方发,修改crawl源码,并在setting标注。
首先在item.py同目录下创建一个文件夹,取名mycmd。其次在文件夹中建立一个空值的__init__.py文件还有一个,mycrawl.py文件,然把下边的代码复制进去。,然后在setting.py文件中加入COMMANDS_MODULE = 'basicdemo.mycmd',其中basicdemo是工程名称,mycmd是文件夹名称
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):
requires_project = True
def syntax(self):
return "[options] <spider>"
def short_desc(self):
return "Run a spider"
def add_options(self, parser):
ScrapyCommand.add_options(self, parser)
parser.add_option("-a", dest="spargs", action="append", default=[], metavar="NAME=VALUE",
help="set spider argument (may be repeated)")