数据提取(JSON)

介绍

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210704125859895.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81NDk2NDkwNA==,size_16,color_F FFFFF,t_70)

由于把json中的数据转化成python内建数据类型很简单,所以我们在爬虫中尽量使用能返回json数据的url,就会尽量使用这种url。json是一种轻量级的数剧交互格式。json在数据交换中起到了一个载体的作用。

寻找json资源

在许多网页的url中可以把callback删除,这样更易获取完整的json
有callback参数时(像这样):

;jsonp1(
{
msg: "invalid_request_1284",
code: 1287,
request: "GET /rexxar/v2/subject_collection/tv_domestic/items",
localized_message: ""
}
)

删去可以获得一个完美的json:

{
msg: "invalid_request_1284",
code: 1287,
request: "GET /rexxar/v2/subject_collection/tv_domestic/items",
localized_message: ""
}

哪里能找到返回json的url:

手机版的浏览页面
抓包手机app的软件

数据类型转换

获得url地址
或区相应
转换成json或者dict(json.dumps json.loads)

import requests
import json

import parse_url
from pprint import pprint
url = "https://m.douban.com/rexxar/api/v2/subject_collection/tv_domestic/items?os=android&start=0&count=8&loc_id=108288&_=1625369161437"
html_str = parse_url(url) # 转化成json数据类型

#使用json.loads把json字符串转化为python类型
ret1 = json.loads(html_str)
pprint(ret1)
pprint(type(ret1))

#使用json.dumps能够把python类型转化为json字符串
with open("douban.json","w",encoding = "utf-8") as f:
    f.write(json.dump(ret1,ensure_ascii=False,indent=4))  #控制各级首行缩进和控制编码不自动转换
    f.write(str(ret1))

json使用时字符串应该都是双引号,如果不是双引号可以用replace或者eval实现字符串和python类型的简单转换

#使用json.load提取类文件中的数据  省略了读的步骤
with open("douban.json","r",encoding="utf-8") as f:
    ret4 = json.load(f)
    print(ret4)
    print(type(ret4))

#使用json.dump放入python数据类型到类文件中
with open("douban.json","w",encoding="utf-8") as f:
    json.dump(ret1,f)

正则表达式

正则表达式:特定字符和特定字符串组成的规则字符串,是一种字符串的过滤逻辑
常用的正则表达式方法:

re.complie(编译)
pattern.match(从头找一个)
pattern.search(找一个)
pattern.findall(找所有)
pattern.sub(替换)

一般字符:"." " \ " " […] "

".“能匹配所有字符,除了”\n"之外需要在DOTALL模式下匹配,可以简写成re.S

import re

print(re.findall(".", "\n"))
print(re.findall(".", "s"))
print(re.findall(".", "\n", re.DOTALL))
print(re.findall(".", "\n", re.S))

运行效果:
在这里插入图片描述

" \ ": 常用的转义字符
" […] ": 字符集,对应的位置可以是字符集中的任意字符。可以逐个列出也可以给出范围[abc] [a-c] 如果第一个字符是^则表示不取字符集中的字符,表示取反。

print(re.findall("[a-c]", "abc"))

在这里插入图片描述

预定义字符集

\d:数字集[1-9]
\D:非数字集
\s:空白字符:[<空格>\t\r\n\f\v]
\S:非空白字符
\w:单词字符[A-Z a-z 0-9]
\W:非单词字符

数量词

*:匹配前一个字符0次或者无数次
+:匹配前一个字符1次或者无数次
?:匹配前一个字符0或1次
{m}:匹配一个字符m次

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值