使用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模拟登录百度贴吧(百度贴吧登录)实例
Dec 18 Python
深入理解Python中装饰器的用法
Jun 28 Python
PyChar学习教程之自定义文件与代码模板详解
Jul 17 Python
Python实现希尔排序算法的原理与用法实例分析
Nov 23 Python
Python基于opencv的图像压缩算法实例分析
May 03 Python
值得收藏,Python 开发中的高级技巧
Nov 23 Python
Python实现点阵字体读取与转换的方法
Jan 29 Python
Python 互换字典的键值对实例
Feb 12 Python
Python enumerate函数功能与用法示例
Mar 01 Python
利用Python绘制Jazz网络图的例子
Nov 21 Python
Django模板标签{% for %}循环,获取制定条数据实例
May 14 Python
教你怎么用PyCharm为同一服务器配置多个python解释器
May 31 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
php文章内容分页并生成相应的htm静态页面代码
2010/06/07 PHP
php文件下载处理方法分析
2015/04/22 PHP
PHP异常处理Exception类
2015/12/11 PHP
phpstudy隐藏index.php的方法
2020/09/21 PHP
用JS写的一个TableView控件代码
2010/01/23 Javascript
JavaScript 题型问答有答案参考
2010/02/17 Javascript
js 函数的副作用分析
2011/08/23 Javascript
js关闭子窗体刷新父窗体实现方法
2012/12/04 Javascript
使用javascript创建快捷方式的简单实例
2013/08/09 Javascript
jquery鼠标停止移动事件
2013/12/21 Javascript
JavaScript关闭当前页面(窗口)不带任何提示
2014/03/26 Javascript
javascript中不提供sleep功能如何实现这个功能
2014/05/27 Javascript
JavaScript中停止执行setInterval和setTimeout事件的方法
2015/05/14 Javascript
JS实现的二叉树算法完整实例
2017/04/06 Javascript
jquery 校验中国身份证号码实例详解
2017/04/11 jQuery
JavaScript实现form表单的多文件上传
2020/03/27 Javascript
微信小程序实现折叠面板
2018/01/31 Javascript
element-ui如何防止重复提交的方法步骤
2019/12/09 Javascript
[04:23]DOTA2上海特锦赛小组赛第一日 TOP10精彩集锦
2016/02/27 DOTA
[48:12]Secret vs Optic Supermajor 胜者组 BO3 第三场 6.4
2018/06/05 DOTA
Python实现获取命令行输出结果的方法
2017/06/10 Python
python3使用GUI统计代码量
2019/09/18 Python
Django中使用haystack+whoosh实现搜索功能
2019/10/08 Python
python实现将视频按帧读取到自定义目录
2019/12/10 Python
Python文本文件的合并操作方法代码实例
2020/03/31 Python
Python实现GIF图倒放
2020/07/16 Python
Python使用sys.exc_info()方法获取异常信息
2020/07/23 Python
解决python打开https出现certificate verify failed的问题
2020/09/03 Python
各大浏览器 CSS3 和 HTML5 兼容速查表 图文
2010/04/01 HTML / CSS
css3弹性盒模型实例介绍
2013/05/27 HTML / CSS
HTML5 canvas实现移动端上传头像拖拽裁剪效果
2016/03/14 HTML / CSS
企业内部培训方案
2014/02/04 职场文书
大学三年计划书范文
2014/04/30 职场文书
2014年教师党员自我评议
2014/09/19 职场文书
Python经常使用的一些内置函数
2022/04/11 Python
TypeScript 内置高级类型编程示例
2022/09/23 Javascript