筆者要做的是利用Angry IP Scanner對IP進行掃描。可是得到的不是IP,而是網段。筆者說的網段還不是*.*.*.*/X這種格式的,而是1.0.1.0,1.0.3.255這樣的。所以就不能用Python自帶的IIPY模塊。以下是得到的數據和筆者最終的轉化成果(部分):
1.0.1.0,1.0.3.255
1.0.8.0,1.0.15.255
1.0.32.0,1.0.63.255
1.1.0.0,1.1.0.255
1.1.2.0,1.1.7.255
1.1.8.0,1.1.8.255
1.1.9.0,1.1.63.255
1.2.0.0,1.2.1.255
1.0.1.0
1.0.1.1
1.0.1.2
1.0.1.3
1.0.1.4
1.0.1.5
1.0.1.6
1.0.1.7
1.0.1.8
筆者先對得到的7個TXT文件循環處理,將每個文件的網段轉化爲IP,並分爲100份。因爲不分爲100份的話文件太大了,不利用筆者利用。以下是各個函數:
一、將IP地址與數字相互轉化。這樣做的目的是將網段的起始地址轉化爲數字後加1就是下一個地址。
import os
all_ip = {}
fpWriteIP = ''
#將字符串形式的ip地址轉成整數類型。
def ipToLong(ip_str):
#print map(int,ip_str.split('.'))
ip_long = 0
for index,value in enumerate(reversed([int(x) for x in ip_str.split('.')])):
ip_long += value<<(8*index)
return ip_long
#將ip的整數類型轉成ip字符串類型
def longToIp(ip_long):
ip_list = []
i_1 = ip_long>>24
i_2 = (ip_long & 0X00FFFFFF)>>16
i_3 = (ip_long & 0X0000FFFF)>>8
i_4 = (ip_long & 0X000000FF)
ip_list.append(i_1)
ip_list.append(i_2)
ip_list.append(i_3)
ip_list.append(i_4)
ip_str = r'.'.join(map(str,ip_list))
return ip_str
二、將IP段轉化爲IP,並寫入全局變量的文件中。
#將IP範圍段轉化爲IP輸出
def rangToSpecificIP(start,end):
for intIP in range(ipToLong(start),ipToLong(end)+1):
fpWriteIP.write(longToIp(intIP)+'\n')
三、將網段分爲100個部分。
#將當前文件的網段分爲100個部分
def splitAllIP(urlIp):
fp1 = open(urlIp,'r')
for i in range(100):
all_ip[i] = []
i = 0
for line in fp1:
all_ip[int(i/2000)].append(line.replace('\n',''))
i = i+1
四、主函數。7個文件循環處理
#主函數
if __name__ == '__main__':
for j in range(2,7):
splitAllIP('./all_'+str(j)+'/all_'+str(j)+'.txt')
i = 0
for ipRangeSub in all_ip:
fpWriteIP = open('./all_'+str(j)+'/ipSpecific'+str(i+1)+'.txt', 'w')
for lineRange in all_ip[ipRangeSub]:
rangToSpecificIP(lineRange.split(',')[0],lineRange.split(',')[1])
i = i + 1
fpWriteIP.close()