2015-11-06 115 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