使用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实现备份文件实例
Sep 16 Python
初步讲解Python中的元组概念
May 21 Python
python实现稀疏矩阵示例代码
Jun 09 Python
详解python中asyncio模块
Mar 03 Python
python 日期操作类代码
May 05 Python
Python操作Sql Server 2008数据库的方法详解
May 17 Python
Python 多线程不加锁分块读取文件的方法
Dec 11 Python
python实现任意位置文件分割的实例
Dec 14 Python
浅谈Pytorch torch.optim优化器个性化的使用
Feb 20 Python
python GUI库图形界面开发之PyQt5动态加载QSS样式文件
Feb 25 Python
django ObjectDoesNotExist 和 DoesNotExist的用法
Jul 09 Python
Python实现敏感词过滤的4种方法
Sep 12 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+mysql写的简单留言本实例代码
2008/07/25 PHP
PHP获取MSN好友列表类的实现代码
2013/06/23 PHP
PHP实现对png图像进行缩放的方法(支持透明背景)
2015/07/15 PHP
Symfony2中被遗弃的getRequest()方法分析
2016/03/17 PHP
详解PHP变量传值赋值和引用赋值变量销毁
2019/03/23 PHP
用JavaScript事件串连执行多个处理过程的方法
2007/03/09 Javascript
表单元素事件 (Form Element Events)
2009/07/17 Javascript
判断浏览器的javascript版本的代码
2010/09/03 Javascript
jQuery find和children方法使用
2011/01/31 Javascript
用javascript判断IE版本号简单实用且向后兼容
2013/09/11 Javascript
javascript不可用的问题探究
2013/10/01 Javascript
JavaScript利用正则表达式去除日期中的“-”
2014/07/01 Javascript
jquery实现炫酷的叠加层自动切换特效
2015/02/01 Javascript
详解JavaScript中getFullYear()方法的使用
2015/06/10 Javascript
JS传播事件、取消事件默认行为、阻止事件传播详解
2017/08/14 Javascript
Vue中v-for的数据分组实例
2018/03/07 Javascript
微信小程序如何播放腾讯视频的实现
2019/09/20 Javascript
VuePress 中如何增加用户登录功能
2019/11/29 Javascript
跟老齐学Python之重回函数
2014/10/10 Python
python根据开头和结尾字符串获取中间字符串的方法
2015/03/26 Python
win10下Python3.6安装、配置以及pip安装包教程
2017/10/01 Python
python实现人民币大写转换
2018/06/20 Python
Python.append()与Python.expand()用法详解
2019/12/18 Python
浅谈keras中的后端backend及其相关函数(K.prod,K.cast)
2020/06/29 Python
python开发一个解析protobuf文件的简单编译器
2020/11/17 Python
HTML5如何使用SVG的方法示例
2019/01/11 HTML / CSS
惊艳的手工时装首饰:Migonne Gavigan
2018/02/23 全球购物
什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?
2012/05/23 面试题
本科生职业生涯规划书范文
2014/01/21 职场文书
课例研修方案
2014/05/31 职场文书
领导干部作风整顿剖析材料
2014/10/11 职场文书
单位婚育证明范本
2014/11/21 职场文书
小学音乐教师个人工作总结
2015/02/05 职场文书
关于艺术节的开幕致辞
2016/03/04 职场文书
毕业欢送晚会主持词
2019/06/25 职场文书
python内置模块之上下文管理contextlib
2022/06/14 Python