做爬虫经常会遇见代理ip的API接口请求返回ip进行处理,然后解决封IP问题。一直以来我都是直接使用Python中的json模块转字典进行处理。
那天突然心血来潮,想起jsonpath语法好久没用过了,已经忘的差不多了,想着处理代理ip的时候顺手复习一下jsonpath模块的基础使用,然后就遇见了这个问题。
出现False的情况有两种:
建议可以用www.json.cn校验一下你的json字符串格式是否正确
1.传入的不是dict对象(我犯的就是这个错误,我直接把返回的字符串没转dict对象就传入)
2.没有jsonpath表达式中对应的key值(检查你的jsonpath表达式)
上代码,这里就不展示代理ip的接口了,我直接用d来代替返回结果。
import jsonpath
import json
# 返回的ip
d = '{
"code": 100,
"left_ip": 7,
"left_time": 56223,
"number": 1,
"domain": "183.129.244.16",
"port": [ 55405 ] }'
# 将json格式的字符串转换成Python的dict类型
u_str = json.loads(d)
# 打印转换结果,和转换类型
print(u_str, type(u_str))
#将转换后的dict对象传入,然后是你要提取的数据的jsonpath语法
ip_address = jsonpath.jsonpath(u_str, '$..domain')[0]
port = jsonpath.jsonpath(u_str, "$..port")[0][0]
print(ip_address, port)
输出结果
{'code': 100, 'left_ip': 7, 'left_time': 56223, 'number': 1,
'domain': '183.129.244.16', 'port': [55405]}
<class 'dict'>
183.129.244.16 55405
现在再来说一下我的错误
我对于json的认识就是前后端交换数据的一种格式规范,一个类似于Python中字典形式的字符串。
我在使用jsonpath的时候,认为直接将json字符串传入,再传入jsonpath的语法就是对的,然后一直出现返回False。
在jsonpath模块中
这个函数校验了传入的是否是dict对象和校验你的jsonpath语法是否正确,能否匹配到结果,匹配过程中进行了异常捕获,如果出现异常就返回False
以后学了的东西还是要多用,要多用实践来检验你的所学。