2013-03-18 11 views
13

Próbuję zaindeksować adres URL za pomocą usługi Scrapy. Ale przekierowuje mnie do strony, która nie istnieje.Złomowanie - sposób zatrzymania przekierowania (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> 

Problemem jest http://www.shop.inonit.in/Products/Inonit-Home-Decor--Knick-Knacks-Cushions/Shor-Sharaba/Andaz-Apna-Apna-Cushion-Cover/pid-1275197.aspx istnieje, ale http://www.shop.inonit.in/mobile/Products/Inonit-Home-Decor--Knick-Knacks-Cushions/Shor-Sharaba/Andaz-Apna-Apna-Cushion-Cover/1275197 nie, więc robot nie może znaleźć tego. Zindeksowałem też wiele innych witryn, ale nigdzie indziej nie miałem tego problemu. Czy istnieje sposób, aby zatrzymać to przekierowanie?

Każda pomoc będzie mile widziana. Dzięki.

Aktualizacja: To jest moja klasa pająk

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 

Odpowiedz

11

tak można to zrobić po prostu przez dodanie wartości meta jak

meta={'dont_redirect': True} 

także można zatrzymać przekierowany do określonego kodu odpowiedzi jak

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

przestanie przekierowywać tylko 302 kody odpowiedzi.

przykład

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

Dzięki za odpowiedzi! ale jestem trochę zdezorientowany, gdzie umieścić tę linię kodu? Próbowałem zastąpić start_request, ale daje mi błąd "Response" obiekt nie ma atrybutu "body_as_unicode" ". Czy możemy zwrócić przedmiot i zażądać w tym samym czasie? –

+0

Możesz wywołać hxs = HtmlXPathSelector (odpowiedź) z przekierowaniem, które musisz przetestować response.status == 302 i wykonać inny rodzaj przetwarzania. W takim przypadku hxs nie powiedzie się, ponieważ response.body jest pusty dla statusu 302 –

+0

Czy ktoś przetestował? nie działa z aktualną wersją scrapy, testowałem z ''handle_httpstatus_list': [404, 301]' tylko 404 działa –

6

Domyślnie Scrapy używać RedirectMiddleware obsłużyć przekierowanie. Możesz ustawić REDIRECT_ENABLED na False, aby wyłączyć przekierowanie.

Zobacz documentation.

+0

Próbowałem, jeśli ustawię "REDIRECT_ENABLED = False", scrapy zatrzymują przekierowanie, a także nie mogą uzyskać zawartości html. – house

7

Po obejrzeniu documentation i przejrzeniu odpowiedniego źródła, udało mi się go rozgryźć. Jeśli spojrzysz na źródło dla start_requests, zobaczysz, że wywołuje make_requests_from_url dla wszystkich adresów URL.

Zamiast modyfikowania start_requests, I zmodyfikowane 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] 
      }) 

I dodaje to jako część mojego pająka, tuż nad parse().

+0

Próbowałem tego, ale nadal jestem przekierowywany na stronę, której nie chcę. – Demonedge

+1

To działa dla mnie. Dzięki. – Olexandr

+0

Piękne rozwiązanie dla witryny, z którą chcę pracować. Dzięki! – zsljulius

2

Jak wyjaśniono tutaj: Scrapy docs

Używaj Zamówienie Meta

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