使用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 07 Python
python 生成不重复的随机数的代码
May 15 Python
详解Python函数作用域的LEGB顺序
May 14 Python
Python使用matplotlib绘制三维图形示例
Aug 25 Python
python制作简单五子棋游戏
Jun 18 Python
Django用户认证系统 User对象解析
Aug 02 Python
python爬虫 猫眼电影和电影天堂数据csv和mysql存储过程解析
Sep 05 Python
python实现的发邮件功能示例
Sep 11 Python
python绘制无向图度分布曲线示例
Nov 22 Python
Python3爬虫中关于Ajax分析方法的总结
Jul 10 Python
Python机器学习算法之决策树算法的实现与优缺点
May 13 Python
python分分钟绘制精美地图海报
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
全国FM电台频率大全 - 31 新疆维吾尔族自治区
2020/03/11 无线电
十天学会php(2)
2006/10/09 PHP
PHP动态生成javascript文件的2个例子
2014/04/11 PHP
ThinkPHP框架任意代码执行漏洞的利用及其修复方法
2014/07/04 PHP
php获取客户端电脑屏幕参数的方法
2015/01/09 PHP
php登录超时检测功能实例详解
2017/03/21 PHP
php+ajax实现仿百度查询下拉内容功能示例
2017/10/20 PHP
JQuery AJAX实现目录浏览与编辑的代码
2008/10/21 Javascript
jQuery解决iframe高度自适应代码
2009/12/20 Javascript
jquery 表格分页等操作实现代码(pagedown,pageup)
2010/04/11 Javascript
JQuery切换显示的效果实例代码
2013/02/27 Javascript
JavaScript通过字符串调用函数的实现方法
2015/03/18 Javascript
jquery处理页面弹出层查询数据等待操作实例
2015/03/25 Javascript
js 将input框中的输入自动转化成半角大写(税号输入框)
2017/02/16 Javascript
js中字符型和数值型数字的互相转化方法(必看)
2017/04/25 Javascript
JavaScript中EventLoop介绍
2018/01/22 Javascript
jquery制作的移动端购物车效果完整示例
2020/02/24 jQuery
vue实现学生信息管理系统
2020/05/30 Javascript
Ant Design的Table组件去除
2020/10/24 Javascript
Python随机生成彩票号码的方法
2015/03/05 Python
Python实现周期性抓取网页内容的方法
2015/11/04 Python
Python2.x利用commands模块执行Linux shell命令
2016/03/11 Python
Python实现更改图片尺寸大小的方法(基于Pillow包)
2016/09/19 Python
Python统计分析模块statistics用法示例
2019/09/06 Python
Django中的模型类设计及展示示例详解
2020/05/29 Python
关于HTML5的安全问题开发人员需要牢记的
2012/06/21 HTML / CSS
HTML5 Web Database 数据库的SQL语句的使用方法
2012/12/09 HTML / CSS
美国宠物用品网站:Value Pet Supplies
2018/03/17 全球购物
美国艺术和工艺品商店:Hobby Lobby
2020/12/09 全球购物
一些Unix笔试题和面试题
2013/01/22 面试题
运动会解说词50字
2014/01/18 职场文书
文明宿舍获奖感言
2014/02/07 职场文书
高中历史教学反思
2014/02/08 职场文书
优秀工作者事迹材料
2014/12/26 职场文书
python数据可视化JupyterLab实用扩展程序Mito
2021/11/20 Python
pytorch中的torch.nn.Conv2d()函数图文详解
2022/02/28 Python