2016-05-28 47 views
1

我被卡在web中使用Python刮取頁面。基本上,以下是來自HttpRequester(在Mozilla中)的請求,它給了我正確的響應。發送請求中的JSON在HttpRequester中工作,但不在python中請求

POST https://www.hpe.com/h20195/v2/Library.aspx/LoadMore 
Content-Type: application/json 
{"sort": "csdisplayorder", "hdnOffset": "1", "uniqueRequestId": "d6da6a30bdeb4d77b0e607a6b688de1e", "test": "", "titleSearch": "false", "facets": "wildcatsearchcategory#HPE,cshierarchycategory#No,csdocumenttype#41,csproducttype#18964"} 
-- response -- 
200 OK 
Cache-Control: private, max-age=0 
Content-Length: 13701 
Content-Type: application/json; charset=utf-8 
Server: Microsoft-IIS/7.5 
X-AspNet-Version: 4.0.30319 
X-Powered-By: ASP.NET 
Date: Sat, 28 May 2016 04:12:57 GMT 
Connection: keep-alive 

python 2.7.1中使用Requests的完全相同的操作失敗並報錯。以下是代碼片段:

jsonContent = {"sort": "csdisplayorder", "hdnOffset": "1", "uniqueRequestId": "d6da6a30bdeb4d77b0e607a6b688de1e", "test": "", "titleSearch": "false", "facets": "wildcatsearchcategory#HPE,cshierarchycategory#No,csdocumenttype#41,csproducttype#18964"} 

catResponse = requests.post('https://www.hpe.com/h20195/v2/Library.aspx/LoadMore', json = jsonContent) 

下面是我的錯誤:

{"Message":"Value cannot be null.\r\nParameter name: source","StackTrace":" at 
System.Linq.Enumerable.Contains[TSource](IEnumerable`1 source, TSource value, I 
EqualityComparer`1 comparer)\r\n 

的更多信息:

: 說我要找的信息請求被槍擊
  1. 打開本頁面:https://www.hpe.com/h20195/v2/Library.aspx?doctype=41&doccompany=HPE&footer=41&filter_doctype=no&filter_doclang=no&country=&filter_country=no&cc=us&lc=en&status=A&filter_status=rw#doctype-41&doccompany-HPE&prodtype_oid-18964&status-a&sortorder-csdisplayorder&teasers-off&isRetired-false&isRHParentNode-false&titleCheck-false

  2. 點擊「加載更多」灰色按鈕頁面

我捕捉精確的設定請求頭,並從瀏覽器操作的響應,並試圖模仿,在郵差結束,Python代碼和HttpRequester(Mozilla)。

它標記與Postman和Python相同的錯誤(如上所述),但沒有使用HttpRequester設置我的部分。

任何人都可以想到對此的解釋嗎?

+1

也許HttpRequester沿着一個cookie發送,或者服務器改變基於用戶代理的行爲。不可能告訴,但你的「請求」代碼是正確的。 –

+0

感謝您的快速響應。但是,如果HttpRequest沿着一個cookie發送,它應該被列爲請求頭部分的一部分,對吧?我在原始輸出(在我的問題中列出)中看不到除content-type之外的任何標題。我不相信用戶代理是問題,因爲用戶代理「User-Agent:python-requests/2.10.0」適用於不同的發佈請求到同一臺服務器。 –

+0

HttpRequester輸出中缺少太多頭文件;沒有內容長度,沒有接受,沒有用戶代理。您沒有顯示發送的所有標題,因此您無法做出任何假設。 –

回答

0

如果郵遞員和requests兩者都接收到錯誤,則存在多個上下文HttpRequester正在顯示。有幾個標題,我希望幾乎總是設置,包括User-AgentContent-Length,這裏是缺少的。

通常嫌疑犯是cookies(尋找在更早的請求Set-Cookie頭,保留那些使用requests.Session()對象)時,User-Agent頭,也許一個Referrer頭,但不要尋找其他的頭部像什麼開始Accept,例如。

已將HttpRequester發送到http://httpbin.org/post而代之,並檢查返回的JSON,它會告訴您發送了哪些標頭。這不包括cookies(這些是域特定的),但其他任何東西都可能是服務器尋找的東西。如果cookie不起作用,請逐一嘗試使用這些標題。