2015-11-06 77 views
0

我重新創建了XHR請求。當我們在瀏覽器窗口中輸入XHR請求URL時,因爲它是一個GET方法,如果第一次打我有部分JSON輸出。如果我們點擊重新加載,下次加載更多的數據似乎很奇怪。任何人都可以幫助我。在此先感謝scrapy shell響應不同於scrapy抓取響應

我在Scrapy shell中嘗試過的另一個信息也給出了整個JSON響應。

代碼:

import scrapy 
import datetime 
import time 
from scrapy.http.request import Request 

class test (scrapy.Spider): 
    name = "test" 
    allowed_domains = "ar.trivago.com" 

    def start_requests(self): 
     yield scrapy.Request("http://ar.trivago.com/search/region?iPathId=38715&iGeoDistanceItem=47160&aDateRange%5Barr%5D=2015-11-13&aDateRange%5Bdep%5D=2015-11-14&iRoomType=7&tgs=4716002&aHotelTestClassifier=&aPriceRange%5Bfrom%5D=0&aPriceRange%5Bto%5D=0&iIncludeAll=0&iGeoDistanceLimit=20000&aPartner=&iViewType=0&bIsSeoPage=false&bIsSitemap=false&&_=1446825699501", 
         callback=self.parse) 

    def parse(self, response): 
     print "RESPONSE::", response.body 

請幫我解決這個

回答

0

大家好我已經找到基於Andres代碼的解決方案

@AndrésPérez-Albela H.我已修改code.that將給我從網站的實際響應。由於併發請求執行會話未正確創建,因此大多數情況下響應都是部分的。 Crawling with an authenticated session in Scrapy這篇文章幫助我想出了。 感謝@Acorn和@安德烈斯·佩雷斯Albela H.

# -*- coding: utf-8 -*- 
import scrapy 
import time 
from scrapy.http.request import Request 
headers = { 
    'Referer': "http://ar.trivago.com/?iPathId=38715&iGeoDistanceItem=47160&aDateRange[arr]=2016-01-01&aDateRange[dep]=2016-01-02&iRoomType=7&tgs=4716002&aHotelTestClassifier=&aPriceRange[from]=0&aPriceRange[to]=0&iIncludeAll=0&iGeoDistanceLimit=20000&aPartner=&iViewType=0&bIsSeoPage=false&bIsSitemap=false&", 
    'X-Requested-With':'XMLHttpRequest' 
    } 
class test(scrapy.Spider): 
    name = "test" 
    allowed_domains = ["ar.trivago.com"] 
    def start_requests(self): 
     yield Request("http://ar.trivago.com/search/region?iPathId=38715&iGeoDistanceItem=47160&aDateRange[arr]=2015-11-13&aDateRange[dep]=2015-11-14&iRoomType=7&tgs=4716002&aHotelTestClassifier=&aPriceRange[from]=0&aPriceRange[to]=0&iIncludeAll=0&iGeoDistanceLimit=20000&aPartner=&iViewType=0&bIsSeoPage=false&bIsSitemap=false&&_=1446825699501", 
         callback=self.parse, headers=headers) 
    def parse(self, response): 
     yield Request("http://ar.trivago.com/search/region?iPathId=38715&iGeoDistanceItem=47160&aDateRange[arr]=2015-11-13&aDateRange[dep]=2015-11-14&iRoomType=7&tgs=4716002&aHotelTestClassifier=&aPriceRange[from]=0&aPriceRange[to]=0&iIncludeAll=0&iGeoDistanceLimit=20000&aPartner=&iViewType=0&bIsSeoPage=false&bIsSitemap=false&&_=1446825699501", 
         callback=self.parse_final, headers=headers, dont_filter = 'TRUE') 
    def parse_final(self, response): 
     print "RESPONSE:", response.body 

enter image description here

它爲我感謝大家的幫助。

-1

您正在使用的編碼URL的請求。 Scrapy再次編碼它,它看起來像目標網站不支持雙重編碼。

此外,重要的是要提到一些具有API端點的網站具有保護功能,其中包括檢查您是否已經有會話。這顯然是爲了避免直接向終端提出請求。所以在這種情況下,總是建議在查詢它們的API /端點之前發出第一個「假」請求(它會生成一個會話)。

上述情況的一個例子是這樣的答案對SO:

https://stackoverflow.com/a/33542753/4120036

只是檢查如何它第一次請求LOGIN_PAGE:

s.get(LOGIN_URL) 

然後它使登錄post request:

login_response = s.post(LOGIN_URL, data=payload, headers={'Referer':'http://infotrac.galegroup.com/default/palm83799?db=SP19', 'Content-Type':'application/x-www-form-urlencoded'}) 

我已經解碼的網站的網址,加入X-要求,隨着的Referer頭和從你的瀏覽器現在返回相同的數據量:

# -*- coding: utf-8 -*- 
import scrapy 
from scrapy.http.request import Request 

class test(scrapy.Spider): 
    name = "test" 
    allowed_domains = ["ar.trivago.com"] 

    def start_requests(self): 
     headers = { 
       'Referer': "http://ar.trivago.com/?iPathId=38715&iGeoDistanceItem=47160&aDateRange[arr]=2016-01-01&aDateRange[dep]=2016-01-02&iRoomType=7&tgs=4716002&aHotelTestClassifier=&aPriceRange[from]=0&aPriceRange[to]=0&iIncludeAll=0&iGeoDistanceLimit=20000&aPartner=&iViewType=0&bIsSeoPage=false&bIsSitemap=false&", 
       'X-Requested-With':'XMLHttpRequest' 
      } 
     fake_request = Request("http://ar.trivago.com/search/region?iPathId=38715&iGeoDistanceItem=47160&aDateRange[arr]=2015-11-13&aDateRange[dep]=2015-11-14&iRoomType=7&tgs=4716002&aHotelTestClassifier=&aPriceRange[from]=0&aPriceRange[to]=0&iIncludeAll=0&iGeoDistanceLimit=20000&aPartner=&iViewType=0&bIsSeoPage=false&bIsSitemap=false&&_=1446825699501", headers=headers) 
     yield Request("http://ar.trivago.com/search/region?iPathId=38715&iGeoDistanceItem=47160&aDateRange[arr]=2015-11-13&aDateRange[dep]=2015-11-14&iRoomType=7&tgs=4716002&aHotelTestClassifier=&aPriceRange[from]=0&aPriceRange[to]=0&iIncludeAll=0&iGeoDistanceLimit=20000&aPartner=&iViewType=0&bIsSeoPage=false&bIsSitemap=false&&_=1446825699501", 
         callback=self.parse, headers=headers) 

    def parse(self, response): 
     print "RESPONSE:", response.body 
+0

感謝您的回覆。仍然只獲得部分迴應。 – Sabeena

+0

您是否注意到scrapy shell給出了完整的回覆。我試着在假要求和原始要求之間進行睡眠,7次成功完成2次,這是不準確的。 – Sabeena