post请求中的JSON在HttpRequester中工作,但在python请求中不起作用

时间:2016-05-28 04:52:11

标签: python json post web-scraping python-requests

我陷入了使用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

使用Requests在python 2.7.1中完全相同的操作失败并出现错误。以下是代码段:

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请求被解雇:

  
      
  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.   
  3. 点击"加载更多"页面末尾的灰色按钮

  4.   

我正在捕获浏览器操作的确切请求标头和响应集,并试图在Postman,Python代码和HttpRequester(Mozilla)中模仿它。

它使用Postman和Python标记了相同的错误(如上所述),但是没有使用HttpRequester设置标题。

有人能想到对此的解释吗?

1 个答案:

答案 0 :(得分:0)

如果Postman和requests都收到错误,那么更多上下文HttpRequester显示的更多。我预计几乎总会设置一些标题,包括User-AgentContent-Length,这里缺少这些标题。

通常的嫌疑人是Cookie(在先前的请求中查找Set-Cookie标头,使用requests.Session()对象保留这些标头),User-Agent标头以及Referrer标头,但请查找其他标题,例如以Accept开头的任何标题。

例如,将HttpRequester发布到http://httpbin.org/post,然后检查返回的JSON,它会告诉您发送了哪些标头。这不包括cookie(这些是特定于域的),但其他任何东西都可能是服务器所寻找的东西。如果cookie没有帮助,请逐个尝试这样的标题。