公司内部的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版)相关推荐

  1. 接口测试之主流协议测试合集(python版)

    http://t.csdn.cn/U4WHz 接口测试之主流协议测试合集(python版) 01 TCP/IP四层模型&OSI七层模型 02 IP协议 03 TCP协议 04 UDP协议 05 ...

  2. 金蝶云星空自定义接口:查询数据库

    一.项目需求: 1.客户要求,在"海柔"系统上,调用"金蝶"自定义接口,满足海柔系统获取金蝶数据的效果. 二.代码思路: 1.自定义接口业务接口,调用金蝶标准登 ...

  3. 【Python】《大话设计模式》Python版代码实现

    <大话设计模式>Python版代码实现 上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼 ...

  4. 发明者本地回测平台python版[博]

    原创博客地址:发明者本地回测平台python版[博] 网页版策略开发问题 1,没有自动提示 2,tab自动4个空格,问题是编译器无法识别4个空格,只能再把自动填充4空格改成tab 另一方面,官方提供安 ...

  5. 微信公众号推送课表及天气(事无巨细+JavaScript版+python版)

    微信公众号推送课表及天气 22.10.16更新 我已经做出来更优秀的直接在聊天列表中推送的了! 请移步 企业微信推送 超强版! 基础 简介 作者:申也 个人网站:申也个人网站(www.dongshen ...

  6. VOT Toolkit工具使用说明(Python版)

    VOT Toolkit工具使用说明(Python版) 一. 工具链接 vot-toolkit python版 github链: https://github.com/votchallenge/tool ...

  7. 爆肝5万字❤️Open3D 点云数据处理基础(Python版)

    Open3D 点云数据处理基础(Python版) 文章目录 1 概述 2 安装 2.1 PyCharm 与 Python 安装 2.3 Anaconda 安装 2.4 Open3D 0.13.0 安装 ...

  8. GEE学习笔记 六十七:【GEE之Python版教程一】GEE学习背景介绍

    相信很多人都对GEE已经比较熟悉了(只是不熟悉GEE的Python的API而已),这里只是做一个简单的总结概括一下GEE相关内容. 1.GEE学习基本要求 目前市面上无论出现什么新的技术,总会出现一种 ...

  9. 各省新高考等级赋分算法实现——python版

    各省新高考等级赋分算法实现--python版 一.前言 新高考从2014年启动,目前已经有14个地区(省.市)实行了新高考改革分别是:浙江.上海.北京.山东.天津.海南.湖南.广东.江苏.重庆.河北. ...

最新文章

  1. 个人分析美国电脑销售现状(网店)
  2. 今日arXiv精选 | 31篇EMNLP 2021最新论文
  3. 图解集合8:红黑树的移除节点操作
  4. C#总结(二)事件Event 介绍总结
  5. Springboot-RabbitMq 参数配置详解
  6. windbg 符号表
  7. [转]asp.net(c#)生成验证码 点击可刷新
  8. js深入研究之Person类案例
  9. CSS之Screen视图属性
  10. 职场上不会“装傻”,才是真的傻!
  11. Hyperledger Fabric教程(5)-- byfn.sh分析-docker-compose-base.yaml
  12. 【洛谷P1037】 产生数
  13. ArcMap坐标系转换
  14. python cv2 轮廓的包络 面积_Python科学计算——检包络与去包络
  15. 扫描二维码报修公司电脑
  16. one 主格 复数 宾格_英语主格宾格形容词性物主代词及名词性物主代词练习题.doc...
  17. java aspx 验证码,asp 动态生成验证码
  18. 关于前端的CSS命名
  19. 【C语言】浮点型在内存的存储
  20. PS轻松制作GIF动态图

热门文章

  1. css 滚动条样式修改
  2. cf 923B Producing Snow
  3. 免费的TCP测试工具,自己写的,运行jar包就能用,定时通过TCP协议发送自定义XML
  4. 如何秒级搭建低成本私人云盘
  5. vbox双网卡多台虚拟机及主机互ping且联网
  6. Unity2D游戏开发—— 控制主角 左右移动及跳跃 代码
  7. clover 显卡注入功能详细讲解
  8. Java开源开发平台O2OA V7.0发布,支持Docker容器化部署和三员管理模式
  9. 功能强大的远程终端神器MobaXterm
  10. 天使与魔鬼仅一线之隔