使用Python

时间:2015-04-22 18:02:10

标签: python json rest python-requests

我们使用Bugsplatsoftware.com收集所有崩溃信息。他们有RESTFull web服务,返回JSON数据。我想获取individual crashes的数据。数据在登录名/密码后面......

我尝试了以下但结果并不像预期的那样。

import requests
from requests.auth import HTTPBasicAuth

args={'id':11111,'data':0}

response=requests.get("https://www.bugsplatsoftware.com/individualCrash",params=args,auth=HTTPBasicAuth("username","password"))

data=response.json()

response.headers返回

response.headers
{'content-length': '10549', 'connection': 'close', 'server': 'Apache/2.4.12 (Win32) OpenSSL/1.0.1l PHP/5.5.21', 'x-frame-options': 'SAMEORIGIN', 'x-pingback': 'https://www.bugsplatsoftware.com/xmlrpc.php', 'expires': 'Thu, 19 Nov 1981 08:52:00 GMT', 'cache-control': 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'x-xss-protection': '1; mode=block', 'date': 'Wed, 22 Apr 2015 17:43:37 GMT', 'content-encoding': 'gzip', 'link': '<https://www.bugsplatsoftware.com/?p=363>; rel=shortlink', 'vary': 'Accept-Encoding,User-Agent', 'x-content-type-options': 'nosniff', 'x-powered-by': 'PHP/5.5.21', 'content-type': 'text/html; charset=UTF-8', 'pragma': 'no-cache'}

获取json数据需要做什么?提前谢谢。

当我打印response.url时,它会显示https://www.bugsplatsoftware.com/login/而不是https://www.bugsplatsoftware.com/individualCrash/?id=11111&data=0 ....

marmeladze,“bugsplatsoftware.com/individualCrash?id=11111&data=0”;返回json数据(至少在浏览器中),这就是我需要的。

[p> pygeek,当我调用response.content时,似乎数据是html页面.....

Ivan,如何为requests.get指定“content-type”?

好像我需要做Using Python Requests: Sessions, Cookies, and POST之类的事情我试过以下

import requests
s=requests.Session()
data={"login":'tester',"password":'testing'}
url="https://wwww.bugsplatsoftware.com/login"
r=s.post(url,data=data) 

我收到未经授权的错误消息

或者我只是做

s.get(url)我收到太多重定向

1 个答案:

答案 0 :(得分:0)

实际上这很简单。 JSON与Python Lists和Dictionaries结构紧密。因此,您需要做的就是将从Web服务调用中收到的JSON字符串转换为适当的序列类型,然后您可以使用列表解析来提取您想要的任何内容。

这是我创建的一些示例代码,用于调用我的简单Web服务。

import urllib, json, collections    

def getURLasString(url):
    s = urllib.urlopen(url).read()
    return s

def convertJSONStringToSequence(source):
    j = json.JSONDecoder(object_pairs_hook=collections.OrderedDict).decode(source)
    return j

def getURLasJSONSequence(url):
    s = getURLasString(url)
    return convertJSONStringToSequence(s)

url = "http://127.0.0.1:8081/lookupnames" # my local web service
s = getURLasString(url)
print s
j = getURLasJSONSequence(url)
print j

sampleJSON = [{"LastName": "DaVinci", "FirstName": "Leonardo"}, {"LastName": "Newton", "FirstName": "Isaac"}]

filteredList = [e["FirstName"] for e in sampleJSON if e["LastName"].startswith("D")]
print filteredList

这很大程度上只是我创造的功能,使其更容易,但主要部分是这个;你需要导入json包。然后,JSONDecoder会将您从Web服务调用返回的字符串转换为本机Python序列之一(通常是字典列表)。我编写了一堆辅助函数来将字符串转换为序列,或者直接调用URL并返回序列。

我写的程序会给出以下输出:

[{"LastName": "DaVinci", "FirstName": "Leonardo"}]
[OrderedDict([(u'LastName', u'DaVinci'), (u'FirstName', u'Leonardo')])]
['Leonardo']