使用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 爬虫图片简单实现
Jun 01 Python
python 中的int()函数怎么用
Oct 17 Python
python不换行之end=与逗号的意思及用途
Nov 21 Python
python爬虫爬取网页表格数据
Mar 07 Python
Python assert关键字原理及实例解析
Dec 13 Python
Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式
Jan 10 Python
手把手教你进行Python虚拟环境配置教程
Feb 03 Python
Jupyter Notebook打开任意文件夹操作
Apr 14 Python
Python多线程thread及模块使用实例
Apr 28 Python
Python函数参数分类原理详解
May 28 Python
Python把图片转化为pdf代码实例
Jul 28 Python
浅谈Python中对象是如何被调用的
Apr 06 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合并两个数组的两种方式的异同
2012/09/14 PHP
PHP Switch 语句之学习笔记
2013/09/21 PHP
php安装php_rar扩展实现rar文件读取和解压的方法
2016/11/17 PHP
thinkphp中AJAX返回ajaxReturn()方法分析
2016/12/06 PHP
php异常处理捕获错误整理
2019/09/23 PHP
php+websocket 实现的聊天室功能详解
2020/05/27 PHP
fckeditor 获取文本框值的实现代码
2009/02/09 Javascript
JavaScript 原型与继承说明
2010/06/09 Javascript
子窗口、父窗口和Silverlight之间的相互调用
2010/08/16 Javascript
在一个js文件里远程调用jquery.js会在ie8下的一个奇怪问题
2010/11/28 Javascript
简单的ajax连接库分享(不用jquery的ajax)
2014/01/19 Javascript
解决jquery版本冲突的有效方法
2014/09/02 Javascript
原生js实现的贪吃蛇网页版游戏完整实例
2015/05/18 Javascript
jQuery短信验证倒计时功能实现方法详解
2016/05/25 Javascript
简单的渐变轮播插件
2017/01/12 Javascript
使用Promise链式调用解决多个异步回调的问题
2017/01/15 Javascript
win系统下nodejs环境安装配置
2017/05/04 NodeJs
vue-awesome-swiper滑块插件使用方法详解
2017/11/27 Javascript
vue.js仿hover效果的实现方法示例
2019/01/28 Javascript
详解Vue中的基本语法和常用指令
2019/07/23 Javascript
ansible作为python模块库使用的方法实例
2017/01/17 Python
Python3实现发送QQ邮件功能(文本)
2017/12/15 Python
检测python爬虫时是否代理ip伪装成功的方法
2019/07/12 Python
python 6.7 编写printTable()函数表格打印(完整代码)
2020/03/25 Python
CSS3 倾斜的网页图片库实例教程
2009/11/14 HTML / CSS
Html5 Canvas 实现一个“刮刮乐”游戏
2019/09/05 HTML / CSS
中国专业的综合网上购物商城:京东
2016/08/02 全球购物
美国名牌香水折扣网站:Hottperfume
2021/02/10 全球购物
公司清洁工岗位职责
2013/12/14 职场文书
计算机专业学生求职信分享
2013/12/15 职场文书
五一服装活动方案
2014/01/11 职场文书
优秀信贷员先进事迹
2014/01/31 职场文书
教育技术学专业职业规划书
2014/03/03 职场文书
优秀广告词大全
2014/03/19 职场文书
应届毕业生的自我评价
2019/06/21 职场文书
导游词之蓬莱长岛
2019/12/17 职场文书