Json数据的抓取与处理
1.Json数据基本介绍
Json数据的介绍
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。JSON的主要特点是易于阅读和编写,并且易于解析和生成数据,因此广泛应用于Web服务和数据交换的领域。
Json数据的格式
JSON由对象和数组两种结构组成,对象是一组键值对(键值对之间用逗号分隔),以花括号{}括起来;数组是一组无序值(值之间用逗号分隔),以中括号[]括起来。对象和数组可以相互嵌套使用。
例如,一下是一个JSON对象的示例:
python
{
"name": "John",
"age": 30,
"address": {
"street": "Main Street",
"city": "New York"
},
"books": ["1984", "Brave New World"]
}
该对象有四个键值对,其中键名是字符串,值可以是字符串,数字,对象,数组。
注意:所有字符串在这里必须用双引号,而不是单引号,这是JSON的规定。
Json数据解析
JSON数据本质上还是字符串信息,虽然是结构化的数据,但是直接显示的时候是一行很长的文字,非常不利于查看。所以我们可以通过对JSON数据进行解析,将它以结构化的形式进行展示。
解析网址:https://spidertools.cn/#/formatJSON
使用方法:将网页上的JSON数据复制后粘贴在解析工具中,就可以自动结构化
2.豆瓣电影动态页面
动态HTML技术了解
js :是网络上最常用的脚本语言,它可以收集用户的跟踪数据,不需要重载页面直接提交表单,在页面嵌入多媒体文件,甚至运行网页。
jQuery :jQuery是一个快速,简洁的JavaScript框架,封装了JavaScript常用的功能代码。
ajax:ajax可以使用网页实现异步更新,可以在不重新加载整个网页的情况下,对网页的某部分进行更新。
那么下面让我们写一个爬虫来实现抓取豆瓣电影中喜剧片榜单的信息。
页面链接:
https://movie.douban.com/typeranktype_name=喜剧\&type=24\&interval_id=100:90\&action=
测试代码
python
import requests
# 1、用户代理的构造
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
}
# 2、确认目标url
url = "https://movie.douban.com/typerank?
type_name=%E5%96%9C%E5%89%A7&type=24&interval_id=100:90&action="
# 3、发送网络请求,获取响应对象
response = requests.get(url, headers=headers)
# 4、保存页面数据
with open('douban_movie.html', 'w', encoding='utf-8') as f:
f.write(response.text)
运行上述代码后可以发现根本没有抓取到喜剧电影的榜单数据信息:
这里不要着急,我们先介绍一下网页的种类
网页可以分为动态页面和静态页面两种:
- 静态页面:静态页面是指网页在服务器上预先生成并存储在硬盘中的一种页面,它不会做过多的交互或变化。静态页面的优点是快速、简单,对服务器资源的要求小,但是一旦生成,内容就不会改变,所以需要手动修改内容。
- 动态页面:动态页面是指通过与服务器端交互,可以使页面内容实时变化的一种页面。动态页面通常需要依赖数据库和服务器脚本,能够无限制地改变内容。动态页面常常被用于电子商务、在线社交、论坛等需要不断更新和变化的网站。动态页面需要更多的服务器资源,但是更加灵活,能够提供更好的用户体验。
为什么html种没有我们想要的数据?
我们所要抓取的豆瓣是一个动态页面,那为什么在html数据里面没有找到我们想要的数据呢?
这是因为,豆瓣的网页开发者留了一手,将数据放在Json数据里面了
下面是爬取json数据的代码:
python
import requests
import json
# 1、用户代理的构造
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
}
# 2、确认目标url
url = "https://movie.douban.com/j/chart/top_list?type=24&interval_id=100%3A90&action=&start=0&limit=20"
# 3、发送网络请求,获取响应对象
response = requests.get(url, headers=headers)
response1 = response.json()
# 4、保存页面数据
with open('douban_movie.json', 'w', encoding='utf-8') as f:
print(response1)
json.dump(response1, f, indent=4)
运行结果如下:
翻页数据的动态加载
使用浏览器访问对应的域名后,服务器上的数据会响应到浏览器上进行渲染展示,但是如果数据信息较多,单页面无法全部展示,就会涉及到数据的多页展示了
多页数据的展示一般分为两种:
- 数据页面追加 :
在页面中展示数据,通过鼠标下滑到底部后触发下一页数据,然后将下一页数据追加到当前数据页的后面。 - 数据页面替换 :
在页面中展示数据,通过鼠标下滑到底部后会有下一页的按钮来覆盖当前展示的数据页。
豆瓣多页数据分析
因为豆瓣使用的是页面数据的追加方式,所以可以从浏览器的翻页来获取多个页面的请求链接,并分析出规律。
python
# 单页已知信息
每一个页面的请求链接中包含了20部电影的数据信息。
# 得到的页面链接
第一条:https://movie.douban.com/j/chart/top_list?
type=24&interval_id=100%3A90&action=&start=0&limit=20
第二条:https://movie.douban.com/j/chart/top_list?
type=24&interval_id=100%3A90&action=&start=20&limit=20
第三条: https://movie.douban.com/j/chart/top_list?
type=24&interval_id=100%3A90&action=&start=40&limit=20
# 分析链接的规律
每条链接中只有start参数的值不相同,因为start是每部电影的排名编号。
# 豆瓣翻页的URL规律
在链接中将start参数的值使用循环变量进行格式化替代,保证start参数是以20的倍数来进行翻页
多页数据的下载
python
import time
import requests
# 1、获取抓取的数据页数
pages = int(input('请输入你想抓取的页数:'))
# 2、定义用户代理
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
}
# 3、根据输入的抓取页数来决定循环次数
for i in range(pages):
# 4、定义请求的url链接
url = f"https://movie.douban.com/j/chart/top_list?type=24&interval_id=100%3A90&action=&start={i*20}&limit=20"
# 5、发送网络请求,获取响应对象
response = requests.get(url, headers=headers)
# 6、将获取到的json数据保存到文件中
with open(f'douban_movie_{i+1}.json', 'w', encoding='utf-8') as f:
f.write(response.text)
# 7、提示下载成功,同时休眠3秒以方式被检测为爬虫
print(f'第{i+1}页数据下载成功')
time.sleep(3)