2017-11-23 3 views
0

Kann nicht herausfinden, warum meine close-Methode nicht ausgeführt wird. Ich muss zwei Listen von URLs verarbeiten. Eine Liste muss zuerst verarbeitet und exportiert werden und die zweite Liste sollte dann verarbeitet werden.Scrapy - close-Methode Körper wird nicht ausgeführt

Das Problem ist, dass close-Methode nur aufgerufen wird (Haltepunkt stoppt bei der def), aber nicht ausgeführt. Weißt du, warum?

# coding=utf-8 
from bot.items import TestItem 
from scrapy import Spider, Request, signals 
from scrapy.exceptions import DontCloseSpider 
from scrapy.xlib.pydispatch import dispatcher 

class IndexSpider(Spider): 
    name = 'index_spider' 
    allowed_domains = ['www.doman.org'] 

    def start_requests(self): 

     for url in ["https://www.doman.org/eshop"]: 

      yield Request(url, callback=self.parse_main_page) 

    def parse_main_page(self, response): 
     self.categories = [some tuples] 
     self.subcategories = [some tuples] 

    def close(self, spider): # Execution ends here 
     pass # This is not being executed 
     if self.categories: 
      for cat in self.categories: 
       url = "https://www.doman.org/search/getAjaxResult?categoryId={}".format(cat[0]) 
       yield Request(url, meta={'tup': cat, 'priority': 0}, priority=0, callback=self.parse_category) 
      self.categories = [] 
      raise DontCloseSpider 

enter image description here

Antwort

0

Die close Methode ist eine statische Methode: https://github.com/scrapy/scrapy/blob/master/scrapy/spiders/init.py#L101 so Ihre close Methode Signatur nicht übereinstimmen.

+0

Wie sollte ich die Methode definieren? Ich habe @staticmethod versucht und wenn ich das tue, wird es nicht einmal aufgerufen. –

+0

Ich glaube nicht, dass das Hinzufügen zusätzlicher URLs in der 'close'-Methode (da Sie sie nicht überschreiben können) eine gute Lösung ist. Sie könnten Callback-Methoden definieren, um die Kategorien zu analysieren, sobald Sie diese in Ihrer 'parse_main_page'-Methode gefunden haben. –

0

Ich glaube, Sie brauchen diese Funktion wie dieses Ich

class IndexSpider(Spider): 

    def __init__(self, *args, **kwargs): 
     dispatcher.connect(self.spider_closed, signals.spider_closed) 
     super(IndexSpider, self).__init__(*args, **kwargs) 

    def spider_closed(self, spider): 
     pass # This is not being executed 
     if self.categories: 
      for cat in self.categories: 
       url = "https://www.doman.org/search/getAjaxResult?categoryId={}".format(cat[0]) 
       yield Request(url, meta={'tup': cat, 'priority': 0}, priority=0, callback=self.parse_category) 
      self.categories = [] 
      raise DontCloseSpider 

auch registrieren bin nicht sicher, ob Sie Anfragen mehr von innen spider_closed Funktion senden kann, weil Spinnen bereits dort geschlossen wurde.

In Ihrem Fall empfehle ich Ihnen, den gesamten Code aus spider_closed Methode zu entfernen, und schreiben Sie einfach eine beliebige Druck Nachricht wie diese auf diese Weise Sie

def spider_closed(self, spider): 
     logging.info("spider_closed() called") 

So wissen spider_closed genannt wurde, und dann versuchen, Anfrageformular innerhalb dieser schicken Methode.

Verwandte Themen