百度(Seo)快排之万能代理IP接口设计


百度(Seo)快排之万能代理IP接口设计

文章插图
我们在《python脚本百度(SEO)快排--模拟点击最新核心源码》中提到对快排影响的重要因素之一就是IP , 如何使用多IP执行快排脚本有两种方法:
1、使用动态拨号VPS
2、代理IP池
今天我们主要来说下如何设计一个万能的代理IP池接口?
我们随便找几家做代理IP池的厂家 , 看看他们都是什么样的接口?
1、芝麻HTTP
接口文档:https://zhimahttp.com/getapi/
2、品易HTTP
接口文档:http://pc.py.cn/api/
3、华益云
接口文档:http://www.9vps.com/show.asp?id=8
4、站大爷
接口文档:https://www.zdaye.com/doc/api/ShortProxy/
5、proxyPool
接口文档:https://github.com/jhao104/proxy_pool/
上述5个平台代理ip池都有各自的对接接口 , 而且他们的接口都不一样 , 有的是通过GET方式获取的 , 有的是通过POST方式获取的 , 获取的结果也不相同 , 有的可以直接返回代理ip如:114.55.53.151:3128 这样的格式是我们需要 , 有的接口返回的是json格式如:
{"anonymous": "","check_count": 2,"fail_count": 0,"https": false,"last_status": true,"last_time": "2021-12-10 12:15:59","proxy": "8.218.161.168:1080","region": "","source": "freeProxy05"}
如上这种json格式就需要从中提取代理ip与端口
返回结果格式上看可以把他们分为两类:
一类是直接返回代理ip 另一类直接返回json格式数据
对于第一种直接返回代理ip的我们不需要处理直接哪来使用就可以
对于返回json格式数据我们需要从中提取代理ip与端口 , 但不同厂家返回的json数据格式是不统一的 , 比如:
{"code":0,"success":true,"msg":"0","data":[{"ip":"49.68.68.197","port":33220,"expire_time":"2019-05-24 08:58:31","city":"徐州市","isp":"电信"},{"ip":"58.218.201.108", //隧道ip (代理ip)"port":2690,// 代理端口"expire_time":"2019-05-24 08:55:31","city":"苏州市","isp":"电信","outip":"219.136.47.161",// 隧道ip的出口ip}]}
那么如何解决做一个配置 , 能兼容所有的代理ip池呢?
在python中可以使用jsonpath库 , jsonpath提取json格式的数据非常方便
1. jsonpath介绍用来解析多层嵌套的json数据;JsonPath 是一种信息抽取类库 , 是从JSON文档中抽取指定信息的工具 , 提供多种语言实现版本 , 包括:Javascript, Python ,  PHP 和 Java 。
使用方法如:
import jsonpathres=jsonpath.jsonpath(dic_name,'$..key_name')#嵌套n层也能取到所有key_name信息,其中:“$”表示最外层的{} , “..”表示模糊匹配,当传入不存在的key_name时,程序会返回false
2. JsonPath 对于 JSON 来说 , 相当于 XPath 对于 XML安装方法:
pip install jsonpath
官方文档:http://goessner.net/articles/JsonPath
3. JsonPath与XPath语法对比:Json结构清晰 , 可读性高 , 复杂度低 , 非常容易匹配 , 下表中对应了XPath的用法 。
/
$
跟节点
.
【百度(Seo)快排之万能代理IP接口设计】@
现行节点
/
. or []
取子节点
..
n/a
就是不管位置 , 选择所有符合条件的条件
*
*
匹配所有元素节点
[]
[]
迭代器标示(可以在里面做简单的迭代操作 , 如数组下标 , 根据内容选值等)
|
[,]
支持迭代器中做多选
[]
?()
支持过滤操作
n/a
()
支持表达式计算
()
n/a
分组 , JsonPath不支持
4. 使用实例d={"error_code": 0,"stu_info": [{"id": 2059,"name": "小白","sex": "男","age": 28,"addr": "河南省济源市北海大道32号","grade": "天蝎座","phone": "18378309272","gold": 10896,"info":{"card":434345432,"bank_name":'中国银行'}},{"id": 2067,"name": "小黑","sex": "男","age": 28,"addr": "河南省济源市北海大道32号","grade": "天蝎座","phone": "12345678915","gold": 100}]}res= d["stu_info"][1]['name'] #取某个学生姓名的原始方法:通过查找字典中的key以及list方法中的下标索引print(res) #输出结果是:小黑import jsonpathres1=jsonpath.jsonpath(d,'$..name') #嵌套n层也能取到所有学生姓名信息,$表示最外层的{} , ..表示模糊匹配print(res1) #输出结果是list:['小白', '小黑']res2= jsonpath.jsonpath(d,'$..bank_name')print(res2) #输出结果是list:['中国银行']res3=jsonpath.jsonpath(d,'$..name123') #当传入不存在的key(name)时,返回Falseprint(res3) #输出结果是:False