censys 数据库地理信息自定义接口(python版)
公司内部的ip信息库覆盖面不是很够
导致日志处理的时候ip经常差不到
有人推荐,censys比较权威,
但是没有文档,而且接口不太好用,所以自己写了一个查ip的接口
首先
到官网逛了逛,censys特殊之处在于注册了才能用api
注册以后有Secret,API_ID,在查询时需要用到
百度了一下发现也没什么有用的教程,又看了看官方的介绍以及源码
得到了最初的版本
import censys
from censys import *
Secret=“”
API_ID=“”
self.api = censys.ipv4.CensysIPv4(api_id=self.API_ID, api_secret=self.Secret)
res = self.api.view(ip)
geo = res['location']
后来发现,这个库不是专业的地理信息库,这样查询很多ip的地址view不到。。
但是在网页上面却是可以显示地理信息的,想了想,准备直接用url发请求
import requests
url="https://www.censys.io/ipv4/%s"%ip
res = requests.get(url, auth=(API_ID, Secret))
s=res.content
也可以用urllib2
import urllib2
values ={"user":API_ID,"passwd":Secret}
jdata = json.dumps(values)
req = urllib2.Request(url, jdata)
response = urllib2.urlopen(req)
s=response.read()
两者差不太多吧,我用的是第一种
之后就是解析html了
上网找了找,发现神器bs4
搞了搞发现好方便,直接贴代码
from bs4 import BeautifulSoup
soup = BeautifulSoup(s, "html5lib")
这样html就被解析出来了,结合censys返回的html,可以解析出地理信息
b=soup.find_all("dl","dl-horizontal dl-hostbox")
if len(b) == 0:print "not found"
geo=b[0].find_all('dd')
接下来继续解析出所需各项
lat_long=geo[3].string.split(',')
country=geo[2].string.split(' ')json_data = {"ip" : ip,"latitude": float(lat_long[0]),"country": str(country[0]),"country_code": str(country[1][1:-1]),"longitude": float(lat_long[1]),"province": str(geo[1].string),"city": str(geo[0].string)}
这样也就可以用了
但是。。
有的ip地理信息竟然是残缺的,所以根据实际情况修改了一下解析过程
思路很简单,就是如果geo中五项都有,就直接过,缺项的时候,就看看有什么,然后加什么,没有的用“unknow”代替
try:city = str(geo[0].string)provice = str(geo[1].string)country = geo[2].string.split(' ')lat_long= geo[3].string.split(',')Timezone= str(geo[4].string)
except:print "did not get enough info at ip%s"%ip filed = b[0].find_all('dt')lst=[]for i in filed:lst.append(i.string) city = "unknow"provice = "unknow"country = ["unknow",("unknow")]lat_long=[0.0,0.0] fileds= ["City","Province","Country","Lat/Long","Timezone"] num=0for i in lst:index=fileds.index(i)#print indexif index == 0:city = str(geo[num].string)elif index == 1:provice = str(geo[num].string)elif index == 2:country = geo[num].string.split(' ')elif index == 3:lat_long= geo[num].string.split(',') else :continuenum=num+1
json_data = {"ip" : ip,"latitude": float(lat_long[0]),"country": str(country[0]),"country_code": str(country[1][1:-1]),"longitude": float(lat_long[1]),"province": provice,"city": city}
这样完整的地理信息就解析出来了
这里放一下完整的api
import json
import urllib2
import censys
from censys import *
import requests
from bs4 import BeautifulSoupclass censys_ip():debug = FalseSecret=""API_ID=""def __init__(self):self.api = censys.ipv4.CensysIPv4(api_id=self.API_ID, api_secret=self.Secret) def censys_html_search(self,ip):url="https://www.censys.io/ipv4/%s"%ipres = requests.get(url, auth=(self.API_ID, self.Secret))s=res.contentsoup = BeautifulSoup(s, "html5lib")b=soup.find_all("dl","dl-horizontal dl-hostbox")if len(b) == 0:return {}geo=b[0].find_all('dd')try:city = str(geo[0].string)provice = str(geo[1].string)country = geo[2].string.split(' ')lat_long= geo[3].string.split(',')Timezone= str(geo[4].string)except:print "did not get enough info at ip%s"%ip filed = b[0].find_all('dt')lst=[]for i in filed:lst.append(i.string) city = "unknow"provice = "unknow"country = ["unknow",("unknow")]lat_long=[0.0,0.0] fileds= ["City","Province","Country","Lat/Long","Timezone"] num=0for i in lst:index=fileds.index(i)#print indexif index == 0:city = str(geo[num].string)elif index == 1:provice = str(geo[num].string)elif index == 2:country = geo[num].string.split(' ')elif index == 3:lat_long= geo[num].string.split(',') else :continuenum=num+1json_data = {"ip" : ip,"latitude": float(lat_long[0]),"country": str(country[0]),"country_code": str(country[1][1:-1]),"longitude": float(lat_long[1]),"province": provice,"city": city}return json_data def search(self,ip):try:res = self.api.view(ip)geo = res['location']json_data = {"ip" : ip,"latitude": float(geo["longitude"]),"country": geo["country"],"country_code": geo["country_code"],"longitude": float(geo["latitude"]),"province": geo["province"],"city": geo["city"]}return json_dataexcept:json_data=self.censys_html_search(ip)return json_data def get_geo(self,ip): json_data=self.search(ip)if len(json_data) == 0:print "can not find ip: %s"%ipreturn -1print "get geo of ip: %s"%ipprint json_datareturn 1def main(self,ip_lst):lst=[]for ip in ip_lst:print "========================"finish_num = self.get_geo(ip)if finish_num == -1 :lst.append(ip)print lst
if __name__ == '__main__':ip_lst=["8.8.8.8"]print "=================================start=========================================="a=censys_ip()a.main(ip_lst)print "=================================end=========================================="
反正还可以凑活着用吧
最后,他们告诉我有genip…………………………………………………
无所谓啦,反正写着玩的
censys 数据库地理信息自定义接口(python版)相关推荐
- 接口测试之主流协议测试合集(python版)
http://t.csdn.cn/U4WHz 接口测试之主流协议测试合集(python版) 01 TCP/IP四层模型&OSI七层模型 02 IP协议 03 TCP协议 04 UDP协议 05 ...
- 金蝶云星空自定义接口:查询数据库
一.项目需求: 1.客户要求,在"海柔"系统上,调用"金蝶"自定义接口,满足海柔系统获取金蝶数据的效果. 二.代码思路: 1.自定义接口业务接口,调用金蝶标准登 ...
- 【Python】《大话设计模式》Python版代码实现
<大话设计模式>Python版代码实现 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼 ...
- 发明者本地回测平台python版[博]
原创博客地址:发明者本地回测平台python版[博] 网页版策略开发问题 1,没有自动提示 2,tab自动4个空格,问题是编译器无法识别4个空格,只能再把自动填充4空格改成tab 另一方面,官方提供安 ...
- 微信公众号推送课表及天气(事无巨细+JavaScript版+python版)
微信公众号推送课表及天气 22.10.16更新 我已经做出来更优秀的直接在聊天列表中推送的了! 请移步 企业微信推送 超强版! 基础 简介 作者:申也 个人网站:申也个人网站(www.dongshen ...
- VOT Toolkit工具使用说明(Python版)
VOT Toolkit工具使用说明(Python版) 一. 工具链接 vot-toolkit python版 github链: https://github.com/votchallenge/tool ...
- 爆肝5万字❤️Open3D 点云数据处理基础(Python版)
Open3D 点云数据处理基础(Python版) 文章目录 1 概述 2 安装 2.1 PyCharm 与 Python 安装 2.3 Anaconda 安装 2.4 Open3D 0.13.0 安装 ...
- GEE学习笔记 六十七:【GEE之Python版教程一】GEE学习背景介绍
相信很多人都对GEE已经比较熟悉了(只是不熟悉GEE的Python的API而已),这里只是做一个简单的总结概括一下GEE相关内容. 1.GEE学习基本要求 目前市面上无论出现什么新的技术,总会出现一种 ...
- 各省新高考等级赋分算法实现——python版
各省新高考等级赋分算法实现--python版 一.前言 新高考从2014年启动,目前已经有14个地区(省.市)实行了新高考改革分别是:浙江.上海.北京.山东.天津.海南.湖南.广东.江苏.重庆.河北. ...
最新文章
- 个人分析美国电脑销售现状(网店)
- 今日arXiv精选 | 31篇EMNLP 2021最新论文
- 图解集合8:红黑树的移除节点操作
- C#总结(二)事件Event 介绍总结
- Springboot-RabbitMq 参数配置详解
- windbg 符号表
- [转]asp.net(c#)生成验证码 点击可刷新
- js深入研究之Person类案例
- CSS之Screen视图属性
- 职场上不会“装傻”,才是真的傻!
- Hyperledger Fabric教程(5)-- byfn.sh分析-docker-compose-base.yaml
- 【洛谷P1037】 产生数
- ArcMap坐标系转换
- python cv2 轮廓的包络 面积_Python科学计算——检包络与去包络
- 扫描二维码报修公司电脑
- one 主格 复数 宾格_英语主格宾格形容词性物主代词及名词性物主代词练习题.doc...
- java aspx 验证码,asp 动态生成验证码
- 关于前端的CSS命名
- 【C语言】浮点型在内存的存储
- PS轻松制作GIF动态图