【发布时间】:2016-09-26 11:47:38
【问题描述】:
我被困在使用 Python 抓取网页的网页上。基本上,以下是来自 HttpRequester(在 Mozilla 中)的请求,它给了我正确的响应。
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 中使用请求的完全相同的操作失败并出现错误。以下是sn -p的代码:
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
更多信息: 我正在寻找的 Post 请求被触发:
我正在从浏览器操作中捕获确切的请求标头和响应集,并尝试在 Postman、Python 代码和 HttpRequester (Mozilla) 中进行模仿。
它使用 Postman 和 Python 标记相同的错误(如上所述),但在我没有使用 HttpRequester 设置标头的情况下工作。
谁能想到一个解释?
【问题讨论】:
-
可能是 HttpRequester 发送了一个 cookie,或者服务器根据用户代理改变了行为。无法判断,但您的
requests代码在其他方面是正确的。 -
感谢您的快速回复。但是如果 HttpRequest 发送一个 cookie,它应该被列为请求标头的一部分,对吗?在原始输出(在我的问题中列出)中,除了 content-type 之外,我没有看到任何标题。我不认为用户代理是问题,因为用户代理“User-Agent:python-requests/2.10.0”适用于对同一服务器的不同发布请求。
-
HttpRequester 输出中缺少的标头太多;没有内容长度,没有接受,没有用户代理。您不会看到所有发送的标头,因此您无法做出任何假设。
-
该问题已通过使用请求会话解决,该会话创建了一个在不同 Post 请求之间持续存在的 cookie ASP.NET_SessionId。 Martijn 是对的 - 看起来 HttpRequester 传递的标头比原始输出中明显的要多。另一个提示来自 Postman - 当我启用拦截器并使用浏览器的 cookie(其中包含会话 ID 等)时,Post 请求通过了。
标签: python json post web-scraping python-requests