使用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使用Queue在多个子进程间交换数据的方法
Apr 18 Python
在Python中操作文件之truncate()方法的使用教程
May 25 Python
Python两个内置函数 locals 和globals(学习笔记)
Aug 28 Python
python操作mysql代码总结
Jun 01 Python
解决PyCharm import torch包失败的问题
Oct 13 Python
python 移动图片到另外一个文件夹的实例
Jan 10 Python
python实现两个经纬度点之间的距离和方位角的方法
Jul 05 Python
python绘制直方图和密度图的实例
Jul 08 Python
使用tqdm显示Python代码执行进度功能
Dec 08 Python
django API 中接口的互相调用实例
Apr 01 Python
解决jupyter运行pyqt代码内核重启的问题
Apr 16 Python
解决python 输出到csv 出现多空行的情况
Mar 24 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之数据库操作详解及乱码解决!
2007/01/02 PHP
比file_get_contents稳定的curl_get_contents分享
2012/01/11 PHP
php 删除目录下N分钟前创建的所有文件的实现代码
2013/08/10 PHP
php 删除cookie方法详解
2014/12/01 PHP
PHP中preg_match正则匹配中的/u、/i、/s含义
2015/04/17 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
Javascript写了一个清除“logo1_.exe”的杀毒工具(可扫描目录)
2007/02/09 Javascript
基于jQuery的实现简单的分页控件
2010/10/10 Javascript
清除div下面的所有标签的方法
2014/02/17 Javascript
KnockoutJS 3.X API 第四章之事件event绑定
2016/10/10 Javascript
JS完成画圆圈的小球
2017/03/07 Javascript
vue开发调试神器vue-devtools使用详解
2017/07/13 Javascript
Vue父子模版传值及组件传值的三种方法
2017/11/27 Javascript
layui中使用jquery控制radio选中事件的示例代码
2018/08/15 jQuery
jquery ui 实现 tab标签功能示例【测试可用】
2019/07/25 jQuery
vue中音频wavesurfer.js的使用方法
2020/02/20 Vue.js
深入理解 ES6中的 Reflect用法
2020/07/18 Javascript
Node.js web 应用如何封装到Docker容器中
2020/09/01 Javascript
Python探索之实现一个简单的HTTP服务器
2017/10/28 Python
机器学习10大经典算法详解
2017/12/07 Python
python查看文件大小和文件夹内容的方法
2019/07/08 Python
python 使用pdfminer3k 读取PDF文档的例子
2019/08/27 Python
Python数据分析模块pandas用法详解
2019/09/04 Python
pytorch 实现将自己的图片数据处理成可以训练的图片类型
2020/01/08 Python
Python抖音快手代码舞(字符舞)的实现方法
2021/02/07 Python
使用html5 canvas创建太空游戏的示例
2014/05/08 HTML / CSS
酒店办公室文员岗位职责
2013/12/18 职场文书
护理中职生求职信范文
2014/02/24 职场文书
自主招生学校推荐信
2014/09/26 职场文书
大学生村官入党自传
2015/06/26 职场文书
信息技术远程培训心得体会
2016/01/09 职场文书
2019奶茶店创业计划书范本!
2019/07/15 职场文书
浅谈Redis位图(Bitmap)及Redis二进制中的问题
2021/07/15 Redis
html5实现点击弹出图片功能
2021/07/16 HTML / CSS
用Python爬取英雄联盟的皮肤详细示例
2021/12/06 Python
Three.js实现雪糕地球的使用示例详解
2022/07/07 Javascript