爬虫返回的Json数据怎么玩?一篇文章搞定!

数据管道

共 3418字,需浏览 7分钟

 ·

2020-08-01 00:40

1、Json是什么

JSON,全称为JavaScript Object Notation

JSON是轻量级的文本数据存储和交换格式,独立于语言。(JSON使用JavaScript语法来描述数据对象,但是JSON仍然独立于语言和平台,JSON解析器和JSON库支持许多不同的编程语言)

下面来看看Json数据到底长啥样?

2、Json长啥样

打开浏览器,输入如下网址:“https://www.douban.com/j/search_photo?q=宋智孝”

你要问为啥是“宋智孝”,那你自己猜吧。

我们可以看到很清爽的 JSON 格式对象(是不是很像Python中的“字典”)

展示的形式是这样的:


{
    "images": [
        {
            "src""https://img1.doubanio.com/view/photo/photo/public/p2185662697.webp",
            "author""蹦咕噜霸会念经",
            "url""https://www.douban.com/link2/?url=http%3A%2F%2Fwww.douban.com%2Fphotos%2Fphoto%2F2185662697%2F&query=%E5%AE%8B%E6%99%BA%E5%AD%9D&cat_id=1025&type=search",
            "id""2185662697",
            "title""有一种美叫做宋智孝",
            "width"381,
            "height"500
        },
        {
            "src""https://img1.doubanio.com/view/photo/photo/public/p2185662777.webp",
            "author""蹦咕噜霸会念经",
            "url""https://www.douban.com/link2/?url=http%3A%2F%2Fwww.douban.com%2Fphotos%2Fphoto%2F2185662777%2F&query=%E5%AE%8B%E6%99%BA%E5%AD%9D&cat_id=1025&type=search",
            "id""2185662777",
            "title""有一种美叫做宋智孝",
            "width"452,
            "height"600
        }
    ],
    "total"2658,
    "limit"20,
    "more": true
}


数据被放到了 images 对象里,它是个数组的结构,每个数组的元素是个字典的类型。

src、author、url、id、title、width 和height 这些字段代表的含义分别是原图片的地址、作者、发布地址、图片 ID、标题、图片宽度、图片高度等信息。

json的格式本来就很清爽了,那我要想更加“清爽”的查看数据之间的层级关系,该怎么办呢?

这时候就需要用到一个插(shen)件(qi)了。

JSON-handle(如图)


解析之后的数据长这样:



嗯,更清爽了

3、在Python中玩转Json

在 Python 中有 JSON 库,可以让我们将 Python 对象和 JSON 对象进行转换,便于数据的解析。

在Json库里有两个方法:

json.dumps() 将Python对象(字符串)转换成为Json对象(字典)

json.loads() 将Json对象转换成为Python对象

下面这段代码中,通过loads()函数把data从“json string”转化为“dict”;又通过dumps()函数把data从“dict”转化为“json string”(折腾来、折腾去)


说白了就是一个“ 双引号”的问题,把双引号干掉,就是“dict”,放在python中就可以轻松的取到想要的节点数据。



代码可通过网址查看:

https://tech.io/snippet/JqONpVh

4、实战演练

打开浏览器,输入如下网址:https://www.douban.com/j/search_photo?q=宋智孝”,获得的src字段为图片的url地址。



我们要做的是把作者、原地址、标题保存为DataFrame,并存储为csv文件,然后根据图片的原地址把关于“宋智孝”的图片全部下载下来。


数据保存的代码:


利用request模块获取API的数据(记得加上headers,模拟浏览器的操作),然后把每一份数据存在“字典”里,再追加到“列表”中。


利用 pandas模块,把数据转为DataFrame,在保存为csv文件(注意中文乱码的问题)


import requests
import pandas as pd

query = '宋智孝'

headers = { "user-agent""Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                          "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.106 Safari/537.36"}

url = 'https://www.douban.com/j/search_photo?q=' + query
response = requests.get(url, headers=headers).json() # 得到返回结果
# print(response)
result = []
for image in response['images']:    
    dict = {}
    dict["pic"] = image["src"]
    dict["author"] = image["author"]
    dict["title"] = image["title"]  
    result.append(dict)

    print(image['src'])  # 查看当前下载的图片网址
    download(image['src'], image['id'])  # 下载一张图片

result_pd = pd.DataFrame(result)
result_pd.to_csv("result_pd.csv",encoding='utf_8_sig')


下载图片的代码:


根据图片的URL地址,把图片下载到.py文件的同级目录,命名为“str(i).jpg”


def download(src, id):
    dir = './' + str(id) + '.jpg'
    try:
        pic = requests.get(src, headers=headers, timeout=10)
        # print(pic)
        with open(dir, "wb"as f:
            f.write(pic.content)

    except requests.exceptions.ConnectionError:
        print('图片无法下载')


运行结果:

5、我是小结


JSON是轻量级的文本数据存储和交换格式,独立于语言,可以使用Json Handle插件来“一目了然”地查看Json数据的层级关系。


利用Json扩展库,可以方便的把json数据转为python数据类型,通过一个批量下载图片的案例,介绍了Request库与json数据的访问。


希望这篇文章能帮助你在Python中更好地玩转Json数据。

浏览 14
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报