我的问题如下:
为了赢得时间,我想运行一个蜘蛛的多个版本。 流程(解析定义)相同,项目相同,数据库中的集合相同。发生变化的是start_url变量。 看起来像这样:
"https://www.website.com/details/{0}-{1}-{2}/{3}/meeting".format(year,month,day,type_of_meeting)
考虑日期是相同的,例如2018-10-24,我想同时启动两个版本:
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 subject,scrapy 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个命令的操作:
scrapy crawl spiderpmu
用于版本type_of_race = pmu
"Enter a range of year":
与raw_input = 2010, 2012
==> range(2010,2012)
并行执行(如果必须这样做):
scrapy crawl spiderpmh
用于版本type_of_race = pmh
"Enter a range of year":
与raw_input = 2010, 2012
==> range(2010,2012)
可能使用一个蜘蛛,或在需要时使用一个项目。
我该怎么办?
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
答案 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