2015-11-13 27 views
5

Utknąłem podczas inicjowania wielu wystąpień tego samego pająka. Chcę uruchomić go jak 1 URL dla 1 instancji pająka. Muszę przetworzyć 50k adresów URL i do tego muszę zainicjować oddzielne wystąpienia dla każdego. W moim głównym skrypcie pająków ustawiłem timeut na closedpider na 7 minut, aby mieć pewność, że nie będę się czołgał przez dłuższy czas. Proszę patrz poniższy kod:Scrapy - jak zainicjować wiele wystąpień tego samego procesu pająka?

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

for start_url in all_urls: 
    domain = urlparse.urlparse(start_url).netloc 
    if domain.startswith('ww'): 
     domain = domain.split(".",1)[1] 

    process = CrawlerProcess(get_project_settings()) 
    process.crawl('textextractor', start_url=start_url,allowed_domains=domain) 
    process.start() 

To działa całkowicie na 1 url, bur po tym, gdy 2nd url przepuszcza ona daje poniżej błędu:

raise error.ReactorNotRestartable() 
ReactorNotRestartable 

Proszę zasugerować co należy zrobić, aby uczynić go uruchom dla wielu wystąpień tego samego pająka. Ponadto, myślę, aby zainicjować wiele przypadków scrapy na raz za pomocą wątków. Czy byłoby to dobre podejście?

+0

każdej aktualizacji w tej sprawie? – UriCS

Odpowiedz

0

Jak o tym

process = CrawlerProcess(get_project_settings()) 

for start_url in all_urls: 
    domain = urlparse.urlparse(start_url).netloc 
    if domain.startswith('ww'): 
     domain = domain.split(".",1)[1] 
    process.crawl('textextractor', start_url=start_url,allowed_domains=domain) 

process.start() 
+0

furas Przetestowałem z twoim rozwiązaniem, ale nie zapewnia to właściwych rezultatów. To rozwiązanie inicjuje wiele wystąpień bez podania błędu "' 'ReactorNotRestartable''', ale całkowicie przeszukuje tylko ostatni adres URL i dla innych adresów URL zaczyna się indeksować, ale nie indeksuj więcej niż 1 adresu URL i nie kończy się pająk. Sprawdziłem te adresy oddzielnie i zwracają na nie dużo przeszukiwanych danych. Plus jak już wspomniałem, muszę zrobić to dla 50k adresów URL, czy to oznacza, że ​​zaczynam proces indeksowania naraz 50k? Czy wydaje się to dobrym podejściem? – user3721618