25

Scrapy を使用して URL をクロールしようとしています。しかし、存在しないページにリダイレクトされます。

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はそうではありません。したがって、クローラーはこれを見つけることができません。他の多くの Web サイトもクロールしましたが、他の場所ではこの問題は発生しませんでした。このリダイレクトを停止する方法はありますか?

どんな助けでも大歓迎です。ありがとう。

更新:これは私のスパイダークラスです

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
4

4 に答える 4

20

はい、次のようなメタ値を追加するだけでこれを行うことができます

meta={'dont_redirect': True}

また、次のような特定の応答コードのリダイレクトを停止することもできます

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

302 応答コードのみのリダイレクトを停止します。リダイレクトを回避したい HTTP ステータス コードをいくつでも追加できます。

yield Request('some url',
    meta = {
        'dont_redirect': True,
        'handle_httpstatus_list': [302]
    },
    callback= self.some_call_back)
于 2013-03-18T13:20:25.680 に答える
11

ドキュメントを見て、関連するソースを調べた後、私はそれを理解することができました. start_requests のソースを見ると、すべての URL に対して make_requests_from_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()

于 2015-01-14T18:28:42.967 に答える
8

デフォルトでは、Scrapy はRedirectMiddlewareリダイレクトを処理するために使用します。REDIRECT_ENABLEDリダイレクトを無効にするには、False に設定します。

ドキュメントを参照してください。

于 2013-04-23T03:23:51.270 に答える
3

ここで説明されているように: Scrapy docs

リクエスト メタを使用する

request =  scrapy.Request(link.url, callback=self.parse2)
request.meta['dont_redirect'] = True
yield request
于 2015-12-04T17:24:34.680 に答える