使用Python程序抓取新浪在国内的所有IP的教程


Posted in Python onMay 04, 2015

数据分析,特别是网站分析中需要对访问者的IP进行分析,分析IP中主要是区分来访者的省份+城市+行政区数据,考虑到目前纯真IP数据库并没有把这些数据做很好的区分,于是寻找了另外一个可行的方案(当然不是花钱买哈)。解决方案就是抓取新浪的IP数据。

新浪的IP数据接口为:
 
http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=123.124.2.85

返回的数据为:
 

{"ret":1,"start":"123.123.221.0","end":"123.124.158.29","country":"\u4e2d\u56fd","province":"\u5317\u4eac","city":"\u5317\u4eac","district":"","isp":"\u8054\u901a","type":"","desc":""}

其返回的内容中已经包含了省份+城市+行政区信息了,这就是我们真实想要的。

下面就来说说如何来抓取这部分IP数据,要抓取这部分数据的主要工作就是枚举,即将接口中的IP不断的替换,要替换所有的IP地址肯定不太可能,所以我们缩小下范围,只穷举所有中国的IP段。考虑到新浪的IP接口返回的是IP段,所以要穷举的部分又少了一部分。再考虑啊到IP段的最后一位及256个IP基本上都是在一个地区,所以我们要穷举的数据有少了很多。对于穷举最重要的是把IP地址换成INT型。

具体国内有多少IP地址段,可以到APNIC官方网站去查找或下面的文档

http://ftp.apnic.net/apnic/dbase/data/country-ipv4.lst

下面就来看看穷举程序如何写:

 

import re

 
def ipv3_to_int(s):
  l = [int(i) for i in s.split('.')]
  return (l[0] << 16) | (l[1] << 8) | l[2]

 
def int_to_ipv3(s):
  ip1 = s >> 16 & 0xFF
  ip2 = s >> 8 & 0xFF
  ip3 = s & 0xFF
  return "%d.%d.%d" % (ip1, ip2, ip3)

 
i = open('ChinaIPAddress.csv', 'r')
list = i.readlines()
for iplist in list:
  pattern = re.compile('(\d{1,3}\.\d{1,3}\.\d{1,3})\.\d{1,3}')
  ips = pattern.findall(iplist)
  x = ips[0]
  y = ips[1]
  for ip in range (ipv3_to_int(x),ipv3_to_int(y)):
    ipadress=str(ip)
    #ip_address = int_to_ipv3(ip)
    o = open('ChinaIPAddress.txt','a')
    o.writelines(ipadress)
    o.writelines('\n')
  o.close()
i.close()

当上面的不走完成后就可以对新浪IP接口进行抓取了,抓取代码如下:
 

#!/usr/bin/python
# -*- coding: utf-8 -*-
import urllib,urllib2, simplejson, sqlite3, time

 
def ipv3_to_int(s):
  l = [int(i) for i in s.split('.')]
  return (l[0] << 16) | (l[1] << 8) | l[2]

 
def int_to_ipv4(s):
  ip1 = s >> 16 & 0xFF
  ip2 = s >> 8 & 0xFF
  ip3 = s & 0xFF
  return "%d.%d.%d.0" % (ip1, ip2, ip3)

 
def fetch(ipv4, **kwargs):
  kwargs.update({
    'ip': ipv4,
    'format': 'json',
  })
  DATA_BASE = "http://int.dpool.sina.com.cn/iplookup/iplookup.php"
  url = DATA_BASE + '?' + urllib.urlencode(kwargs)
  print url
  fails = 0
  try:
    result = simplejson.load(urllib2.urlopen(url,timeout=20))
  except (urllib2.URLError,IOError):
    fails += 1
    if fails < 10:
      result = fetch(ipv4)
    else:
      sleep_download_time = 60*10
      time.sleep(sleep_download_time)
      result = fetch(ipv4)
  return result

 
def dbcreate():
  c = conn.cursor()
  c.execute('''create table ipdata(
    ip integer primary key,
    ret integer,
    start text,
    end text,
    country text,
    province text,
    city text,
    district text,
    isp text,
    type text,
    desc text
  )''')
  conn.commit()
  c.close()

 
def dbinsert(ip,address):
  c = conn.cursor()
  c.execute('insert into ipdata values(?,?,?,?,?,?,?,?,?,?,?)',(ip,address['ret'],address['start'],address['end'],address['country'],address['province'],address['city'],address['district'],address['isp'],address['type'],address['desc']))
  conn.commit()
  c.close()

 
conn = sqlite3.connect('ipaddress.sqlite3.db')
dbcreate()

 
i = open('ChinaIPAddress.txt','r')
list = [s.strip() for s in i.readlines()]
end = 0
for ip in list:
  ip = int(ip)
  if ip > end :
    ipaddress = int_to_ipv4(ip)
    info = fetch(ipaddress)
    if info['ret'] == -1:
      pass
    else:
      dbinsert(ip,info)
      end = ipv3_to_int(info['end'])
      print ip,end
  else :
    pass
i.close()

到此就能把新浪所有的国内IP数据给抓取出来,然后在数据分析的工程中大派用场。~

Python 相关文章推荐
讲解Python中fileno()方法的使用
May 24 Python
有趣的python小程序分享
Dec 05 Python
解决Python的str强转int时遇到的问题
Apr 09 Python
Python实现的个人所得税计算器示例
Jun 01 Python
django的ORM操作 删除和编辑实现详解
Jul 24 Python
Python sklearn库实现PCA教程(以鸢尾花分类为例)
Feb 24 Python
如何使用PyCharm将代码上传到GitHub上(图文详解)
Apr 27 Python
浅谈Python 函数式编程
Jun 20 Python
PyCharm2019 安装和配置教程详解附激活码
Jul 31 Python
如何使用PyCharm引入需要使用的包的方法
Sep 22 Python
Python爬虫基础初探selenium
May 31 Python
Python max函数中key的用法及原理解析
Jun 26 Python
Python版微信红包分配算法
May 04 #Python
用Python编写一个每天都在系统下新建一个文件夹的脚本
May 04 #Python
用Python编写生成树状结构的文件目录的脚本的教程
May 04 #Python
使用Python脚本将Bing的每日图片作为桌面的教程
May 04 #Python
详解Python的Django框架中的通用视图
May 04 #Python
在Python中使用matplotlib模块绘制数据图的示例
May 04 #Python
使用Python生成url短链接的方法
May 04 #Python
You might like
javascript中的delete使用详解
2013/04/11 Javascript
js导出table到excel同时兼容FF和IE示例
2013/09/03 Javascript
Bootstrap轮播插件中图片变形的终极解决方案 使用jqthumb.js
2016/07/10 Javascript
jQuery自定义插件详解及实例代码
2016/12/29 Javascript
bootstrapValidator表单验证插件学习
2016/12/30 Javascript
微信小程序(六):列表上拉加载下拉刷新示例
2017/01/13 Javascript
Bootstrap模态框(Modal)实现过渡效果
2017/03/17 Javascript
JS简单生成随机数(随机密码)的方法
2017/05/11 Javascript
AngularJS 控制器 controller的详解
2017/10/17 Javascript
JS使用tween.js动画库实现轮播图并且有切换功能
2018/07/17 Javascript
JavaScript简单实现关键字文本搜索高亮显示功能示例
2018/07/25 Javascript
Vue.js 事件修饰符的使用教程
2018/11/01 Javascript
基于Vue组件化的日期联动选择器功能的实现代码
2018/11/30 Javascript
js prototype和__proto__的关系是什么
2019/08/23 Javascript
vuex中store存储store.commit和store.dispatch的用法
2020/07/24 Javascript
vue 虚拟DOM的原理
2020/10/03 Javascript
[00:52]玛尔斯技能全介绍
2019/03/06 DOTA
[41:21]夜魇凡尔赛茶话会 第三期02:看图识人
2021/03/11 DOTA
python编程通过蒙特卡洛法计算定积分详解
2017/12/13 Python
python读取文本绘制动态速度曲线
2018/06/21 Python
Django Admin中增加导出Excel功能过程解析
2019/09/04 Python
Ubuntu下Python+Flask分分钟搭建自己的服务器教程
2019/11/19 Python
Python 基于FIR实现Hilbert滤波器求信号包络详解
2020/02/26 Python
HTML5 canvas基本绘图之文字渲染
2016/06/27 HTML / CSS
捷克玩具商店:Bambule
2019/02/23 全球购物
Python里面search()和match()的区别
2016/09/21 面试题
函授本科毕业生自我鉴定
2013/10/16 职场文书
中学生运动会入场词
2014/02/12 职场文书
《千年梦圆在今朝》教学反思
2014/02/24 职场文书
公诉意见书范文
2015/06/05 职场文书
行政后勤人员工作计划应该怎么写?
2019/08/16 职场文书
Python爬虫之爬取最新更新的小说网站
2021/05/06 Python
企业开发CSS命名BEM代码规范实践
2022/02/12 HTML / CSS
css常用字体属性与背景属性介绍
2022/02/28 HTML / CSS
CentOS7环境下MySQL8常用命令小结
2022/06/10 Servers
Python可视化神器pyecharts之绘制箱形图
2022/07/07 Python