2016-09-07 4 views
3

Ich möchte eine Website mit 2 Teilen crawlen und mein Skript ist nicht so schnell wie ich brauche.Laufen mehrere Spinnen in scrapy für 1 Website parallel?

ist es möglich, 2 Spinnen, eine für das Schaben des ersten Teils und die zweite für das zweite Teil zu luanch?

Ich habe versucht 2 diffrent Klassen haben, und sie laufen

scrapy crwal firstSpider 
scrapy crawl secondSpider 

aber ich denke, dass es nicht klug ist.

Ich lese die documentation of scrapyd, aber ich weiß nicht, ob es gut für meinen Fall ist.

Antwort

5

Ich denke, was Sie suchen, ist so etwas wie folgt aus: running-multiple-spiders-in-the-same-process:

import scrapy 
from scrapy.crawler import CrawlerProcess 

class MySpider1(scrapy.Spider): 
    # Your first spider definition 
    ... 

class MySpider2(scrapy.Spider): 
    # Your second spider definition 
    ... 

process = CrawlerProcess() 
process.crawl(MySpider1) 
process.crawl(MySpider2) 
process.start() # the script will block here until all crawling jobs are finished 

Sie können mehr lesen.

+0

Dank Mann, es ist genau etwas umgewandelt werden, was ich – parik

3

Oder Sie können mit wie folgt ausführen, müssen Sie mit scrapy.cfg im gleichen Verzeichnis diesen Code speichern (My scrapy Version 1.3.3):

from scrapy.utils.project import get_project_settings 
from scrapy.crawler import CrawlerProcess 

setting = get_project_settings() 
process = CrawlerProcess(setting) 

for spider_name in process.spiders.list(): 
    print ("Running spider %s" % (spider_name)) 
    process.crawl(spider_name,query="dvh") #query dvh is custom argument used in your scrapy 

process.start() 
+0

brauche es auch funktioniert, dank – parik

+0

[twisted] KRITISCH: Unbehandelter Fehler in Deferred: – zhilevan

1

bessere Lösung ist (wenn Sie mehrere Spinnen) es dynamisch Spinnen und laufen sie.

from scrapy import spiderloader 
from scrapy.utils import project 
from twisted.internet.defer import inlineCallbacks 


@inlineCallbacks 
def crawl(): 
    settings = project.get_project_settings() 
    spider_loader = spiderloader.SpiderLoader.from_settings(settings) 
    spiders = spider_loader.list() 
    classes = [spider_loader.load(name) for name in spiders] 
    for my_spider in classes: 
     yield runner.crawl(my_spider) 
    reactor.stop() 

crawl() 
reactor.run() 

(Zweite Lösung): Da spiders.list() in Scrapy 1.4 Yuda Lösung veraltet ist, sollte wie

from scrapy.utils.project import get_project_settings 
from scrapy.crawler import CrawlerProcess 

setting = get_project_settings() 
spider_loader = spiderloader.SpiderLoader.from_settings(settings) 

for spider_name in spider_loader.list(): 
    print ("Running spider %s" % (spider_name)) 
    process.crawl(spider_name) 
process.start() 
Verwandte Themen