如何使用Scrapy一次运行一个蜘蛛的多个版本?

时间:2018-10-24 20:07:04

标签: python scrapy

我的问题如下:

为了赢得时间,我想运行一个蜘蛛的多个版本。 流程(解析定义)相同,项目相同,数据库中的集合相同。发生变化的是start_url变量。 看起来像这样:

"https://www.website.com/details/{0}-{1}-{2}/{3}/meeting".format(year,month,day,type_of_meeting)

考虑日期是相同的,例如2018-10-24,我想同时启动两个版本:

  • 版本1 type_of_meeting = pmu
  • 带有type_of_meeting = pmh的版本2

这是我有问题的第一部分。在这里,我想知道是否必须在一个蜘蛛中创建两个不同的类,例如class SpiderPmu(scrapy.Spider):中的class SpiderPmh(scrapy.Spider):spider.py。但是,如果这是您认为我必须做的最好方法,那么考虑到settings.py,pipelines.py,我不知道如何实现它。我已经从CrawlerProcess模块中了解了scrapy.crawler的信息,但是我不太了解如何在我的项目中实现它。 stack subjectscrapy doc。我不确定这部分 process = CrawlerProcess() process.crawl(MySpider1) process.crawl(MySpider2) process.start()必须在spider.py文件中。最重要的是,我不确定它是否可以解决我遇到的问题。

第二部分是如何根据不同的日期间隔启动多个版本。

我已经在蜘蛛类中创建了一定范围的间隔,例如:

  • year = range(2005,2019)
  • month = range(1,13)
  • day = range(1,32)

并使其循环。效果很好。

但是为了赢得时间,我想以不同的间隔发射几只蜘蛛。

  • 第一个带有year = range(2005,2007)的版本
  • 带有year = range(2007,2009)的第二版
  • 依次类推,直到year = range(2017,2019)

同时具有七个版本意味着速度提高了七倍。

我可以在每个年份范围内创建7个不同的项目,但是我认为这不是最明智的方法...而且我不确定是否会在使用相同的集合数据库进行7年的冲突中产生冲突不同项目同时运行。

我希望做一些类似打开7个命令的操作:

  1. scrapy crawl spiderpmu用于版本type_of_race = pmu
  2. "Enter a range of year":raw_input = 2010, 2012 ==> range(2010,2012)
  3. 蜘蛛正在爬行

并行执行(如果必须这样做):

  1. scrapy crawl spiderpmh用于版本type_of_race = pmh
  2. "Enter a range of year":raw_input = 2010, 2012 ==> range(2010,2012)
  3. 蜘蛛正在爬行

可能使用一个蜘蛛,或在需要时使用一个项目。

我该怎么办?

PS:我已经与prolipo作代理,通过Tor网络更改IP,USER_AGENT一直在变化。因此,我避免被多个蜘蛛同时爬行而被禁止。我的蜘蛛对AUTOTHROTTLE_ENABLED = True很有礼貌。我想保持礼貌,但是要更快。

Scrapy版本:1.5.0,Python版本:2.7.9,Mongodb版本:3.6.4,Pymongo版本:3.6.1

2 个答案:

答案 0 :(得分:0)

Scrapy支持蜘蛛参数。奇怪的是,没有简单的文档,但我会尝试填写:

运行crawl命令时,您可以提供-a NAME=VALUE参数,这些参数将被设置为您的Spider类实例变量。例如:

class MySpider(Spider):
    name = 'arg'
    # we will set below when running the crawler
    foo = None 
    bar = None

    def start_requests(self):
        url = f'http://example.com/{self.foo}/{self.bar}'
        yield Request(url)

如果我们运行它:

scrapy crawl arg -a foo=1 -a bar=2
# will crawl example.com/1/2

答案 1 :(得分:0)

因此,我找到了一个受scrapy crawl -a variable=value

启发的解决方案

“蜘蛛”文件夹中的相关蜘蛛已被转换:

class MySpider(scrapy.Spider):
name = "arg"
allowed_domains = ['www.website.com']

    def __init__ (self, lo_lim=None, up_lim=None , type_of_race = None) : #lo_lim = 2017 , up_lim = 2019, type_of_race = pmu
        year  = range(int(lo_lim), int(up_lim)) # lower limit, upper limit, must be convert to integer type, instead this is string type
        month = range(1,13) #12 months
        day   = range(1,32) #31 days
        url   = []
        for y in year:
            for m in month:
                for d in day:
                    url.append("https://www.website.com/details/{}-{}-{}/{}/meeting".format(y,m,d,type_of_race))

        self.start_urls = url #where url = ["https://www.website.com/details/2017-1-1/pmu/meeting",
                                        #"https://www.website.com/details/2017-1-2/pmu/meeting",
                                        #...
                                        #"https://www.website.com/details/2017-12-31/pmu/meeting"
                                        #"https://www.website.com/details/2018-1-1/pmu/meeting",
                                        #"https://www.website.com/details/2018-1-2/pmu/meeting",
                                        #...
                                        #"https://www.website.com/details/2018-12-31/pmu/meeting"]

    def parse(self, response):
        ...`

然后,它回答了我的问题:保留一个蜘蛛,并通过服务器命令一次运行它的多个版本而没有麻烦。

没有def __init__,对我来说不起作用。我尝试了很多方法,这就是对我有用的完美代码。

Scrapy版本:1.5.0,Python版本:2.7.9,Mongodb版本:3.6.4,Pymongo版本:3.6.1