2013-03-18 23 views
13

Scrapy'yi kullanarak bir url taramaya çalışıyorum. Ama beni olmayan bir sayfaya yönlendiriyor.scrapy- nasıl yönlendirilir Yönlendirme (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> 

sorun http://www.shop.inonit.in/Products/Inonit-Home-Decor--Knick-Knacks-Cushions/Shor-Sharaba/Andaz-Apna-Apna-Cushion-Cover/pid-1275197.aspx var, ama http://www.shop.inonit.in/mobile/Products/Inonit-Home-Decor--Knick-Knacks-Cushions/Shor-Sharaba/Andaz-Apna-Apna-Cushion-Cover/1275197 değil, bu nedenle paletli bu bulamıyorum. Diğer birçok web sitesini de taradım, ancak başka bir yerde bu problemi yoktu. Bu yönlendirmeyi durdurabilmemin bir yolu var mı?

Herhangi bir yardım çok takdir edilecektir. Teşekkürler.

Güncelleme: Bu benim örümcek sınıftır

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 

cevap

11

evet sadece sen

gibi belirli bir tepki kodu için yönlendirilir durdurmak olabilir ayrıca

meta={'dont_redirect': True} 

gibi meta değerler ekleyerek yapabilirsiniz

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

yalnızca 302 yanıt kodlarını yeniden yönlendirmeyi durduracaktır.

örnek

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

Teşekkür tepki için! ama bu kod satırını nereye koyacağım konusunda biraz kafam karıştı mı? Start_request'lerin üzerine yazmayı denedim, ancak bana "Response" nesnesinin "body_as_unicode" özelliğine sahip olmamasına dair bir hata veriyor. Aynı anda bir ürün ve talep verebilir miyiz? –

+0

Yönlendirmeyle hxs = HtmlXPathSelector (yanıtı) 'yı çağırabilirsiniz. Response.status == 302' yi test etmeniz ve başka bir işlem yapmanız gerekir. Bu durumda hxs başarısız olur çünkü response.body 302 durumu için boştur –

+0

Birisi test edildi mi? Şu anki scrapy sürümü ile çalışmıyor, '' handle_httpstatus_list '' ile test ettim: [404, 301] 'sadece 404 çalışıyor –

6

Varsayılan olarak, scrapy yeniden yönlendirme işlemek için RedirectMiddleware kullanın. Yeniden yönlendirmeyi devre dışı bırakmak için REDIRECT_ENABLED öğesini False olarak ayarlayabilirsiniz. Bakınız: documentation.

+0

Denedim, "REDIRECT_ENABLED = False" ayarlıyorum, scrapy stop yönlendirme ve ayrıca html içeriğini alamıyor. – house

7

documentation'a baktıktan ve ilgili kaynağa baktıktan sonra, bunu anlayabildim. Start_requests için kaynağa bakarsanız, bunun tüm URL'ler için make_requests_from_url çağırdığını göreceksiniz. Bunun yerine start_requests değiştirme

, ben 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] 
      }) 

modifiye Ve hemen parse() yukarıda, benim örümcek parçası olarak bu ekledi.

+0

Bunu denedim ama hala istemediğim sayfaya yönlendirildim – Demonedge

+1

Bu benim için çalışıyor. Teşekkürler. – Olexandr

+0

Çalışmak istediğim site için güzel çözüm. Teşekkürler! – zsljulius

2

olarak burada açıkladı: Scrapy docs

Kullanım İsteği Meta

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