Javascript Scrapy:POST请求返回JSON响应(200 OK),但数据不完整

Javascript Scrapy:POST请求返回JSON响应(200 OK),但数据不完整,javascript,python,json,scrapy,Javascript,Python,Json,Scrapy,MySpider试图描述加载更多操作的点击,这会导致动态加载网页上的更多项目。这会一直持续到没有更多的东西需要加载为止 yield FormRequest(url,headers=header,formdata={'entity_id': '70431','profile_action': 'review-top','page':str(p), 'limit': '5'},callback=self.parse_review) header = {#'User-Agent': 'Mozilla

MySpider试图描述加载更多操作的点击,这会导致动态加载网页上的更多项目。这会一直持续到没有更多的东西需要加载为止

yield FormRequest(url,headers=header,formdata={'entity_id': '70431','profile_action': 'review-top','page':str(p), 'limit': '5'},callback=self.parse_review)

header = {#'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:44.0) Gecko/20100101 Firefox/44.0',
               'X-Requested-With': 'XMLHttpRequest',
               'Host': 'www.zomato.com',
               'Accept': '*/*',
               'Referer': 'https://www.zomato.com',
               'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
               'dont_filter':'True' }

url = 'https://www.zomato.com/php/social_load_more.php'
收到的响应是json响应

jsonresponse = json.load(response)
我确实看到了-

('data==', {u'status': u'success', u'left_count': 0, u'html': u"<script type='text/javascript'>if (typeof initiateLaziness == 'function') initiateLaziness() </script>", u'page': u'1', u'more': 0})
如果我遗漏了什么,谁能帮我一下吗? 或者我可以通过某种方式发送内容长度/或让中间件为我发送?
非常感谢。

由于不使用cookies,您将无法得到html内容的响应。在您提到的实际请求头中,有一个cookie属性。但是在通过代码发送的ajax请求中,没有cookie字段

首先,在对来自zomato餐厅页面的请求的响应中设置一个cookie,url:。现在,单击“加载更多”按钮时,将发送一个请求,其中包含服务器在对url“”的上一次响应中设置的cookie字段。因此,每次发出ajax请求时,在前一个响应中设置的cookie都应该在请求头中发送,并且在当前请求的响应中设置一个新的cookie

所以,为了管理这些cookie,我使用了请求包的会话对象。脚本也可以不用scrapy编写。在用scrapy编写代码时,请查看是否有任何会话对象可用于管理scrapy的Cookie

我的代码:

import requests
url : 'https://www.zomato.com/city/restaurant/reviews' 
s = requests.Session()
resp = s.get(url, headers=header) 
上面的代码是将请求发送到餐厅评论的url。这很重要,因为第一个cookie是在对该请求的响应中设置的

params={
        'entity_id':res_id,
        'profile_action':'reviews-dd',
        'page':'1',
        'limit':'5'
    }
header = {"origin":"https://www.zomato.com","Referer":"https://www.zomato.com/","user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0", "x-requested-with":"XMLHttpRequest", 'Accept-Encoding': 'gzip, deflate, br'}
loadreviews_text = s.post("https://www.zomato.com/php/social_load_more.php", data=params, headers=header)
loadreviews = loadreviews_text.json()

现在向social_load_more.php发出请求。对象“s”管理cookies。变量loadreviews现在将具有json格式的html数据。

我注意到的一件事是,在标题中添加“Content Length:50”后,响应失败。另外,中间件并没有自动将其添加到请求头中。
 {'Accept-Language': ['en'], 'Accept-Encoding': ['gzip, deflate,br'], 'Dont_Filter': ['True'], 'Connection': ['keep-alive'], 'Accept': ['*/*'], 'User-Agent': ['Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:44.0) Gecko/20100101 Firefox/44.0'], 'Host': ['www.zomato.com'], 'X-Requested-With': ['XMLHttpRequest'], 'Cookie': ['zl=en; fbtrack=9be27330646d24088c56c2531ea2fbf5; fbcity=7; PHPSESSID=2338004ce3fd540477242c3eaee685168163bd05'], 'Referer': ['https://www.zomato.com'], 'Content-Type': ['application/x-www-form-urlencoded; charset=UTF-8']})
import requests
url : 'https://www.zomato.com/city/restaurant/reviews' 
s = requests.Session()
resp = s.get(url, headers=header) 
params={
        'entity_id':res_id,
        'profile_action':'reviews-dd',
        'page':'1',
        'limit':'5'
    }
header = {"origin":"https://www.zomato.com","Referer":"https://www.zomato.com/","user-agent":"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0", "x-requested-with":"XMLHttpRequest", 'Accept-Encoding': 'gzip, deflate, br'}
loadreviews_text = s.post("https://www.zomato.com/php/social_load_more.php", data=params, headers=header)
loadreviews = loadreviews_text.json()