2013-03-18 14 views
13

Sto provando a gattonare un URL usando Scrapy. Ma mi reindirizza alla pagina che non esiste.scrapy- come smettere di reindirizzare (302)

Redirecting (302) to <GET http://www.shop.inonit.in/mobile/Products/Inonit-Home-Decor--Knick-Knacks-Cushions/Shor-Sharaba/Andaz-Apna-Apna-Cushion-Cover/1275197> from <GET http://www.shop.inonit.in/Products/Inonit-Home-Decor--Knick-Knacks-Cushions/Shor-Sharaba/Andaz-Apna-Apna-Cushion-Cover/pid-1275197.aspx> 

Il problema è http://www.shop.inonit.in/Products/Inonit-Home-Decor--Knick-Knacks-Cushions/Shor-Sharaba/Andaz-Apna-Apna-Cushion-Cover/pid-1275197.aspx esiste, ma http://www.shop.inonit.in/mobile/Products/Inonit-Home-Decor--Knick-Knacks-Cushions/Shor-Sharaba/Andaz-Apna-Apna-Cushion-Cover/1275197 non lo fa, in modo che il crawler cant trovare questo. Ho effettuato la scansione di molti altri siti Web, ma non ho riscontrato questo problema da nessun'altra parte. C'è un modo per fermare questo reindirizzamento?

Qualsiasi aiuto sarebbe molto apprezzato. Grazie.

Aggiornamento: Questa è la mia classe di ragno

class Inon_Spider(BaseSpider): 
name = 'Inon' 
allowed_domains = ['www.shop.inonit.in'] 

start_urls = ['http://www.shop.inonit.in/Products/Inonit-Gadget-Accessories-Mobile-Covers/-The-Red-Tag/Samsung-Note-2-Dead-Mau/pid-2656465.aspx'] 

def parse(self, response): 

    item = DealspiderItem() 
    hxs = HtmlXPathSelector(response) 

    title = hxs.select('//div[@class="aboutproduct"]/div[@class="container9"]/div[@class="ctl_aboutbrand"]/h1/text()').extract() 
    price = hxs.select('//span[@id="ctl00_ContentPlaceHolder1_Price_ctl00_spnWebPrice"]/span[@class="offer"]/span[@id="ctl00_ContentPlaceHolder1_Price_ctl00_lblOfferPrice"]/text()').extract() 
    prc = price[0].replace("Rs. ","") 
    description = [] 

    item['price'] = prc 
    item['title'] = title 
    item['description'] = description 
    item['url'] = response.url 

    return item 

risposta

11

sì, è possibile farlo semplicemente aggiungendo i valori di meta come

meta={'dont_redirect': True} 

anche ci si può fermare reindirizzato per un particolare codice di risposta come

meta={'dont_redirect': True,"handle_httpstatus_list": [302]} 

interromperà il reindirizzamento solo 302 codici di risposta.

esempio

 yield Request('some url', 
        meta = { 
         'dont_redirect': True, 
         'handle_httpstatus_list': [302] 
        }, 
        callback= self.some_call_back) 
+1

Grazie per la risposta! ma sono un po 'confuso su dove mettere questa riga di codice? Ho provato a sovrascrivere start_requests, ma mi dà un errore L'oggetto "Response" non ha attributo "body_as_unicode" ". Possiamo restituire un articolo e richiedere allo stesso tempo? –

+0

È possibile chiamare hxs = HtmlXPathSelector (risposta) con il reindirizzamento per testare response.status == 302 e eseguire un altro tipo di elaborazione. Gli hx in quel caso falliranno perché response.body è vuoto per lo stato 302 –

+0

Qualcuno ha provato? non funziona con la versione corrente di scrapy, ho provato con ''handle_httpstatus_list': [404, 301]' solo 404 funziona –

6

Per impostazione predefinita, Scrapy utilizzare RedirectMiddleware per gestire il reindirizzamento. È possibile impostare REDIRECT_ENABLED su False per disabilitare il reindirizzamento.

Vedere documentation.

+0

Ho provato, se ho impostato "REDIRECT_ENABLED = False", il redirect interrompe lo scrapy, e inoltre non è possibile ottenere il contenuto html. – house

7

Dopo aver esaminato lo documentation e aver esaminato la fonte pertinente, sono riuscito a capirlo. Se guardi nella fonte per start_requests, vedrai che chiama make_requests_from_url per tutti gli URL.

Invece di modificare start_requests, ho modificato make_requests_from_url

def make_requests_from_url(self, url): 
     return Request(url, dont_filter=True, meta = { 
        'dont_redirect': True, 
        'handle_httpstatus_list': [301,302] 
      }) 

e ha aggiunto questo come parte del mio ragno, proprio sopra parse().

+0

Ho provato questo, ma continuo a essere reindirizzato alla pagina che non voglio – Demonedge

+1

Questo funziona per me. Grazie. – Olexandr

+0

Bella soluzione per il sito con cui voglio lavorare. Grazie! – zsljulius

2

Come spiegato qui: Scrapy docs

richiesta per l'utilizzo Meta

request = scrapy.Request(link.url, callback=self.parse2) 
request.meta['dont_redirect'] = True 
yield request