Python脚本实例 包括xml,json,http,编码

Posted in Python - 4 五月 2009 - No comment

这几天在研究python相关的一些东西,其中涉及的内容包括:

xml的解析,json的解析,urllib的使用,urllib的使用,python中中文编码的问题等

项目托管在Google上,地址是http://code.google.com/p/ipmobile/source/checkout

当然一切都来源于实际工作嘛,首先引入缘由,情景是这样的:

有一个Excel表格,有注册日期,用户ID,注册IP,注册手机号这几个字段,
但现在需要获取注册IP所在的地址 以及手机号所属地区等信息,
并根据这些信息进行分类统计等工作

当然如果在没有编码人员介入的情况下,
需要一个个的到一些网络上的页面上查出地址的信息,然后填到excel里,
而这完全是重复劳动,完全可以抽象并做出系统,在没有人力进行系统开发的情况下,
可以使用简单的脚本进行替代,
本文中,本人使用python脚本进行了相关研究和实验性的工作.用Python写出的代码的可读性非常的高的
首先是一个简单的例子使用过的是有道的接口获取IP和手机号码的地址的

#!/usr/bin/env python
#coding=utf-8

"""
getinfo.py
Created by Luke on 2009-04-29.
Copyright (c) 2009 Alibaba. All rights reserved.
"""

import urllib
from xml2dict import XML2Dict
import codecs

def gbk2utf8(xml):
    return xml.decode("gbk").encode("utf8").replace('gbk', 'utf-8');

def get_ip_info(ip):
    url="http://www.yodao.com/smartresult-xml/search.s?type=ip&q=%s"%ip
    return  gbk2utf8(urllib.urlopen(url).read())

def get_mobile_info(mobile):
    url="http://www.yodao.com/smartresult-xml/search.s?type=mobile&q=%s"%mobile
    return gbk2utf8(urllib.urlopen(url).read())

def main():
    fr = open('x.csv')
    wr = codecs.open('y.csv','w','gbk')
    xml = XML2Dict()
    for line in fr.readlines():
        line = line.rstrip('n')
        items = line.split(',')
        ip_item = items[2]
        mobile_item = items[3]
        ip_dict = xml.fromstring(get_ip_info(ip_item))
        mobile_dict = xml.fromstring(get_mobile_info(mobile_item))
        new_line=''
        if ip_dict.smartresult!=None:
            new_line = items[0]+','+items[1]+','+items[2]+','
                                         +ip_dict.smartresult.product.location.encode("gbk")
        else:
            new_line = items[0]+','+items[1]+','+items[2]+','
        if mobile_dict.smartresult!=None:
            new_line = new_line+','+items[3]+','
                                         +mobile_dict.smartresult.product.location.encode("gbk")+'n'
        else:
            new_line = new_line+','+items[3]+','+'n'
        print new_line.decode("gbk")
        wr.write(new_line.decode("gbk"))
    fr.close();
    wr.close();

if __name__ == '__main__':
    main()

这段代码从有道那获得的结果是xml编码格式为gbk的,所以在编码上我将其先转换成utf8的,然后再通过xml2dict将其转换成Python的字典结构,这样我就可以直接读取节点的值了.
这段代码还使用了urllib模块还有读文件写文件的相关知识点,总体来说还是很简单的,主要就是字符串的拼接了,这里的文件格式都是csv的很容易就可以编程excel的格式

但是问题来了,有的IP地址在有道这里查不出来,而在ip138这个网站上可以查出来,后来试了好多,发现IP138的数据库的数据貌似全一些,但是IP138没有提供任何数据读取的API,那怎么办呢?嘿嘿,那就用最那个的办法了,在脚本里解析使用正则表达式处理html,解析出想要的结果,代码如下:

"""
ip138poster.py
Created by Luke on 2009-05-04.
Copyright (c) 2009 Alibaba. All rights reserved.
"""

import httplib,urllib;  #加载模块
import re

class Ip138Poster:

def __init__(self):
        #定义一些文件头
        self.headers = {"Content-Type":"application/x-www-form-urlencoded",
                    "Connection":"Keep-Alive","Referer":"http://www.ip138.com/ips.asp"};
        #与网站构建一个连接
        self.conn = httplib.HTTPConnection("www.ip138.com");

def post(self,ip_addr):
        #定义需要进行发送的数据
        params = urllib.urlencode({'ip':ip_addr,'action':'2'});
        #开始进行数据提交   同时也可以使用get进行
        self.conn.request(method="POST",url="/ips8.asp",
                                            body=params,headers=self.headers);
        #返回处理后的数据
        response = self.conn.getresponse();
        #判断是否提交成功
        if response.status == 200:
            s=response.read()
            print s.decode("gbk")
            lis = re.findall(r"(?<=<li>).*?(?=</li>)",s)
            return lis

def get_main_data(self,ip_addr):
        ##下面的十六进制的值为"本站主数据:"的unicode
        self.main_data_parttern = r"(?<=xe6x9cxacxe7xabx99xe4xb8xbbxe6x95xb0xe6x8dxaexefxbcx9a).*"
        list = self.post(ip_addr)
        if len(list)>0:
            main_data = re.findall(self.main_data_parttern,list[0].decode("gbk").encode("utf8"))
        if len(main_data)>0:
            ret_value = main_data[0]
        return ret_value.decode("utf8")

def __del__(self):
        #关闭连接
        self.conn.close()

##由于需要匹配中文,所以需要转换,然后再匹配
def UTF2Hex(s):
    temp = s.encode("UTF-8").encode("hex")
    line = ""
    for i in range(0,len(temp)-1,2):
        line += "\x" + temp[i] + temp[i+1]
    return line

def GBK2Hex(s):
    temp = s.encode("GBK").encode("hex")
    line = ""
    for i in range(0,len(temp)-1,2):
        line += "\x" + temp[i] + temp[i+1]
    return line

if __name__ == '__main__':
    poster = Ip138Poster()
    print poster.get_main_data("121.0.29.231")

这里我还提供一个json的可选方案,可惜的是目前我没有发现国内的可以使用json协议获取ip地址信息的API(SOAP的万网好像有个),所以IP的API是使用国外的,手机号码信息查询国内是有API的,可以直接使用,代码非常非常简单,如下:

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/env python
# encoding: utf-8
"""
locatingsystem.py

Created by Luke on 2009-05-04.
Copyright (c) 2009 Alibaba.com. All rights reserved.
"""

import sys
import os
import urllib
import json

class LocatingSystem:
    def get_ip_json(self,ip):
        url="http://iplocationtools.com/ip_query.php?ip=%s&output=json"%ip
        return json.read(urllib.urlopen(url).read())

def get_mobile_json(self,mobile):
        url="http://api.showji.com/locating/?m=%s&output=json"%mobile
        return json.read(urllib.urlopen(url).read())

def main():
    ls = LocatingSystem()
    print ls.get_ip_json("134.34.54.56")
    print ls.get_mobile_json("13819127490")

if __name__ == '__main__':
    main()

python 手机号码归属 ip地址查询相关推荐

  1. python手机版代码-Python手机号码归属地查询代码

    简单的一个例子,是以前用Dephi写的,前不久刚实现了一个在Python中使用Delphi控件来编写界面程序,于是趁热写一个类似的的查询方案. 本实例是通过www.ip138.com这个网站来查询的, ...

  2. 全球IP归属地查询 IP地址查询

    全球IP归属地查询 IP地址查询 推荐一个非常简单的全球IP归属地查询 IP地址查询接口,只需要传入要查询的IP,即可返回相应的基本信息,以下是演示 请求地址是:http://ip.wyk-super ...

  3. java ip归属地查询_JAVA版IP地址查询调用示例

    package cn.juhe; import net.sf.json.JSONObject; import org.springframework.web.client.RestTemplate; ...

  4. 网络管理利器,通过IP地址查询跟踪网络

    在网络管理中,IP地址是一个非常重要的部分. 允许确定计算机的位置并且能够进行通信.Python提供了一些很棒的库来帮助进行IP地址查询.使用这些库来确定IP地址的地理位置,并且如何利用这些信息来进行 ...

  5. java webservice ip_通过Web Service实现IP地址查询功能的示例

    实例01 实现一个简单的Web服务访问 本实例将实现IP地址查询接口服务,根据用户传入的IP地址返回IP所在的省.市.地区,实例中将会用到IP地址库用于查询信息,由于数据较多,所以读者可在光盘资源文件 ...

  6. 利用IP地址查询接口来查询IP归属地

    如果我们在项目中需要获得用户的地址,而不仅仅是获得用户的IP,为了避免在自己的数据库里添加IP库,可以直接调用网上的第3方IP地址查询接口来查询IP归属地.今儿个在网上了解了这些接口,要么返回XML, ...

  7. 通过Web Service实现IP地址查询功能

    实例01  实现一个简单的Web服务访问 本实例将实现IP地址查询接口服务,根据用户传入的IP地址返回IP所在的省.市.地区,实例中将会用到IP地址库用于查询信息,由于数据较多,所以读者可在光盘资源文 ...

  8. Python10行代码制作企业内网IP地址查询网站

    企业内部您是否遇到过IP无法定位和查询的情况,而网络和运维的部分平台不便开放给其他用户.所以本次搭建简单的IP查询网站给普通用户使用, 环境: 1.mongodb(可使用其他数据库),数据库安装可自行 ...

  9. 用java程序编写ip仿真器_用java 编写一个可以实现IP地址查询功能的课程设计

    展开全部 下面是获得本机IP地址的方法,跟你的程序捆绑起来,互相发送消息的时候直接将IP发送过去 private static String[] getAllLocalHostIP(){ 323131 ...

  10. android的百度地图sdk获取ip,基于百度地图API的ip地址查询

    说明:使用ip地址查询太麻烦,偶然搜索发现有人已经写过基于百度API的ip地址查询,这个是前人的结晶,我只是修改了一些,勿喷. 用的python2.7,编码问题真是坑. 百度mapAPI私钥申请:ht ...

最新文章

  1. oracle 数据库创建表
  2. 在QT搭建的播放器外壳中嵌入SDL的窗口
  3. c语言测验答案,C语言测验题答案.doc
  4. 九十七、轻松搞定Python中的PDF办公自动化系列
  5. 交叉驰豫的影响因素_交叉滚子轴承系列吉林薄壁交叉滚子轴承用途博盈
  6. 计算机管理术语路径描述的是,directory
  7. 55种数据可视化开源工具_8种出色的开源数据可视化工具
  8. JAVA开发血泪之路:一步步搭建spring框架
  9. mysql carnation_14 springboot+mybatis集成pageHelper分页
  10. Android 对话框用法
  11. Java中IO流有哪些
  12. 大型企业用什么orm_企业信息化系统建设的方案有什么用?
  13. bochs运行xp_bochs安卓最新版下载
  14. 地铁运营行车组织方式
  15. JS实现答题上一题下一题
  16. 【Buzz】离线语音转文字、实时语音识别
  17. 【OR】YALMIP 二阶锥规划
  18. swagger配置使用及安全方案
  19. 揭秘老外聊天时常用的英文缩写
  20. 如何完全卸载VS2010(亲自体验过)

热门文章

  1. 灵山奇缘服务器维护中,灵山奇缘跨服系统详细介绍
  2. L44. 通配符匹配
  3. you-get遇到的坑
  4. 一款网页游戏外挂开发-数据抓包
  5. JUC强大的辅助工具类
  6. 关于RIGOL可编程电源连接说明(网口连接)
  7. 从 0 搭建 Vite 3 + Vue 3 前端工程化项目
  8. 计算机导论的平时分多少,2020级计算机导论
  9. Ruby语言的优点和缺点
  10. 10003 微信登录失败 redirect_uri域名与后台配置不一致