使用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中字典的基础知识归纳小结
Aug 19 Python
python脚本实现xls(xlsx)转成csv
Apr 10 Python
python爬虫系列Selenium定向爬取虎扑篮球图片详解
Nov 15 Python
Python3.6实现带有简单界面的有道翻译小程序
Apr 16 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
May 27 Python
梅尔频率倒谱系数(mfcc)及Python实现
Jun 18 Python
Django使用unittest模块进行单元测试过程解析
Aug 02 Python
django将网络中的图片,保存成model中的ImageField的实例
Aug 07 Python
余弦相似性计算及python代码实现过程解析
Sep 18 Python
Python银行系统实战源码
Oct 25 Python
python爬虫开发之Beautiful Soup模块从安装到详细使用方法与实例
Mar 09 Python
python入门学习关于for else的特殊特性讲解
Nov 20 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
ThinkPHP3.1新特性之对Ajax的支持更加完善
2014/06/19 PHP
Yii净化器CHtmlPurifier用法示例(过滤不良代码)
2016/07/15 PHP
读JavaScript DOM编程艺术笔记
2011/11/15 Javascript
js浏览器本地存储store.js介绍及应用
2014/05/13 Javascript
js动态修改整个页面样式达到换肤效果
2014/05/23 Javascript
jQuery ajax分页插件实例代码
2016/01/27 Javascript
Javascript 普通函数和构造函数的区别
2016/11/05 Javascript
原生JS与jQuery编写简单选项卡
2017/10/30 jQuery
JS实现访问DOM对象指定节点的方法示例
2018/04/04 Javascript
vue如何截取字符串
2019/05/06 Javascript
解决layui table表单提示数据接口请求异常的问题
2019/09/24 Javascript
基于vue实现图片验证码倒计时60s功能
2019/12/10 Javascript
jQuery+ThinkPHP实现图片上传
2020/07/23 jQuery
Python的Flask框架中web表单的教程
2015/04/20 Python
Python实现代码统计工具(终极篇)
2016/07/04 Python
python实现跨excel的工作表sheet之间的复制方法
2018/05/03 Python
python flask框架实现重定向功能示例
2019/07/02 Python
python 计算两个列表的相关系数的实现
2019/08/29 Python
利用python实现冒泡排序算法实例代码
2019/12/01 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
2020/02/07 Python
Python如何使用队列方式实现多线程爬虫
2020/05/12 Python
Django之腾讯云短信的实现
2020/06/12 Python
CSS3实现的文本3D效果附图
2014/09/03 HTML / CSS
HTML5新增的标签和属性归纳总结
2018/05/02 HTML / CSS
Perricone MD裴礼康美国官网:抗衰老护肤品
2016/09/26 全球购物
财务会计专业个人求职信范本
2014/01/08 职场文书
《苏珊的帽子》教学反思
2014/04/07 职场文书
学历公证委托书
2014/04/09 职场文书
大学开学计划书
2014/04/30 职场文书
基层工作经验证明样本
2014/11/16 职场文书
2014年食品安全工作总结
2014/12/04 职场文书
环保宣传语大全
2015/07/13 职场文书
商务信函英语问候语
2015/11/10 职场文书
详解vue身份认证管理和租户管理
2021/05/25 Vue.js
MYSQL 的10大经典优化案例场景实战
2021/09/14 MySQL
关于SpringBoot 使用 Redis 分布式锁解决并发问题
2021/11/17 Redis