scrapy - как остановить перенаправление (302)

Я пытаюсь просканировать URL-адрес с помощью Scrapy. Но он перенаправляет меня на страницу, которой не существует.

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>

Проблема заключается в http://www.shop.inonit.in/Products/Inonit-Home-Decor--Knick-Knacks-Cushions/Shor-Sharaba/Andaz-Apna-Apna-Cushion-Cover/pid-1275197.aspx существует, но http://www.shop.inonit.in/mobile/Products/Inonit-Home-Decor--Knick-Knacks-Cushions/Shor-Sharaba/Andaz-Apna-Apna-Cushion-Cover/1275197 не делает, поэтому искатель не может найти это. Я также просканировал многие другие веб-сайты, но не имел этой проблемы нигде. Есть ли способ остановить эту переадресацию?

Любая помощь приветствуется. Благодарю.

Обновление: это мой класс пауков

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

Ответ 1

да, вы можете сделать это просто добавив мета значения, такие как

meta={'dont_redirect': True}

также вы можете остановить перенаправление для определенного кода ответа, например

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

он перестанет перенаправлять только 302 кода ответа.

пример

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

Ответ 2

Посмотрев документацию и просмотрев соответствующий источник, я смог понять это. Если вы посмотрите в источнике для start_requests, вы увидите, что он вызывает make_requests_from_url для всех URL-адресов.

Вместо изменения start_requests я модифицировал 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]
            })

И добавил это как часть моего паука, прямо над parse().

Ответ 3

По умолчанию Scrapy использует RedirectMiddleware для обработки перенаправления. Вы можете установить REDIRECT_ENABLED в False, чтобы отключить перенаправление.

См. Документацию.

Ответ 4

Как поясняется здесь: Scrapy docs

Использовать запрос Meta

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