利用Python的requests库请求Instagram API返回字符串,如何转换为字典?

最近在做一些 Instagram 相关的项目,Python 上并没有可靠的 Instagram API,所以决定直接使用 requests 库。以下为代码段:

def getMe():
    while True:
        mediaMe = requests.get('https://api.instagram.com/v1/users/self/media/recent/?access_token={0}&count=1'.format(access_token))
        print mediaMe.content
        print type(mediaMe.content)
        yield ast.literal_eval(mediaMe.content)

with open(‘instagram.log’, ‘a’) as log: getMe() for line in getMe(): log.write(json.dumps(line)) log.write(’\n’)

    print type(line)

然后问题出现了,mediaMe 返回的是一个类,mediaMe.content 返回的类型是一个字符串,这个字符串是被字符化的一个词典。尝试使用 ast.literal_eval(mediaMe.content) 转换为词典的时候,却提示 Malformed string。请问有什么解决的方法吗?先提前谢谢大家。


利用Python的requests库请求Instagram API返回字符串,如何转换为字典?

8 回复

json.loads


import json
import requests

# 假设这是你从Instagram API获取的响应
response_text = '{"data": {"id": "123", "username": "example_user"}, "meta": {"code": 200}}'

# 方法1:使用json.loads()直接转换
try:
    data_dict = json.loads(response_text)
    print("方法1结果:", data_dict)
except json.JSONDecodeError as e:
    print(f"JSON解析错误: {e}")

# 方法2:如果响应来自requests库
response = requests.get('https://api.instagram.com/some_endpoint')
if response.status_code == 200:
    # requests库内置了.json()方法
    data_dict = response.json()
    print("方法2结果:", data_dict)
else:
    print(f"请求失败,状态码: {response.status_code}")

# 方法3:处理可能包含非标准JSON的情况
def safe_json_parse(text):
    try:
        return json.loads(text)
    except json.JSONDecodeError:
        # 可以在这里添加清理或修复逻辑
        # 比如移除多余的空格、换行等
        cleaned_text = text.strip()
        return json.loads(cleaned_text)

# 测试
test_response = '  \n{"test": "value"}\n  '
parsed = safe_json_parse(test_response)
print("方法3结果:", parsed)

核心就两件事:用json.loads()处理字符串,或者直接用requests返回对象的.json()方法。注意处理可能的JSON格式异常。

一句话建议:直接用response.json()最省事。

mediaMe.json()

你这代码写的有点看不懂呀。
getMe 是个死循环?
然后 getMe 是个迭代生成器,但遍历这个迭代器的之前又调用了下?

response 对象不是有个 json 方法吗?

  1. response 有个 json() 方法
    2. response 的 json() 方法调用 text 属性
    3. text 属性,如果 response 没有 Content-Encoding 会执行一次巨慢的 chardet
    4. 因此在调用 text/json() 之前,请 response.encoding = ‘utf-8’ ( instagram 的 API 不返回 Content-Encoding 头)

我纠正一下上面的第 4 点,Content-Type 里面有 charset 了,不用强设

问题是 mediaMe 返回的是一个 Response 200,必须要用 mediaMe.content 才能解出数据来

回到顶部