解析JSON会返回null和问号

时间:2017-09-28 19:56:39

标签: python json

我试图通过以下网址将此JSON文件解析为我的Python代码:https://shopee.co.id/api/v1/item_detail/?item_id=293667885&shop_id=24413460 我从这个页面采取https *** shopee.co.id/PHILIPS-RICE-COOKER-2L-HD3128-33_sby-Area-Surabaya-i.24413460.293667885(抱歉,我还不能发布两个以上的链接)

当我使用Developer Tools分析数据时,它显示了具有普通可读字符串的JSON文件的属性,但是当我通过双击打开文件时,某些内容似乎被隐藏了?

这是我解析该JSON文件的代码:

for x in range (0, 6):
with opener.open('https://shopee.co.id/api/v1/search_items/?by=sales&order=desc&newest='+ str(x*30) +'&limit=30&skip_price_adjust=false&page_type=shop&match_id=24413460') as url:
    data = json.loads(url.read().decode())
    for produk in data['items']:
        pid = produk["itemid"]
        new_url = opener.open('https://shopee.co.id/api/v1/item_detail/?item_id='+ str(pid) +'&shop_id=24413460')
        new_data = json.loads(new_url.read().decode())
        print(new_data['name'])

结果是这样的:

MIYAKO COUNTERTOP ????????????????????????????????????

我还是json的新人,所以我不知道该怎么做,任何帮助都会受到赞赏。

Screenshot of what appears in my developer tools

1 个答案:

答案 0 :(得分:0)

由于它在浏览器中加载但没有对该URL发送普通curl请求,因此该请求的某些内容会触发来自服务器的不同响应。

Chrome可以为页面上加载的任何资源提供curl命令行:

Devtools > Network > Copy > Copy as cURL

这会复制包含所有HTTP标头的请求:

curl 'https://shopee.co.id/api/v1/item_detail/?item_id=293667885&shop_id=24413460' -H 'cookie: _ga=GA1.3.2146560403.1506630766; _gid=GA1.3.1501700749.1506630766; _gat=1; csrftoken=yGTme9JnjopdDWv5axfOSoheC4opBno4' -H 'accept-encoding: gzip, deflate, br' -H 'accept-language: en-US,en;q=0.9' -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3226.0 Safari/537.36' -H 'x-api-source: pc' -H 'accept: */*' -H 'referer: https://shopee.co.id/PHILIPS-RICE-COOKER-2L-HD3128-33_sby-Area-Surabaya-i.24413460.293667885' -H 'authority: shopee.co.id' -H 'x-requested-with: XMLHttpRequest' -H 'if-none-match-: 55b03-89dcbb5568d6e9410be036d2f935045d' --compressed

在不更改任何内容的情况下运行此操作以验证它是否仍然从服务器生成相同的响应。确实如此。

逐个删除额外的标题以查看响应是否发生变化。

小心-H 'accept-encoding: gzip, deflate, br'--compressed,因为它们协同工作,您不希望查看终端中的原始gzip字节。

最终发现if-none-match-: 55b03-89dcbb5568d6e9410be036d2f935045d是触发服务器响应的标头。得出结论,它可能是API服务器中的某种缓存错误。