0%

python爬虫实例之处理json格式的数据

爬什么

爬取豆瓣手机版【英美剧】类别,将爬取结果保存为美观的json格式。

怎么做

  • 获取url
  • 发送请求,获取响应
  • 格式化并保存数据

获取url

找到能获取目标数据的url,这个url返回响应内容是json格式。
image.png
image.png

发送请求,获取响应

使用requests模块发送请求,除了需要带上User-Agent参数,还必须带上Referer参数,否则无法获取响应数据。
image.png

格式化并保存数据

json.loads将获取的响应数据(json字符串类型)转换为python数据类型,再使用json.dumps将python数据类型转换为字符串类型,写入文件并保存到本地。
这个过程就是:字符串——json.loads——python数据类型——json.dumps格式化——将美化后的json字符串保存到本地
没错,就是把字符串转为python数据再转为字符串。为什么要兜圈子,直接把获取到的字符串类型的响应数据写入文件保存多简单啊!这样兜圈子当然是有用的,我们使用json.dumps,能够对字符串做美化,使得保存结果更美观。所以说,美是需要付出努力的~
json.dumps加上参数ensure_ascii=False能够正常显示中文,加上参数indent可以设置缩进,显示效果对人类的眼球更友好。
最后的效果是酱紫的。
image.png
对比一下,直接把响应数据写入保存,是啥样:
image.png

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import requests
import json
from pprint import pprint #引用pprint模块,使打印输出结果更美观

headers = {"User-Agent": "Mozilla/5.0 (Linux; Android 5.0; SM-G900P Build/LRX21T) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Mobile Safari/537.36",
"Referer": "https://m.douban.com/tv/american"} #请求头必须把referer字段加上,否则无法抓取结果

url = "https://m.douban.com/rexxar/api/v2/subject_collection/tv_american/items?os=android&for_mobile=1&start=0&count=18&loc_id=108288"
r = requests.get(url,headers=headers)
json_str = r.content.decode()
print(type(json_str)) #抓取结果的格式是json字符串

json_str2 = json.loads(json_str) #将json字符串转换为python数据类型
# pprint(json_str2) #输出结果显示更美观,pretty print
# print(type(json_str2)) #json字符串转换为了字典类型
with open("douban.json","w",encoding="utf8") as f: #以json格式将爬取结果保存到本地
f.write(json.dumps(json_str2,ensure_ascii=False,indent=2)) #json.dumps可以设置参数ensure_ascii使中文正常显示,indent参数(作用就是格式化输出结果)使结果显示更美观;文件写入操作无法写入字典,需要把字典转换为字符串类型
# f.write(str(json_str2)) #也可以将字典强制转换为字符串类型,但是这样无法对结果进行格式化
# f.write(json_str) #如果直接把获取到的字符串写入文件,中文无法正常显示

with open("douban.json","r",encoding="utf8") as f: #格式化之后的json字符串,仍然可以转换为字典
result1 = f.read() #读取格式化之后的json字符串
result2 = json.loads(result1)
print(type(result2)) #仍然可以转换为字典
print(result2)

with open("douban.json","r",encoding="utf8") as f:
result3 = json.load(f) #使用json.load可以直接读取类文件对象的数据
print(result3)
print(type(result3))

with open("douban1.json","w",encoding="utf8") as f:
json.dump(result2,f,ensure_ascii=False,indent=2) #使用json.dump可以直接将字典写入类文件对象。这里的result2就是字典类型的数据

总结

json.dumps就是个格式化高手啊。pprint模块可以美化输出界面的显示效果,使用之前,先引用模块。 json字符串里面的字符串都是用双引号引起来的。
json.dump可以直接把python数据类型写入类文件对象,json.load可以直接读取类文件对象的数据。

-------------本文结束感谢您的阅读-------------