簡體   English   中英

Scrapy:POST請求返回JSON響應(200 OK),但數據不完整

[英]Scrapy: POST request returning JSON response (200 OK) but with incomplete data

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

see,我得到狀態,left_count,頁面等更多信息。 但是我對“ html”感興趣。 不幸的是,如果通過瀏覽器完成,我會收到不正確的值(檢查了網絡呼叫並驗證了)

預期的“ html”為----

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

我只會收到以后的部分

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

實際的html內容丟失。

需要注意的是,我確實收到了回復,但僅對'html'回答不完整。 我相信這可能與動態生成的html有關。 但我對此有任何線索。

臨時中間件不會增加內容長度。 並且不允許我也添加一個。 將響應添加到標頭時,響應失敗並顯示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']})

如果我在這里遺漏任何東西,可以有人幫我嗎? 或以某種方式我可以發送內容長度的發送/或使中間件發送給我嗎? 非常感謝。

由於未使用cookie,您不會獲得html內容作為響應。 在您提到的實際請求標頭中,有一個cookie屬性。 但是在通過代碼發送的ajax請求中,沒有cookie字段。

首先,在響應zomato餐館頁面的請求時,使用URL設置一個cookie: https ://www.zomato.com/city/restaurant/reviews。 現在,單擊“加載更多”按鈕時,將發送一個包含cookie字段的請求,其中包含服務器在對URL'https: //www.zomato.com/php/social_load_more.php '的先前響應中設置的cookie。 因此,每次發出ajax請求時,都應在請求標頭中發送在前一個響應中設置的cookie,並在當前請求的響應中設置一個新的cookie。

因此,為了管理這些cookie,我使用了請求包的會話對象。 無需使用scrapy即可編寫腳本。 當您在scrapy中編寫代碼時,請查看是否有任何會話對象可用於管理cookie以進行scrapy。

我的代碼:

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

上面的代碼用於將請求發送到餐廳評論的網址。 這是必不可少的,因為在此請求的響應中設置了第一個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”管理cookie。 變量loadreviews現在將具有json格式的html數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM