python3制作简单的ip提取

栏目: Python · 发布时间: 6年前

内容简介:python3制作简单的ip提取

python3制作简单的ip提取

这里先介绍一下任务,前一段时间布置下来一项任务,给一个ip文档,将其中山西省的ip筛选出来,要两周内完成任务。由于接下来两周的电工实习,实习完又是各种考试,导致任务一直没时间进行,直到放假了才有多余的时间来做这项任务。下面是我做的笔记简单介绍,不懂的地方欢迎留言!

准备环境 python 3,win10系统,当然 linux 更好,win下需要安装reuqests模块(调用第三方接口进行ip归属地查询需要发起请求)

C:\Users\92039\Desktop>pip install requests
Collecting requests
  Downloading requests-2.18.4-py2.py3-none-any.whl (88kB)
100% |████████████████████████████████| 92kB 533kB/s
Collecting chardet<3.1.0,>=3.0.2 (from requests)
  Downloading chardet-3.0.4-py2.py3-none-any.whl (133kB)
100% |████████████████████████████████| 143kB 970kB/s
Collecting idna<2.7,>=2.5 (from requests)
  Downloading idna-2.6-py2.py3-none-any.whl (56kB)
100% |████████████████████████████████| 61kB 1.4MB/s
Collecting urllib3<1.23,>=1.21.1 (from requests)
  Downloading urllib3-1.22-py2.py3-none-any.whl (132kB)
100% |████████████████████████████████| 133kB 848kB/s
Collecting certifi>=2017.4.17 (from requests)
  Downloading certifi-2018.1.18-py2.py3-none-any.whl (151kB)
100% |████████████████████████████████| 153kB 1.2MB/s
Installing collected packages: chardet, idna, urllib3, certifi, requests
Successfully installed certifi-2018.1.18 chardet-3.0.4 idna-2.6 requests-2.18.4 urllib3-1.22

我这里调用阿里的第三方接口进行IP归属地查询,接口地址 http://ip.taobao.com/instructions.php

接口描述

1. 请求接口(GET):
/service/getIpInfo.php?ip=[ip地址字串]
2. 响应信息:
(json格式的)国家 、省(自治区或直辖市)、市(县)、运营商
3. 返回数据格式:
{"code":0,"data":{"ip":"210.75.225.254","country":"\u4e2d\u56fd","area":"\u534e\u5317",
"region":"\u5317\u4eac\u5e02","city":"\u5317\u4eac\u5e02","county":"","isp":"\u7535\u4fe1",
"country_id":"86","area_id":"100000","region_id":"110000","city_id":"110000",
"county_id":"-1","isp_id":"100017"}}
其中code的值的含义为,0:成功,1:失败。

这里大概介绍一下思路,读取文件,定义函数,进行循环,发起请求,接收参数,判断,筛选并写入文件,完成。

运行python文件先写头文件格式,告诉系统运行python3的代码,并且以utf-8编码

#!usr/bin/python3
#-*-coding:utf-8-*-
#!usr/bin/python3
#-*-coding:utf-8-*-
import requests   #引入requests模块
def checkip(ip):  #定义函数
pass          #在写程序前先pass查看程序基本框架,运行程序查看是否有错
import requests
#!usr/bin/python3
#-*-coding:utf-8-*-
import requests
def checkip(ip):
    URL = 'http://ip.taobao.com/service/getIpInfo.php?ip=' + ip
    r = requests.get('URL',timeout=3) #发起get请求并设置超时
    print('test') #此处设置断点查看代码是否有错
ip = '118.81.96.128'
checkip(ip)    

运行代码结果如下,初步判断代码应该没问题

C:\Users\92039\Desktop>python 2.py test
#!usr/bin/python3
#-*-coding:utf-8-*-
import requests
def checkip(ip):
    URL = 'http://ip.taobao.com/service/getIpInfo.php?ip=' + ip
    r = requests.get('URL',timeout=3)
    print('test') #此处设置断点查看代码是否有错
ip = '118.81.96.128'
checkip(ip)
#!usr/bin/python3
#-*-coding:utf-8-*-
import requests
def checkip(ip):
    URL = 'http://ip.taobao.com/service/getIpInfo.php?ip=' + ip
    r = requests.get('URL',timeout=3)
    json_data = r.json() #接收到的json传递给json_data
    region = json_data[u'data'][u'region'] #解析到json地区名传递给region
    print('test')  #检验是否有错
ip = '118.81.96.128'
checkip(ip)

region = json_data[u'data'][u'region']

此处代码是按照接口返回的json的格式来写的

#!usr/bin/python3
#-*-coding:utf-8-*-
import requests
def checkip(ip):
    URL = 'http://ip.taobao.com/service/getIpInfo.php?ip=' + ip
    r = requests.get('URL',timeout=3)
    json_data = r.json()
    region = json_data[u'data'][u'region']
    print(region)  #输出查询到的地区名
ip = '118.81.96.128'
checkip(ip)

C:\Users\92039\Desktop>python 2.py

山西省

测试成功

即便Python程序的语法是正确的,在运行它的时候,也有可能发生错误。运行期检测到的错误被称为异常。大多数的异常都不会被程序处理,而是以错误形式展现

这时候就要进行异常处理

引入try/except

def yichang():
try:
        x = 1/0
except ZeroDivisionError as err:
        print('异常:', err)
yichang()

C:\Users\92039\Desktop>python 5.py

异常: division by zero

如果未做异常处理将直接报错,导致程序无法继续执行部

#!usr/bin/python3
#-*-coding:utf-8-*-
import requests
def checkip(ip):
try:
        URL = 'http://ip.taobao.com/service/getIpInfo.php?ip=' + ip
        r = requests.get(URL,timeout=3)
        json_data = r.json()
        region = json_data[u'data'][u'region']
        print(region)
except:
pass
ip = '118.81.96.128'
checkip(ip)

C:\Users\92039\Desktop>python 2.py

山西省

接下来加入if判断

#!usr/bin/python3
#-*-coding:utf-8-*-
import requests
def checkip(ip):
try:
        URL = 'http://ip.taobao.com/service/getIpInfo.php?ip=' + ip
        r = requests.get(URL,timeout=3)
        json_data = r.json()
        region = json_data[u'data'][u'region']
if region == '山西省':
pass
else:
pass
except:
pass
ip = '118.81.96.128'
checkip(ip)

然后需要加入打开文件部分的代码

当做文件处理时,需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄。

file = open("a.txt")
data = file.read()
file.close()

这里有两个问题。一是可能忘记关闭文件句柄;二是文件读取数据发生异常,没有进行任何处理

然而with可以很好的处理上下文环境产生的异常

with open("a.txt") as f:
    data = f.read()
with open('ips.txt') as f:       #打开ips这个文本文档作为f
    ips = f.read().split("\n")   #读取整个文档并去除换行符
for ip in ips:               
        print(ip)                #循环打印读取到的ip

ips.txt中写入了3个ip

222.31.41.253 #山西省
202.12.15.52  #日本
61.135.169.12 #北京

运行结果

C:\Users\92039\Desktop>python 3.py
222.31.41.253 202.12.15.52 61.135.169.121

将该模块加入到代码中

#!usr/bin/python3
#-*-coding:utf-8-*-
import requests
def checkip(ip):
try:
        URL = 'http://ip.taobao.com/service/getIpInfo.php?ip=' + ip
        r = requests.get(URL,timeout=3)
        json_data = r.json()
        region = json_data[u'data'][u'region']
if region == '山西省':
            print(ip)
else:
pass
except:
pass
with open('ips.txt') as f:
    ips = f.read().split("\n")
for ip in ips:
        print(ip)
        checkip(ip)
C:\Users\92039\Desktop>python 2.py 222.31.41.253  222.31.41.253  202.12.15.52 61.135.169.121 

因为有两次输出,属于山西省的ip会打印两次,由运行结果可知只有第一个ip属于山西省

接下来要加入写入文件的模块,将属于山西省的ip全部写入一个文件

with open('a.txt','a') as fw:   #打开a.txt文档,没有则创建一个,a模式不会改动原有数据
for i in range(5):
        fw.write('\na')
原有数据
1
2
3
4

运行脚本后

1

2

3

4

a

a

a

a

a

补充一下文件操作的知识

文件打开模式

  • r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
  • w,只写模式【不可读;不存在则创建;存在则清空内容】
  • x, 只写模式【不可读;不存在则创建,存在则报错】
  • a, 追加模式【可读; 不存在则创建;存在则只追加内容】,文件指针自动移到文件尾。

“+” 表示可以同时读写某个文件

  • r+, 读写【可读,可写】
  • w+,写读【可读,可写】,消除文件内容,然后以读写方式打开文件。
  • x+ ,写读【可读,可写】
  • a+, 写读【可读,可写】,以读写方式打开文件,并把文件指针移到文件尾。

“b”表示以字节的方式操作,以二进制模式打开文件,而不是以文本模式。

  • rb 或 r+b

  • wb 或 w+b

  • xb 或 w+b

  • ab 或 a+b

    注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码

将写入文件的2行代码加入

#!usr/bin/python3
#-*-coding:utf-8-*-
import requests
def checkip(ip):
try:
        URL = 'http://ip.taobao.com/service/getIpInfo.php?ip=' + ip
        r = requests.get(URL,timeout=3)
        json_data = r.json()
        region = json_data[u'data'][u'region']
if region == '山西省':
with open('a.txt','a') as fw:
                fw.write('\n' + ip)
else:
pass
except:
pass
with open('ips.txt') as f:       #此处的ips.txt是需要事先给出的
    ips = f.read().split("\n")
for ip in ips:
        checkip(ip)

运行脚本

C:\Users\92039\Desktop>python 2.py

会在桌面创建一个a.txt文档,结果为

222.31.41.253

这是一个简单的ip提取器,没有加入多线程,我是python小白,很多地方还不了解,在写这个脚本时候读取文件和写入文件都是直接去百度上现学现买的,不完美之处欢迎大家提出!


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Java从入门到精通

Java从入门到精通

李钟尉、马文强、陈丹丹 / 清华大学出版社 / 2008-9 / 59.80元

《Java从入门到精通》(软件开发视频大讲堂)从初学者角度出发,通过通俗易懂的语言、丰富多彩的实例,详细介绍了使用Java语言进行程序开发应该掌握的各方面技术。全书共分28章,包括:初识Java,熟悉Eclipse开发工具,Java语言基础,流程控制,字符串,数组,类和对象,包装类,数字处理类,接口、继承与多态,类的高级特性,异常处理,Swing程序设计,集合类,I/O输入输出,反射,枚举类型与泛......一起来看看 《Java从入门到精通》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

随机密码生成器
随机密码生成器

多种字符组合密码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具