メモ的な何か

NWエンジニアって名乗りずらい人

【Python】Office 365 の URL と IP アドレスの範囲からIPv4アドレスだけ抽出する

M365ではIPアドレスの範囲が毎月変更があって(IPv4アドレスは半年に一回ぐらい更新ある気がする)
変更があるたびにNW機器でルーティングの追加や削除が必要となります。


learn.microsoft.com

職場でIPv4のアドレスだけ抽出してほしいってなったのでPythonスクレイピングで作ってみました。

全体コード

import datetime
import re
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome import service as fs

CHROMEDRIVER = "C:\chormeドライバーおいてる場所指定"
 
# ドライバー
chrome_service = fs.Service(executable_path=CHROMEDRIVER)
browser = webdriver.Chrome(service=chrome_service)

#o365のページ
browser.get('https://docs.microsoft.com/ja-jp/microsoft-365/enterprise/urls-and-ip-address-ranges?view=o365-worldwide')
  

#IPアドレスの所だけ抽出

elems = browser.find_elements(By.TAG_NAME,'code')

#.textでテキストデータを抽出

values = []

for elem in elems:
    values.append(elem.text)


#抽出結果を','で連結

values_join=','.join(values)

#joinで連結した後にsplit(",")で分割
values_split=values_join.split(",")

#IPv4とそれ以外に抽出したデータをわける

values_alpha=[]
values_ipv4=[]

for i in values_split:
	alpha=re.findall('[a-z]+',i)
	if alpha:
		values_alpha.append(i)

	elif ':' not in i:
		
		values_ipv4.append(i)

values_new=[]

for i in values_ipv4:
	if ' ' in i:
		space=i.replace(' ','')
		values_new.append(space)
	else:
		values_new.append(i)		

set_values=set(values_new)

#ファイル名用に日付取得

heute=str(datetime.date.today())

filename='C:\保存先'+heute+'.txt'


#txt書き出し

with open(filename, 'wt') as f:
	for ele in set_values:
		f.write(ele+'\n')

	

解説

使用するモジュール

import datetime
import re
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome import service as fs

seleniumを使ってwebスクレイピングするのでググったら↑があれば大丈夫そう。
あと正規表現と日付を使うのでreとdatetimeをimportしています。

choromedriverを指定、URLを指定する

CHROMEDRIVER = "C:\chormeドライバーおいてる場所指定"
 
# ドライバー
chrome_service = fs.Service(executable_path=CHROMEDRIVER)
browser = webdriver.Chrome(service=chrome_service)

#o365のページ
browser.get('https://docs.microsoft.com/ja-jp/microsoft-365/enterprise/urls-and-ip-address-ranges?view=o365-worldwide')

"C:\chormeドライバーおいてる場所指定" だけchromedriverを保存したパスを指定してください。

o365のホームページからアドレス情報だけ抽出する

#IPアドレスの所だけ抽出

elems = browser.find_elements(By.TAG_NAME,'code')

#.textでテキストデータを抽出

values = []

for elem in elems:
    values.append(elem.text)

valuesにアドレス情報を抽出しました。
このままだと.comとかIPv6IPv4が混じった状態なので次でデータを整えます。

一つのリスト内に複数IPアドレスが入ってるのでいったん一つにする

#抽出結果を','で連結

values_join=','.join(values)

#joinで連結した後にsplit(",")で分割
values_split=values_join.split(",")

これでリスト一つに1アドレスになりました。

IPv4とそれ以外に抽出データをわける

#IPv4とそれ以外に抽出したデータをわける

values_alpha=[]
values_ipv4=[]

for i in values_split:
	alpha=re.findall('[a-z]+',i)
	if alpha:
		values_alpha.append(i)

	elif ':' not in i:
		
		values_ipv4.append(i)

アルファベットが入ってるやつはvalues_alphaに格納して
残りでv6表記の【:】が入ってないやつ(すなわちIPv4アドレス)だけをvalues.ipv4へ格納

謎のスペースが入ってるので消す

values_new=[]

for i in values_ipv4:
	if ' ' in i:
		space=i.replace(' ','')
		values_new.append(space)
	else:
		values_new.append(i)		

set_values=set(values_new)

なんかprintで見てみたらスペースが入ってたり入ってなかったりなんで
replaceで削除。あと重複してるアドレスもあったのでset()で削除しています。

テキストファイルに保存する

#ファイル名用に日付取得

heute=str(datetime.date.today())

filename='C:\保存先'+heute+'.txt'


#txt書き出し

with open(filename, 'wt') as f:
	for ele in set_values:
		f.write(ele+'\n')

ファイル名をdatetimeで取得した日にしています。

filename='C:\保存先'+heute+'.txt'

あとはwith構文でテキストファイルで出力で完了!!