2017-04-06 25 views
0

私は、不動産の提供を含むウェブサイトをクロールするためにスクラムスパイダーを実装しています。このサイトには不動産業者に電話番号が記載されています。 scrapyによって生成された要求は、サーバーからエラーを返しますが、Postmanから送信された同じ要求は、要求されたデータを返します。Scrapy ajax POSTリクエストは機能しませんが、Postmanで働いています

ここでサイトのURLです:https://www.otodom.pl/oferta/piekne-mieszkanie-na-mokotowie-do-wynajecia-ID3ezHA.html

私はChromeの開発ツールで[ネットワーク]タブを使用して要求を記録しました。 ajaxリクエストのURLは次のとおりです。enter link description hereリクエストを送信するために必要なデータは、ページのソースに含まれるCSRFトークンで、定期的に変更されます。フォームデータとしてCSRFトークンのみを与える郵便配達では、期待される答えが得られます。すべてがOKであるべきにもかかわらず、

token_input = response.xpath('//script[contains(./text(), "csrf")]/text()').extract_first() 
    csrf_token = token_input[23:-4] 

    offerID_input = response.xpath('//link[@rel="canonical"]/@href').extract_first() 
    offerID = (offerID_input[:-5])[-7:] 

    form_data = {'CSRFToken' : csrf_token} 

    request_to_send = scrapy.Request(url='https://www.otodom.pl/ajax/misc/contact/phone/3ezHA/', headers = {"Content-Type" : "application/x-www-form-urlencoded"}, method="POST", body=urllib.urlencode(form_data), callback = self.get_phone) 

    yield request_to_send 

は、残念ながら、私はエラーを取得:

これは私がscrapyでリクエストを構築する方法です。誰が何が問題なのか考えている人はいますか?おそらくエンコーディングと結びついていますか?このサイトはutf-8を使用しています。

答えて

0

あなたは、ページのソース内のトークンを見つけることができます。

<script type="text/javascript"> 
var csrfToken = '0ec80a520930fb2006e4a3e5a4beb9f7e0d6f0de264d15f9c87b572a9b33df0a'; 
</script> 

をそして、あなたはこの正規表現で非常に簡単にそれを得ることができます:あなたはscrapyのFormRequestこれを使用することができます全体を取得するには

re.findall("csrfToken = '(.+?)'", response.body) 

あなたのために正しい投稿要求を行うことができます:

def parse(self, response): 
    token = re.findall("csrfToken = '(.+?)'", response.body)[0] 
    yield FormRequest('https://www.otodom.pl/ajax/misc/contact/phone/3ezHA/', 
         formdata={'CSRFToken': token}, 
         callback=self.parse_phone) 

def parse_phone(self, response): 
    print(response.body) 
    #'{"value":"515 174 616"}' 

inspect_responseコールをinserstingとrequest対象に検索することによって、あなたのscrapy要求:私はトークンを得ることに問題はありません

def parse_phone(self, response): 
    from scrapy.shell import inspect_response 
    inspect_response(response, self) 
    # shell opens up here and spider is put on pause 
    # now check `request.body` and `request.headers`, match those to what you see in your browser 
+0

は、私もそれを取得するコードを掲載しました。問題はリクエストにあり、必要なすべてのデータがあり、エラーが返されます。 – jkwi

+0

@jkwiああ、申し訳ありませんが、私はあなたの質問を誤解しました。完全な答えは私の編集を参照してください。 – Granitosaurus

+0

更新いただきありがとうございます、それは魅力的なように機能しています。乾杯。 – jkwi

関連する問題