2017-04-06 173 views
0

我正在實施一個scrapy蜘蛛抓取包含房地產優惠的網站。該網站包含一個電話號碼,房地產經紀人,可以retreived是一個阿賈克斯post請求。由scrapy產生的請求從服務器返回錯誤,而從Postman發送的相同請求返回所需的數據。Scrapy ajax POST請求不起作用,雖然在Postman工作

下面是該網站網址:https://www.otodom.pl/oferta/piekne-mieszkanie-na-mokotowie-do-wynajecia-ID3ezHA.html

我記錄使用Chrome的開發工具網絡選項卡中的請求。 ajax請求的URL是:enter link description here發送請求所需的數據是頁面源代碼中包含的CSRFtoken,其定期更改。在Postman中,只將CSRFtoken作爲表單數據給出了預期的答案。

我這是怎麼構建scrapy請求:

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 

不幸的是,我得到一個錯誤,但一切都應該沒問題。有誰知道可能是什麼問題?是可能與編碼連接?該網站使用utf-8。

回答

0

你可以在頁面的源代碼令牌:

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

你還可以用這個正則表達式得到它很容易:

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

爲了讓你可以使用scrapy的FormRequest整個事情這可以爲你做出正確的發佈請求:

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"}' 

你可以調試您scrapy請求通過insersting inspect_response呼叫,並尋找到request對象:

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