15

Muszę wywołać przeszukiwacz z innego pliku Pythona, do którego używam następującego kodu.Wywołanie Scrapy z innego pliku bez gwintowania

def crawl_koovs(): 
    spider = SomeSpider() 
    settings = get_project_settings() 
    crawler = Crawler(settings) 
    crawler.signals.connect(reactor.stop, signal=signals.spider_closed) 
    crawler.configure() 
    crawler.crawl(spider) 
    crawler.start() 
    log.start() 
    reactor.run() 

na prowadzeniu tego, pojawia się błąd jak

exceptions.ValueError: signal only works in main thread 

Jedyne obejście udało mi się znaleźć jest użycie

reactor.run(installSignalHandlers=False) 

które nie chcą korzystać z jak chcę aby wywołać tę metodę wiele razy i chcieć zatrzymać reaktor przed następnym połączeniem. Co mogę zrobić, aby to działało (może wymusić uruchomienie robota w tym samym "głównym wątku")?

+0

Oto [działa przykładowy kod] (http://stackoverflow.com/questions/18838494/scrapy-very-basic-example/27744766#27744766) I Używałem wcześniej do uruchamiania Scrapy z skryptu. Mam nadzieję, że to pomoże. – alecxe

Odpowiedz

6

Pierwszą rzeczą, jaką chciałbym powiedzieć wam to, gdy jesteś wykonywania Scrapy z plików zewnętrznych loglevel jest ustawiony na INFO, należy zmienić go do debugowania, aby zobaczyć co się dzieje, jeśli kod nie działa

należy zmienić linię:

log.start() 

dla:

log.start(loglevel=log.DEBUG) 

do przechowywania wszystko w dzienniku i wygenerować tekst file (dla celów debugowania) można zrobić:

log.start(logfile="file.log", loglevel=log.DEBUG, crawler=crawler, logstdout=False) 

O emisji sygnałów z poziomu dziennika zmienił debugowania może widać jakieś wyjście, które może pomóc go naprawić, można spróbować umieścić swój skrypt do folder projektu Scrapy, aby zobaczyć, czy nadal się zawiesza.

Jeśli zmienić linię:

crawler.signals.connect(reactor.stop, signal=signals.spider_closed) 

dla:

dispatcher.connect(reactor.stop, signals.spider_closed) 

Co to znaczy?

zależności od wersji Scrapy może być przestarzała