2016-11-14 4 views
1

Ich habe in meinem CrawlerSpider process_request in Regeln wie diese scrapy-splash integriert:scrapy-splash kriecht nicht rekursiv mit CrawlerSpider

def process_request(self,request): 
    request.meta['splash']={ 
     'args': { 
      # set rendering arguments here 
      'html': 1, 
     } 
    } 
    return request 

Das Problem ist, dass die Crawl-Renderings urls nur in der ersten Tiefe, I frage mich auch, wie ich auch mit schlechtem http-code oder umgeleiteter antwort antworten kann;

Vielen Dank im Voraus,

Antwort

0

Ihr Problem im Zusammenhang mit dieser werden kann: https://github.com/scrapy-plugins/scrapy-splash/issues/92

Kurz gesagt, versuchen Sie diese Callback-Funktion, um Ihre Analyse hinzuzufügen:

def parse_item(self, response): 
    """Parse response into item also create new requests.""" 

    page = RescrapItem() 
    ... 
    yield page 

    if isinstance(response, (HtmlResponse, SplashTextResponse)): 
     seen = set() 
     for n, rule in enumerate(self._rules): 
      links = [lnk for lnk in rule.link_extractor.extract_links(response) 
        if lnk not in seen] 
      if links and rule.process_links: 
       links = rule.process_links(links) 
      for link in links: 
       seen.add(link) 
       r = SplashRequest(url=link.url, callback=self._response_downloaded, 
               args=SPLASH_RENDER_ARGS) 
       r.meta.update(rule=rule, link_text=link.text) 
       yield rule.process_request(r) 

Falls Sie sich fragen, Warum könnte dies sowohl Elemente als auch neue Anforderungen zurückgeben. Hier ist aus dem doc: https://doc.scrapy.org/en/latest/topics/spiders.html

In der Callback-Funktion, können Sie die Antwort (Webseite) zu analysieren und Rück entweder dicts mit extrahierten Daten, Item-Objekten, anfordern Objekte oder ein iterable davon Objekte. Diese Anfragen enthalten auch einen Rückruf (vielleicht gleich) und werden dann von Scrapy heruntergeladen und dann ihre Antwort von dem angegebenen Rückruf behandelt.