scrapy shell响应与scrapy爬行响应不同

时间:2015-11-06 16:45:39

标签: python web-scraping request xmlhttprequest scrapy

我已重新创建XHR请求。当我们在浏览器窗口中输入XHR请求URL时,因为如果第一次点击它是GET方法我得到了部分JSON输出。如果我们点击重新加载,下次它会加载更多看起来很奇怪的数据。任何人都可以帮助我。提前致谢

我在Scrapy shell中尝试的另一个信息也提供了整个JSON响应。

代码:

foreach(array_expression as $value){
    statement
}

请帮我解决此问题

2 个答案:

答案 0 :(得分:0)

大家好我找到了基于Andres代码的解决方案

@AndrésPérez-Albela H.我修改了代码。这将给我网站的实际回复。因为并发请求执行会话未正确创建,因此响应在大多数情况下是部分的。 Crawling with an authenticated session in Scrapy这篇文章帮助我了解了。 谢谢@Acorn和@AndrésPérez-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 :(得分:-1)

您正在使用已编码的网址发出请求。 Scrapy再次编码,看起来客观网站不支持双重编码。

此外,重要的是要提到一些具有API端点的网站具有保护功能,其中包括检查您是否已有会话。这显然是为了避免直接请求到他们的终端。所以在这种情况下,总是建议先制作一个假的"在查询其API /端点之前请求(将生成会话)。

  

以上的一个例子是关于SO的答案:

     

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

     

只需检查它首先向LOGIN_PAGE发出请求:

s.get(LOGIN_URL)
     

然后它发出登录帖子请求:

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-Requested-With 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