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
はい、メタ値を追加するだけでこれを行うことができます
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)
デフォルトでは、ScrapyはRedirectMiddleware
を使用してリダイレクトを処理します。 REDIRECT_ENABLED
をFalseに設定して、リダイレクトを無効にすることができます。
ドキュメント を参照してください。
documentation を見て、関連するソースを調べた後、私はそれを理解することができました。ソースで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()
のすぐ上に追加しました。
ここで説明されているように: Scrapy docs
リクエストメタを使用
request = scrapy.Request( link.url, callback=self.parse2)
request.meta['dont_redirect'] = True
yield request