Python爬虫教程

第一章: 初学乍练-Python快速入门

第二章: 初窥门径-从全局把握网络爬虫

第三章: 爬虫数据-网页与JSON

第四章: 爬虫核心-HTTP协议

第五章: 手到擒来-数据的抓包

第六章: 利刃出鞘-HTTP请求库

第七章: 尘埃落定-数据的解析

第八章: 逆向初探-JS逆向

第九章: 爬虫进阶-Selenium, 中间人拦截

第十章:斗转星移-常用的反爬策略及应对方法

首页 > Python爬虫教程 > 第三章: 爬虫数据-网页与JSON > 3.3节: 数据交换格式JSON

3.3节: 数据交换格式JSON

薯条老师 2021-02-17 09:59:43 233652 4

编辑 收藏


广州番禺Python, Java小班周末班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人,学员的平均就业薪资有11K不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。培训的课程有Python爬虫,Python后端开发,Python办公自动化,Python大数据分析,Python量化投资,Python机器学习,Java中高级后端开发。授课详情请点击:http://chipscoco.com/?cate=6

3.3.1数据交换格式:JSON

JSON是一种很轻量的数据交换格式,全称为JavaScript Object Notation,采用完全独立于编程语言的文本格式来存储和表示数据,其结构简洁,层次清晰,易于阅读编写,同时也易于机器解析和生成,这些特性使得JSON 成为理想的数据交换语言。

HTTP服务器响应的数据不一定是HTML文件,某些接口会响应JSON格式的数据,这也是为什么爬虫初学者要学习JSON的原因。

3.3.2 JSON数据格式

JSON数据格式的核心是键值对,类似于Python中的字典结构,但与字典结构不同的是,JSON中的键类型必须是字符串类型,键名用双引号括起来。在JSON标准中,规定了键名得使用双引号括起来,使用单引号时可能会带来一些兼容性的问题,所以最佳做法是遵循标准,采用双引号。JSON格式中的键名必须为字符串类型,键值可以为以下六种类型:

键值类型

描述

number

数值类型,比如整型或浮点类型

string

字符串,值为字符串时,需用双引号括起来

    boolean

布尔类型,值为true或false,同Python中的True和False

array

这里的数组类似于Python中的列表,元素被包含在方括号[]中,元素类型必须一致

object

json格式用{}表示一个对象。对象的语法类似于Python中的字典结构,只不过对象中的键名亦必须是字符串类型

null

类似于Python中的None值

数值类型举例:

{"age": 18}

字符串类型举例:

{"author": "薯条老师"}

布尔类型举例:

{"keep_hungry": true}

数组类型举例:

{"students": ["阿占", "鹏子", "小梁", "毛同学"]}

对象类型举例:

{"book": {"id": 0, "title": "遇见python", "author": "薯条社区"}}

null值举例:

{"price": null}

在JSON格式中,键值的数据类型可以相互嵌套,比如在数组类型中嵌套对象类型,在对象中嵌套数组类型,如此组合成比较复杂的json格式。复杂的json格式举例:

{
"book":{
id": 0, "title": "遇见python",
"author": {"name": "薯条老师", "age": 18},
"contributor": [{"name": "阿月"},{"name": "上官玛利亚"} ]
}
}

3.3.3 使用json模块处理JSON

Python中的内置模块json主要包含以下四方法:

常用方法

描述

json.dumps(obj)

将可序列化对象obj序列化为json字符串

json.loads(s)

将json字符串s反序列化为Python对象

json.dump(obj, fp)

将可序列化对象直接写入到fp文件流对象所指向的文件中

json.load(fp)

将fp文件流对象所对应的文件数据反序列化为Python对象

json.dumps方法用来将Python中的可序列化对象转换为json字符串,Python中可序列化的数据类型:

可序列化对象

描述

简单数据类型

整型,浮点类型,布尔类型

复合数据类型

字符串,列表,元组,字典

json.dumps方法默认的字符编码为ascii,可以指定形参ensure_ascii的值为False来关闭默认编码选项。

现在通过github提供的数据抓取接口来掌握json模块的用法。github API的详细用法可参考官方文档:https://docs.github.com/en/rest。以下为抓取C++语言类项目仓库数据的URL:

https://api.github.com/search/repositories?q=language:c++&page=1

URL中的query为q=language:c++&page=1,表示抓取第一页的基于c++语言的项目仓库数据。如需抓取抓取第一页的Python语言的项目仓库数据,那么URL为:

https://api.github.com/search/repositories?q=language:python&page=1

将该URL复制下来,粘贴到浏览器的地址栏,并按下回车键,可在页面中看到服务器响应的数据:

 github_firefox.jpg

 

薯条老师使用的是火狐浏览器,从页面的JSON标记可知,github API响应的是JSON数据。该JSON中的"items"键对应的是一个数组,数组中的每一项为一个对象,保存了项目仓库的信息。现在通过Python代码来写一个简单的爬虫程序,爬取github项目仓库的数据。

代码实例-爬取github的Python仓库数据

# 导入内置模块json
import json
# urllib下的request,用来发起HTTP请求
import urllib.request
 
# url为获取github中的第一页Python项目数据的请求url
url =  ' 

with urllib.request.urlopen(url) as response:
        # response对象的read方法返回的是一个字节流对象,需通过decode方法进行解码
        # 解码后的对象是一个JSON格式的字符串
        json_str = response.read().decode('utf-8')
        # 执行json模块的loads方法对JSON字符串进行反序列化
        repositories = json.loads(json_str)
        # 输出第一个Python仓库的信息
        print(repositories["items"][0])

3.3.4 使用jsonpath提取JSON数据

通过json模块的loads方法将JSON数据反序列化为Python对象以后,就可以提取出指定字段的数据。但在实际情况中,需要同时提取多个字段的数据时,使用json模块还是较为不便的,此时可以使用第三方模块jsonpath。

初学者现在只需熟练掌握json模块的用法。将学过的知识反复练习至熟练掌握的程度,彻底吸收巩固,再作进一步的学习,即是最好的学习方法。

3.3.5 知识要点

(1) JSON是一种很轻量的数据交换格式,全称为JavaScript Object Notation

(2) HTTP服务器响应的数据不一定是HTML文件,某些接口会响应JSON格式的数据

(3) Python提供了内置模块json,用来对JSON数据进行处理

3.3.6 最具实力的小班培训

薯条老师在广州做Python和Java的小班培训,一个班最多10人。不在广州的同学可以报名线上直播班,跟线下小班的同学们同步学习。打算参加小班培训的同学,必须遵守薯条老师的学习安排,认真做作业和项目。把知识学好,学扎实,那么找到一份高薪的工作就是很简单的一件事。

(1) Python后端工程师高薪就业班,月薪11K-18K,免费领取课程大纲
(2) Python爬虫工程师高薪就业班,年薪十五万,包拿Offer
(3) 数据分析高薪就业班,月薪11K-15K, 免费领取课程大纲
(4)
Python大数据挖掘,量化投资就业班,月薪12K-25K,免费领取课程大纲

扫码免费领取Python学习资料:


已有4位薯条发表了看法:

  • 访客

    访客  评论于 2022-05-06 10:31:40  回复

    您好,发现了一点小瑕疵:
    URL中的query为q=language:c++&page=1,表示抓取第一页的基于c++语言的项目仓库数据。如需抓取抓取第一页的Python语言的项目仓库数据,那么URL为:
    https://api.github.com/search/repositories?q=python:python&page=1
    URL貌似有误,q=python:python应该为q=language:python

  • 访客

    访客  评论于 2022-08-08 09:14:59  回复

    不是使用requests库更方便咩,为啥还要使用urllib丫

欢迎 发表评论: