Scrapy:POST请求返回JSON响应(200ok),但d不完整

2024-10-02 02:32:11 发布

您现在位置:Python中文网/ 问答频道 /正文

MySpider正试图描述loadmore操作点击,这会导致动态地在web页面上加载更多的项目。这种情况一直持续到没有剩下的东西可以装载。在

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响应。在

^{pr2}$

我确实看到-

('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})

你看我得到的状态,左心室计数,页面,更多。 但是我对“html”很感兴趣。不幸的是,它的正确的值,如果通过浏览器完成的话,我确实会收到(检查了网络呼叫并进行了验证)

“html”应为----

<div><a> very long html stuff...............................................<div><script type='text/javascript'>if (typeof initiateLaziness == 'function') initiateLaziness() </script>

我只收到后面的部分

<script>...................................</script>. 

缺少真正的html内容。在

需要注意的是,我确实收到了“html”的响应,但不完整只有。全部休息很好。我相信这可能与动态生成的html有关。但我有任何线索。在

scrapy中间件没有增加内容长度。也不允许我加一个。将响应添加到标头时失败,返回值为400。在

实际发送到服务器的请求头:

 {'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']})

如果我在这里遗漏了什么,有人能帮我吗? 或者我可以通过某种方式发送内容长度/或让中间件为我发送? 非常感谢。在


Tags: httpscomurl内容htmlwwwpagescript
1条回答
网友
1楼 · 发布于 2024-10-02 02:32:11

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

首先,在响应zomato餐厅页面的请求时设置一个cookie,url为:https://www.zomato.com/city/restaurant/reviews。现在,当单击loadmore按钮时,将发送一个请求,其中包含服务器在对url“https://www.zomato.com/php/social_load_more.php”的上一个响应中设置的cookie字段。因此,每次发出ajax请求时,在前一个响应中设置的cookie应该发送到请求头中,并且在当前请求的响应中设置一个新的cookie。在

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

我的代码:

import requests
url : 'https://www.zomato.com/city/restaurant/reviews' 
s = requests.Session()
resp = s.get(url, headers=header) 

上面的代码是将请求发送到餐厅评论的url。这很重要,因为第一个cookie是在对该请求的响应中设置的。在

^{pr2}$

现在向社交加载发出请求_更多.php. 对象“s”管理cookies。变量loadreviews现在将具有json格式的html数据。在

相关问题 更多 >

    热门问题