美文网首页
Python爬虫(七)数据处理方法之JSON

Python爬虫(七)数据处理方法之JSON

作者: 咸甜怪 | 来源:发表于2019-06-08 17:40 被阅读0次

    什么是JSON

    JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation),是轻量级的文本数据交换格式,且具有自我描述性,更易理解。
    JSON看起来像python类型(列表,字典)的字符串。

    数据处理

    在之前的文章中,我们说到了怎么用response的方法,获取到网页正确解码后的字符串。如果还有不懂的,可以先阅读Python爬虫(三)Requests库。接下来以有道翻译为例子,说说怎么通过网页解码后的字符串,提取到翻译结果。

    • json.loads()

      首先我们先来看下,通过response.content.decode()解码之后得到的是什么类型的数据。通过打印出来type可以看到,我们解码之后得到的是str类型的数据。 response解码之后为字符串.png 若想进一步提取数据,则需要将str转换成python中的字典,python的json库为我们提供了json.loads()用于将str类型的数据转成dict。其用法为:
    import json
    json.loads(json字符串)
    

    再结合上述有道翻译的例子,得到字典类型的返回结果,并提取出来翻译结果。

    import requests
    import json
    
    url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36'}
    data = {'i': '人生苦短,我用python',
            'from': 'AUTO',
            'to': 'AUTO',
            'smartresult': 'dict',
            'client': 'fanyideskweb',
            'salt': '15598805838805',
            'sign': '601e9410133b355529e58d23a6c60578',
            'ts': '1559880583880',
            'bv': '565657d9b2f836d2c4c3a1fd81d7b3c3;',
            'doctype': 'json',
            'version': '2.1',
            'keyfrom': 'fanyi.web',
            'action': 'FY_BY_CLICKBUTTION'
            }
    response = requests.post(url, data=data, headers=headers)
    html_str = response.content.decode()
    #将字符串转换成字典
    dict_json = json.loads(html_str)
    #打印转换之后的数据以及数据类型
    print(dict_json)
    print(type(dict_json))
    #获取翻译结果
    ret = dict_json['translateResult'][0][0]['src']
    print('翻译结果是:',ret)
    
    执行结果如下: 获取翻译结果.png
    • json.dumps()
      当我们对爬虫数据进行处理时,当然不希望它们仅仅是显示出来,还希望把提取到的数据保存起来。但是当我们在把字典类型的数据写入文本时,是写入不成功的。这个时候就需要将字典类型转换成字符串,再写入到文本之中,json.dumps()的作用就是实现这一功能。

      在上述例子中,我们将得到的dict_json直接写入文本,会出现如下报错:TypeError: write() argument must be str, not dict。 dict直接写入文本.png 为了能够将字典类型的数据,转换成str字符串,则需要用json.dumps(),其用法如下:
    import json
    json.dumps(字典)
    

    将上述例子的dict_json换成str字符串,再写入文本中。

    import requests
    import json
    
    url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36'}
    data = {'i': '人生苦短,我用python',
            'from': 'AUTO',
            'to': 'AUTO',
            'smartresult': 'dict',
            'client': 'fanyideskweb',
            'salt': '15598805838805',
            'sign': '601e9410133b355529e58d23a6c60578',
            'ts': '1559880583880',
            'bv': '565657d9b2f836d2c4c3a1fd81d7b3c3;',
            'doctype': 'json',
            'version': '2.1',
            'keyfrom': 'fanyi.web',
            'action': 'FY_BY_CLICKBUTTION'
            }
    response = requests.post(url, data=data, headers=headers)
    #将字符串转换成字典
    dict_json = json.loads(html_str)
    #将字典转换成字符串并写入fnayi.txt文件中
    fanyi_str = json.dumps(dict_json)
    with open('fanyi.txt', 'w') as f:
        f.write(html_str)
    

    执行完上述的程序,会得到一个fanyi.txt的文件,其结果如下:{"type": "ZH_CN2EN", "errorCode": 0, "elapsedTime": 1, "translateResult": [[{"src": "\u4eba\u751f\u82e6\u77ed\uff0c\u6211\u7528python", "tgt": "Life is too short, I use python"}]]}。这样子的一份文档,中文部分显示的是二进制,且格式非常不利于阅读,这并不是我们想要的结果。好在json.dumps()为我们提供的两个方法,以帮助我们更好阅读文档。
    1.ensure_ascii,能够让中文显示成中文;
    2.indent,能够让下一行在第一行的基础上空格。
    其用法如下:

    fanyi_str = json.dumps(dict_json, ensure_ascii=False, indent=2)
    with open('fanyi.txt', 'w', encoding='utf-8') as f:
        f.write(fanyi_str)
    
    输出结果如下: 格式化后的输出.png

    相关文章

      网友评论

          本文标题:Python爬虫(七)数据处理方法之JSON

          本文链接:https://www.haomeiwen.com/subject/fzkvxctx.html