数据提取(1)
数据提取
- 概念:从响应中获取我们想要的数据的过程
数据分类
- 非结构化的数据:html等
- 处理方法:正则表达式、xpath
- 结构化数据:json、xml等
- 处理方法:转化为python数据类型
数据提取之json
- 由于把json数据转化为python内建数据类型很简单,所以爬虫中,如果我们能够找到返回json的URL,就会尽量使用这种URL。
- JSON的概念:是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后台之间的数据交互。
- 如何找到json的url
- 使用chrome切换到手机页面
- 寻找想要提取的数据的json
- JSONView插件
- 使用抓包app
- 使用chrome切换到手机页面
- json字符串与python数据类型之间的转化
json.loads()
可以把json字符串转化为python数据类型(字典)- 可以使用pprint格式化输出
json.dumps()
可以把python数据类型转化为json字符串- 由于文件中不能直接写入字典,所以需要转化成字符串
import json
import requests
from pprint import pprint #格式化输出
# 这里的header中要加入referer因为豆瓣会判断是从哪里访问的无法直接发送请求
headers = {
"User-Agent": "Mozilla/5.0 (Linux; Android 8.0; Pixel 2 Build/OPD3.170816.012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Mobile Safari/537.36",
"Referer": "https://www.baidu.com/s?wd=https%3A%2F%2Fm.douban.com%2Frexxar%2Fapi%2Fv2%2Fmovie%2Fmodules%3Ffor_mobile%3D1&rsv_spt=1&rsv_iqid=0xa31d1229007d429f&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&rqlang=cn&tn=baiduhome_pg&rsv_enter=1&rsv_dl=tb&oq=%25E8%25B1%2586%25E7%2593%25A3%25E7%2588%25AC%25E5%258F%2596%25E7%259A%2584jsonurl%25E6%2597%25A0%25E6%25B3%2595%25E4%25BD%25BF%25E7%2594%25A8&rsv_t=9888CbGuwCjegyn3%2BOahTHhabDdeymSywmAFOx6FHg1Ivx8uUQQq%2FGeqiDu4DqlOAgf1&inputT=670&rsv_pq=f7f383570018a710&rsv_n=2&rsv_sug3=46&rsv_sug2=0&rsv_sug4=670"}
url = "https://m.douban.com/rexxar/api/v2/movie/modules?for_mobile=1"
response = requests.get(url, headers=headers)
# print(response)
# 这样不加转换会直接就是str类型
# print(response.content.decode())
# 使用json.loads把json字符串转化为python类型(字典)
ret1 = json.loads(response.content.decode())
with open("douban.json","w",encoding="utf-8") as f:
# 文件默认写入方式是ascii,这里用ensure_ascii=False就不是ascii写入utf-8
# 下一集在上一级的基础上退后两格
f.write(json.dumps(ret1,ensure_ascii=False,indent=2))
pprint(ret1)
- 包含json的类文件对象与python数据类型之间的转化(具有read()或者write()方法的对象就是类文件对象,例:f=open(“a.txt”,“r”) f就是类文件对象)
json.load()
把包含json的类文件对象转化为pythonjson.dump()
把数据类型转化为包含json的类文件对象
with open("douban.json","r",encoding="utf-8") as f:
ret2 = f.read()
ret3 = json.loads(ret2)
print(ret3)
# 相较之下,直接使用json.load提取json中的数据,省去了一不f.read()
with open("douban.json","r",encoding="utf-8") as f:
ret4 = json.load(ret2)
print(ret3)
*******************
with open("douban.json","w",encoding="utf-8") as f:
f.write(json.dumps(ret1,ensure_ascii=False,indent=2))
# json.dump能够把python类型放入类文件对象中
with open("douban1.json","w",encoding="utf-8") as f:
json.dump(ret1,f,ensure_ascii=False,indent=2)
-
json使用注意点
- json中的字符串都是双引号引起来的
- 如果不是双引号就不是json
- 可以使用eval把简单的字符串和python类型的转换
- replace:把单引号替换为双引号
- 往一个文件中写入多个json串,不再是一个json串,不能直接读取
- 一行写一个json串,按照行来读取
-
Json在数据交换中起到了一个载体的作用,承载着相互传递的数据
- Json与js,java,python有一种一一对应关系
- XML没有与其他语言的对应关系,只能手动解析