2014-07-04 5 views
5

Durante la mia scansione, alcune pagine non sono riuscite a causa di reindirizzamenti imprevisti e nessuna risposta è stata restituita. Come posso rilevare questo tipo di errore e riprogrammare una richiesta con l'url originale, non con l'url reindirizzato?Scrapy: come rilevare l'errore di download e provare a scaricarlo di nuovo

Prima di chiedere qui, faccio molte ricerche con Google. Sembra che ci siano due modi per risolvere questo problema. uno è l'eccezione di catch in un middleware di download, l'altro è l'elaborazione dell'eccezione di download in errore nella richiesta di spider. Per queste due domande, ho alcune domande.

  • Per il metodo 1, non so come passare l'url originale alla funzione process_exception. Di seguito è riportato il codice di esempio che ho provato.
class ProxyMiddleware(object): 

    def process_request(self, request, spider): 
     request.meta['proxy'] = "http://192.168.10.10" 
     log.msg('>>>> Proxy %s'%(request.meta['proxy'] if request.meta['proxy'] else ""), level=log.DEBUG) 
    def process_exception(self, request, exception, spider): 
     log_msg('Failed to request url %s with proxy %s with exception %s' % (request.url, proxy if proxy else 'nil', str(exception))) 
     #retry again. 
     return request 
  • Per il metodo 2, non so come passare parametri esterna per errback funzione nel ragno. Non so come recuperare l'url originale da questa funzione errback per riprogrammare una richiesta.

    Di seguito l'esempio ho provato con il metodo 2:

class ProxytestSpider(Spider): 

    name = "proxytest" 
    allowed_domains = ["baidu.com"] 
    start_urls = (
     'http://www.baidu.com/', 
     ) 
    def make_requests_from_url(self, url): 
     starturl = url 
     request = Request(url, dont_filter=True,callback = self.parse, errback = self.download_errback) 
     print "make requests" 
     return request 
    def parse(self, response): 
     pass 
     print "in parse function"   
    def download_errback(self, e): 
     print type(e), repr(e) 
     print repr(e.value) 
     print "in downloaderror_callback" 

Qualsiasi suggerimento per questo problema nuova scansione è molto apprezzato. Grazie in anticipo.

saluti

Bing

+0

@ dabling1205, ci mostrano quello che hai provato –

+0

Il post sembra una cucciolata disordinato, Sono nuovo di qui e non hanno familiarità con il formato di modifica, :) – dabing1205

risposta

1

Si potrebbe passare un lambda come un errback:

request = Request(url, dont_filter=True,callback = self.parse, errback = lambda x: self.download_errback(x, url)) 

in questo modo avrete accesso all'URL all'interno della funzione errback:

def download_errback(self, e, url): 
    print url 
+0

Grazie per la tua risposta, questo funziona bene. Grazie ancora. Compagni – dabing1205

0

è possibile ignorare RETRY_HTTP_CODES in settings.py

Questa è le impostazioni che uso per gli errori del proxy:

RETRY_HTTP_CODES = [500, 502, 503, 504, 400, 403, 404, 408] 
+1

, Grazie per la risposta. I tuoi commenti funzionano bene nel caso in cui il download abbia una risposta restituita con uno stato. :), non per l'errore di download. – dabing1205

+0

grazie per aver commentato @ dabing1205. Ti dispiacerebbe condividere il caso in cui riscontri un errore o il tipo di Eccezione? –

Problemi correlati