2017-04-01 2 views
1

Ich habe einen einfachen Code in Scrapy -Scrapy Ausbeute Antwortobjekt in start_request Methode

def start_requests(self): 
    response = scrapy.Request(url,callback=self.parse_response) 
    response.meta['some_useful_params'] = some_useful_params 
    yield response 

def parse_respone(self,resposne): 
    some_useful_params = response.meta['some_useful_params'] 
    do_parsing_stuff() 
    if some_conditon==True: 
     presponse = scrapy.Request(otherurl,callback=self.parse_response) 
     presponse.meta['some_useful_params'] = some_useful_params 
     yield presponse 
    else: 
     yield items 

Das obige Programm funktioniert gut für mich, aber ich brauche es, um etwas zu ändern, die überprüft, ob die html bereits existiert diese Seite, dann nehmen Sie das als HTML, anstatt Anfrage an die Website.

Jetzt ist der Code für die -

def start_requests(self): 
    if html_exist: 
     request = scrapy.Request(url) 
     request.meta['some_useful_params'] = some_useful_params 
     response = scrapy.http.Response(url,body=cached_html,request=request) 
     #the below line doesn't call the method parse_response 
     self.parse_response(response) 
    else: 
     response = scrapy.Request(url,callback=self.parse_response) 
     response.meta['some_useful_params'] = some_useful_params 
     yield response 

def parse_respone(self,resposne): 
    some_useful_params = response.meta['some_useful_params'] 
    do_parsing_stuff() 
    if some_conditon==True: 
     if html_exist: 
      request = scrapy.Request(url) 
      request.meta['some_useful_params'] = some_useful_params 
      presponse = scrapy.http.Response(url,body=cached_html,request=request) 
      #the below line doesn't call the method parse_response 
      self.parse_response(presponse) 
     else: 
      presponse = scrapy.Request(otherurl,callback=self.parse_response) 
      presponse.meta['some_useful_params'] = some_useful_params 
      yield presponse 
    else: 
     yield items 

Das Problem, das ich bin vor in dem zweiten Code, wenn HTML-Exits, ruft Methode parse_response nicht geschieht.

Obwohl ich den Grund nicht vollständig verstehe, aber ich denke, es ist etwas mit Python-Generatoren verwandt, wie kann ich dieses Problem beheben.?

Antwort

0

müssen Sie die items oder requests, nicht nur die Methode aufrufen Ausbeute:

for item_or_request in self.parse_response(response): 
    yield item_or_request 
+0

ist es eine Möglichkeit, durch die ich die html (Cache-Kopie) auf das Request-Objekt festlegen können stattdessen einen Antrag machen zu Die Webseite? – sagar

+1

können Sie die ['HttpCacheMiddleware'] (https://doc.scrapy.org/en/latest/topics/downloader-middleware.html#module-scrapy.downloadermiddlewares.httpcache) verwenden – eLRuLL