2013-03-18 45 views
13

私は、Scrapyを使用してURLをクロールしようとしています。しかし、それは存在しないページに私をリダイレクトします。scrapy-どのようにリダイレクトを停止する(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> 

問題が存在するが、http://www.shop.inonit.in/mobile/Products/Inonit-Home-Decor--Knick-Knacks-Cushions/Shor-Sharaba/Andaz-Apna-Apna-Cushion-Cover/1275197ないので、クローラはこれを見つけるカントhttp://www.shop.inonit.in/Products/Inonit-Home-Decor--Knick-Knacks-Cushions/Shor-Sharaba/Andaz-Apna-Apna-Cushion-Cover/pid-1275197.aspxです。他の多くのウェブサイトもクロールしましたが、他の場所ではこの問題は発生しませんでした。このリダイレクトを止める方法はありますか?

ご協力いただければ幸いです。ありがとう。

更新:これは私のクモクラスです

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 

答えて

11

はい、あなたはまた、あなたが

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

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) 
+1

感謝を応答するために!しかし、私はこのコード行をどこに置くべきかについて混乱していますか?私はstart_requestsを上書きしようとしましたが、 "Response 'オブジェクトに' body_as_unicode '属性がありません"というエラーが表示されます。アイテムとリクエストを同時に返すことはできますか? –

+0

response.status == 302をテストし、別の種類の処理を行うリダイレクトでhxs = HtmlXPathSelector(response)を呼び出すことができます。この場合のhxsは、response.bodyが302ステータスで空であるために失敗します –

+0

誰かがテストしましたか?私は '' handle_httpstatus_list 'でテストしました:[404、301] 'ただ404の作品 –

6

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

documentationを参照してください。

+0

私は "REDIRECT_ENABLED = False"と設定した場合、治療がリダイレクトを停止し、HTMLコンテンツも取得できません。 – house

7

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()の上に、私のクモの一部としてこれを追加しました。

+0

私はこれを試みたが、私はまだ私がしたくないページにリダイレクトされる – Demonedge

+1

これは私のために働く。ありがとう。 – Olexandr

+0

私が働きたいサイトのための素敵なソリューション。ありがとう! – zsljulius

2

としては、ここで説明:Scrapy docs

使用要求をメタ

request = scrapy.Request(link.url, callback=self.parse2) 
request.meta['dont_redirect'] = True 
yield request 
関連する問題