Python 使用不同设置从脚本运行两个连续的Scrapy Crawler进程

Python 使用不同设置从脚本运行两个连续的Scrapy Crawler进程,python,scrapy,Python,Scrapy,启动时,我有两个不同的Scrapy爬行器: scrapy crawl spidername -o data\whatever.json 当然,我知道我可以使用脚本中的系统调用来复制该命令,但我更愿意坚持使用CrawlerProcess或任何其他方法使其从脚本中工作 问题是:在读入时(以及在Scrapy docs中),我必须在CrawlerProcess构造函数的设置中设置输出文件: process = CrawlerProcess({ 'USER_AGENT': 'Mozilla/4.0 (c

启动时,我有两个不同的
Scrapy
爬行器:

scrapy crawl spidername -o data\whatever.json
当然,我知道我可以使用脚本中的系统调用来复制该命令,但我更愿意坚持使用
CrawlerProcess
或任何其他方法使其从脚本中工作

问题是:在读入时(以及在Scrapy docs中),我必须在
CrawlerProcess
构造函数的设置中设置输出文件:

process = CrawlerProcess({
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
'FEED_FORMAT': 'json',
'FEED_URI': 'data.json'
})
问题是我不希望两个spider都将数据存储到同一个输出文件中,而是存储到两个不同的文件中。因此,我的第一次尝试显然是创建一个新的
CrawlerProcess
,在完成第一个作业时使用不同的设置:

session_date_format = '%Y%m%d'
session_date = datetime.now().strftime(session_date_format)

try:
    process = CrawlerProcess({
        'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
        'FEED_FORMAT': 'json',
        'FEED_URI': os.path.join('data', 'an_origin', '{}.json'.format(session_date)),
        'DOWNLOAD_DELAY': 3,
        'LOG_STDOUT': True,
        'LOG_FILE': 'scrapy_log.txt',
        'ROBOTSTXT_OBEY': False,
        'RETRY_ENABLED': True,
        'RETRY_HTTP_CODES': [500, 503, 504, 400, 404, 408],
        'RETRY_TIMES': 5
    })
    process.crawl(MyFirstSpider)
    process.start()  # the script will block here until the crawling is finished
except Exception as e:
    print('ERROR while crawling: {}'.format(e))
else:
    print('Data successfuly crawled')

time.sleep(3)  # Wait 3 seconds

try:
    process = CrawlerProcess({
        'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)',
        'FEED_FORMAT': 'json',
        'FEED_URI': os.path.join('data', 'other_origin', '{}.json'.format(session_date)),
        'DOWNLOAD_DELAY': 3,
        'LOG_STDOUT': True,
        'LOG_FILE': 'scrapy_log.txt',
        'ROBOTSTXT_OBEY': False,
        'RETRY_ENABLED': True,
        'RETRY_HTTP_CODES': [500, 503, 504, 400, 404, 408],
        'RETRY_TIMES': 5
    })
    process.crawl(MyOtherSpider)
    process.start()  # the script will block here until the crawling is finished
except Exception as e:
    print('ERROR while crawling: {}'.format(e))
else:
    print('Data successfuly crawled')
当我这样做时,第一个
爬虫程序
按预期工作。但是,第二个创建一个空输出文件并失败。如果我将第二个
CrawlerProcess
存储到另一个变量中,例如
process2
,也会发生这种情况。显然,我试图改变蜘蛛的顺序,以检查这是否是某个蜘蛛的问题,但失败的蜘蛛总是排在第二位的蜘蛛

如果我检查日志文件,在第一个作业完成后,似乎启动了两个Scrapy Bot,因此可能发生了一些奇怪的事情:

2017-05-29 23:51:41 [scrapy.extensions.feedexport] INFO: Stored json feed (2284 items) in: data\one_origin\20170529.json
2017-05-29 23:51:41 [scrapy.core.engine] INFO: Spider closed (finished)
2017-05-29 23:51:41 [stdout] INFO: Data successfuly crawled
2017-05-29 23:51:44 [scrapy.utils.log] INFO: Scrapy 1.3.2 started (bot: scrapybot)
2017-05-29 23:51:44 [scrapy.utils.log] INFO: Scrapy 1.3.2 started (bot: scrapybot)
2017-05-29 23:51:44 [scrapy.utils.log] INFO: Overridden settings: {'LOG_FILE': 'scrapy_output.txt', 'FEED_FORMAT': 'json', 'FEED_URI': 'data\\other_origin\\20170529.json', 'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)', 'LOG_STDOUT': True, 'RETRY_TIMES': 5, 'RETRY_HTTP_CODES': [500, 503, 504, 400, 404, 408], 'DOWNLOAD_DELAY': 3}
2017-05-29 23:51:44 [scrapy.utils.log] INFO: Overridden settings: {'LOG_FILE': 'scrapy_output.txt', 'FEED_FORMAT': 'json', 'FEED_URI': 'data\\other_origin\\20170529.json', 'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)', 'LOG_STDOUT': True, 'RETRY_TIMES': 5, 'RETRY_HTTP_CODES': [500, 503, 504, 400, 404, 408], 'DOWNLOAD_DELAY': 3}
...
2017-05-29 23:51:44 [scrapy.core.engine] INFO: Spider opened
2017-05-29 23:51:44 [scrapy.core.engine] INFO: Spider opened
2017-05-29 23:51:44 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2017-05-29 23:51:44 [scrapy.extensions.logstats] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2017-05-29 23:51:44 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6024
2017-05-29 23:51:44 [scrapy.extensions.telnet] DEBUG: Telnet console listening on 127.0.0.1:6024
2017-05-29 23:51:44 [stdout] INFO: ERROR while crawling:
2017-05-29 23:51:44 [stdout] INFO: ERROR while crawling:
知道发生了什么以及如何解决这个问题吗?

process.start()
在脚本的最后,两个scraper将同时运行

PS:我已经做过这种事情了

下面是我正在分享的一些代码

batches = 10
while batches > 0:
    process = CrawlerProcess( SETTINGS HERE )
    process.crawl(AmazonSpider())
    batches = batches - 1

process.start() # then finally run your Spiders.

在脚本的最后,两个scraper将同时运行

PS:我已经做过这种事情了

下面是我正在分享的一些代码

batches = 10
while batches > 0:
    process = CrawlerProcess( SETTINGS HERE )
    process.crawl(AmazonSpider())
    batches = batches - 1

process.start() # then finally run your Spiders.

每个蜘蛛都有不同的设置。基于和


每个蜘蛛都有不同的设置。基于和


您可以查看my,它使用
crawlerunner
您可以查看my,它使用
crawlerunner
如果我这样做,那么我不能为每个爬行器设置不同的设置,如果我想要不同的输出,我需要这样做files@RomanRdgz请参阅编辑的代码。。。我想你可以这样设置如果我这样做,那么我不能为每个蜘蛛设置不同的设置,如果我想要不同的输出,我需要这样做files@RomanRdgz请参阅编辑的代码。。。我想你可以这样设置