使用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去除列表中重复元素的方法
Mar 20 Python
python各种语言间时间的转化实现代码
Mar 23 Python
Python实现冒泡排序的简单应用示例
Dec 11 Python
Python实现基于PIL和tesseract的验证码识别功能示例
Jul 11 Python
Python Numpy 实现交换两行和两列的方法
Jun 26 Python
Python常用模块logging——日志输出功能(示例代码)
Nov 20 Python
Python编程快速上手——Excel到CSV的转换程序案例分析
Feb 28 Python
python3实现往mysql中插入datetime类型的数据
Mar 02 Python
Python pytesseract验证码识别库用法解析
Jun 29 Python
Python执行时间的几种计算方法
Jul 31 Python
Python自动化测试基础必备知识点总结
Feb 07 Python
基于PyQT5制作一个桌面摸鱼工具
Feb 15 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 函数执行效率的小比较
2010/10/17 PHP
destoon实现公司新闻详细页添加评论功能的方法
2014/07/15 PHP
PHP互换两个变量值的方法(不用第三变量)
2016/11/14 PHP
javascript判断chrome浏览器的方法
2014/03/26 Javascript
修复bash漏洞的shell脚本分享
2014/12/31 Javascript
使用 TypeScript 重新编写的 JavaScript 坦克大战游戏代码
2015/04/07 Javascript
JavaSacript中charCodeAt()方法的使用详解
2015/06/05 Javascript
jquery地址栏链接与a标签链接匹配之特效代码总结
2015/08/24 Javascript
JS当前页面登录注册框,固定DIV,底层阴影的实例代码
2016/09/29 Javascript
漂亮实用的页面loading(加载)封装代码
2017/02/03 Javascript
javascript 面向对象function详解及实例代码
2017/02/28 Javascript
javascript算法之二叉搜索树的示例代码
2017/09/12 Javascript
vue实现导航栏效果(选中状态刷新不消失)
2017/12/13 Javascript
详解node child_process模块学习笔记
2018/01/24 Javascript
浅谈React的最大亮点之虚拟DOM
2018/05/29 Javascript
又拍云 Node.js 实现文件上传、删除功能
2018/10/28 Javascript
详解Next.js页面渲染的优化方案
2019/01/27 Javascript
Vue.directive 实现元素scroll逻辑复用
2019/11/29 Javascript
js实现超级玛丽小游戏
2020/03/18 Javascript
vue 使用 v-model 双向绑定父子组件的值遇见的问题及解决方案
2021/03/01 Vue.js
[36:43]NB vs Optic 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
[36:09]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
python实现封装得到virustotal扫描结果
2014/10/05 Python
Python利用前序和中序遍历结果重建二叉树的方法
2016/04/27 Python
利用pyinstaller或virtualenv将python程序打包详解
2017/03/22 Python
Python GUI编程完整示例
2019/04/04 Python
Pandas之Dropna滤除缺失数据的实现方法
2019/06/25 Python
如何定义一个可复用的服务
2014/09/30 面试题
毕业生个人求职信范例分享
2013/12/17 职场文书
学前教育毕业生自荐信范文
2013/12/24 职场文书
会计专业应届生自荐信
2014/06/28 职场文书
园林专业毕业生自荐信
2014/07/04 职场文书
2015年暑期社会实践活动总结
2015/03/27 职场文书
陈斌强事迹观后感
2015/06/17 职场文书
员工保密协议范本,您一定得收藏!很有用!
2019/08/08 职场文书
Python OpenCV 彩色与灰度图像的转换实现
2021/06/05 Python