使用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 04 Python
Python 功能和特点(新手必学)
Dec 30 Python
Python中动态创建类实例的方法
Mar 24 Python
python实现csv格式文件转为asc格式文件的方法
Mar 23 Python
基于python批量处理dat文件及科学计算方法详解
May 08 Python
在python中实现将一张图片剪切成四份的方法
Dec 05 Python
对python同一个文件夹里面不同.py文件的交叉引用方法详解
Dec 15 Python
python3实现小球转动抽奖小游戏
Apr 15 Python
Python 3 实现定义跨模块的全局变量和使用教程
Jul 07 Python
python 环境搭建 及python-3.4.4的下载和安装过程
Jul 20 Python
python爬虫模拟浏览器访问-User-Agent过程解析
Dec 28 Python
总结Python变量的相关知识
Jun 28 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学习之PHP运算符
2006/10/09 PHP
PHP 第三节 变量介绍
2012/04/28 PHP
使用php get_headers 判断URL是否有效的解决办法
2013/04/27 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十六)
2014/06/30 PHP
PHP模块memcached使用指南
2014/12/08 PHP
php打造智能化的柱状图程序,用于报表等
2015/06/19 PHP
PHP 布尔值的自增与自减的实现方法
2018/05/03 PHP
Laravel5.5 实现后台管理登录的方法(自定义用户表登录)
2019/09/30 PHP
(JS实现)MapBar中坐标的加密和解密的脚本
2007/05/16 Javascript
JS的replace方法介绍
2012/10/20 Javascript
给jQuery方法添加回调函数一款插件的应用
2013/01/21 Javascript
javascript动态添加样式(行内式/嵌入式/外链式等规则)
2013/06/24 Javascript
jquery对ajax的支持介绍
2013/12/10 Javascript
jquery实现在光标位置插入内容的方法
2015/02/05 Javascript
jQuery如何使用自动触发事件trigger
2015/11/29 Javascript
理解jquery事件冒泡
2016/01/03 Javascript
轻松实现js选项卡切换效果
2016/09/24 Javascript
浅析javaScript中的浅拷贝和深拷贝
2017/02/15 Javascript
Ionic项目中Native Camera的使用方法
2017/06/07 Javascript
Angularjs的键盘事件的绑定
2017/07/27 Javascript
微信小程序自定义弹窗wcPop插件
2018/11/19 Javascript
解决layui 表单元素radio不显示渲染的问题
2019/09/04 Javascript
记一次用ts+vuecli4重构项目的实现
2020/05/21 Javascript
Python利用openpyxl库遍历Sheet的实例
2018/05/03 Python
python将三维数组展开成二维数组的实现
2019/11/30 Python
Anaconda的安装与虚拟环境建立
2020/11/18 Python
HTML5 Canvas图像模糊完美解决办法
2018/02/06 HTML / CSS
使用HTML5 Canvas为图片填充颜色和纹理的教程
2016/03/21 HTML / CSS
小组合作学习反思
2014/02/18 职场文书
2014三八妇女节活动总结
2014/03/01 职场文书
暑期教师培训方案
2014/06/07 职场文书
励志演讲稿3分钟
2014/08/21 职场文书
学习型家庭事迹材料
2014/12/20 职场文书
青年联谊会致辞
2015/07/31 职场文书
三十年再续同学情倡议书
2019/11/27 职场文书
SqlServer数据库远程连接案例教程
2021/07/15 SQL Server