2015-07-06 10 views
5

Mam problem ze Scrapy. Potrzebuję kodu, który zrzuci do 1000 linków wewnętrznych na dany adres URL. Mój kod działa po uruchomieniu na linii poleceń, ale pająk nie zatrzymuje się, otrzymuje tylko wiadomość.Zatrzymaj się po zeskrobaniu N przedmiotów

Mój kod wygląda następująco:

from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor 
from scrapy.contrib.spiders import CrawlSpider, Rule 
from scrapy.item import Item, Field 
from scrapy.contrib.closespider import CloseSpider 

class MyItem(Item): 
    url= Field() 

class MySpider(CrawlSpider): 
    name = 'testspider1' 
    allowed_domains = ['angieslist.com'] 
    start_urls = ['http://www.angieslist.com'] 

    rules = (Rule(SgmlLinkExtractor(), callback='parse_url', follow=True),) 

    def parse_url(self, response): 
     item = MyItem() 
     item['url'] = response.url 

     scrape_count = self.crawler.stats.get_value('item_scraped_count') 
     print scrape_count 

     limit = 10 

     if scrape_count == limit: 
      raise CloseSpider('Limit Reached') 

     return item 
+0

Czy jesteś pewien, że nie zatrzyma? Wierzę, że scrapy będą przetwarzać żądania już po otrzymaniu CloseSpider. Chodzi mi o to, że nie zatrzyma się natychmiast, ale żadne nowe przedmioty nie będą wymagane. – Alik

+1

[This] (http://stackoverflow.com/questions/30928177/scrapy-limit-requests-for-testing) może być dla ciebie interesujące. –

+0

Masz rację, przestaje. Ale planuję skalować ten proces i chciałbym usunąć wszelkie niepotrzebne przetwarzanie. Miałem nadzieję, że będzie jakiś sposób, aby "zatrzymać się na bilonie". że tak powiem. –

Odpowiedz

4

Mój problem próbuje zastosować ścisłą pająka w niewłaściwym miejscu. Jest to zmienna, którą należy ustawić w pliku settings.py. Kiedy ustawiłem go ręcznie lub ustawię jako argument w wierszu poleceń, zadziałało (Zatrzymanie w granicach 10-20 z N, o ile jest to warte).

settings.py:

BOT_NAME = 'internal_links' 
SPIDER_MODULES = ['internal_links.spiders'] 
NEWSPIDER_MODULE = 'internal_links.spiders' 
CLOSESPIDER_PAGECOUNT = 1000 
ITEM_PIPELINES = ['internal_links.pipelines.CsvWriterPipeline'] 
# Crawl responsibly by identifying yourself (and your website) on the user-agent 
USER_AGENT = 'yo mama' 
LOG_LEVEL = 'DEBUG' 
+0

Zaimplementowałem tę samą metodologię i, jak sam mówisz, zatrzymuje się pomiędzy '10-20' żądanej wartości. Czy wiesz, dlaczego tak jest? Dla kompletności chcę, aby mój pająk natychmiast się zatrzymał! – gtlambert

+0

Z tego co pamiętam, proces jest asynchroniczny, a zatem nie jest natychmiastowy, gdy wysyłamy żądanie do procesu. Minęło jednak dużo czasu i pracuję nad pamięcią, więc może już tak nie być. –

+0

Przynajmniej musnąłeś się odpowiedzialnie, identyfikując siebie w kliencie użytkownika –

Powiązane problemy