M365ではIPアドレスの範囲が毎月変更があって(IPv4アドレスは半年に一回ぐらい更新ある気がする)
変更があるたびにNW機器でルーティングの追加や削除が必要となります。
職場で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とかIPv6とIPv4が混じった状態なので次でデータを整えます。
一つのリスト内に複数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構文でテキストファイルで出力で完了!!