爬什么
爬取豆瓣手机版【英美剧】类别,将爬取结果保存为美观的json格式。
怎么做
获取url
找到能获取目标数据的url,这个url返回响应内容是json格式。
发送请求,获取响应
使用requests模块发送请求,除了需要带上User-Agent参数,还必须带上Referer参数,否则无法获取响应数据。
格式化并保存数据
json.loads
将获取的响应数据(json字符串类型)转换为python数据类型,再使用json.dumps
将python数据类型转换为字符串类型,写入文件并保存到本地。
这个过程就是:字符串——json.loads
——python数据类型——json.dumps格式化
——将美化后的json字符串保存到本地
没错,就是把字符串转为python数据再转为字符串。为什么要兜圈子,直接把获取到的字符串类型的响应数据写入文件保存多简单啊!这样兜圈子当然是有用的,我们使用json.dumps
,能够对字符串做美化,使得保存结果更美观。所以说,美是需要付出努力的~
json.dumps加上参数ensure_ascii=False
能够正常显示中文,加上参数indent
可以设置缩进,显示效果对人类的眼球更友好。
最后的效果是酱紫的。
对比一下,直接把响应数据写入保存,是啥样:
代码
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
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"}
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_str2 = json.loads(json_str)
with open("douban.json","w",encoding="utf8") as f: f.write(json.dumps(json_str2,ensure_ascii=False,indent=2))
with open("douban.json","r",encoding="utf8") as f: result1 = f.read() result2 = json.loads(result1) print(type(result2)) print(result2)
with open("douban.json","r",encoding="utf8") as f: result3 = json.load(f) print(result3) print(type(result3))
with open("douban1.json","w",encoding="utf8") as f: json.dump(result2,f,ensure_ascii=False,indent=2)
|
总结
json.dumps
就是个格式化高手啊。pprint模块可以美化输出界面的显示效果,使用之前,先引用模块。 json字符串里面的字符串都是用双引号引起来的。
json.dump
可以直接把python数据类型写入类文件对象,json.load
可以直接读取类文件对象的数据。