ネット上のサイトマップを指定すると、記載されているリンクを抽出し、テキストファイルに書き出す Python スクリプトです。必要最小限の知識で済むサンプルにしています。
以下の環境で動作確認をしています。
環境: Windows パソコン、Python 3.x 、BeautitulSoup をインストール済み
背景 ~ サイトマップを活用する
興味のあるサイトがあったとき、そのドメインにどのような記事が入っているのか一覧のリストを取得したくなることがあります。
ドメインのサイトマップから、記事一覧を URL で取得して保存する方法について、Google 検索で探したのですが、すぐに使えそうなものが見当たりませんでした。
そこで Python で、サイトマップを取得して保存するまでのスクリプトを作成しましたので、公開しておきます。
使い方
① フォルダを作り、フォルダ内に get_sitemap1.py 等の名前でテキストファイルを作成してください。このファイルに下記のサンプルコードを貼りつけて保存してください。
② サンプルコードの URL 部分(url0)を修正して保存してください。
③ コマンドプロンプト(または、Anaconda Prompt)を起動して、上記の .py スクリプトを実行してください。
→ ①のフォルダ内に url_sitemap1.txt というテキストファイルが生成されます。
サンプルコードの説明
・ インターネットからデータを取得するため、requests をインポートします。
また、HTML ファイルからデータを抜き出すため、BeautifulSoup をインポートします。
・ テキストファイルを保存するため、write1() 関数を定義しています。
・ サイトマップを取得して、記載された URL を返す関数を get_sitemap1() で定義しています。
・ ファイルの保存等をするため、最初にフォルダのパス path1 を定義しています。
・ インターネット上の xml ファイルのパスを url0 で定義しています。
・ xml ファイルのファイル名はサイトによって異なります。サンプル以外のサイトについて XML を調べたい場合は、まず、ブラウザでインターネット上の任意のドメイン(トップページ)にアクセスして、ブラウザで [ドメイン名] + “/sitemap.xml” 等とし、xml ファイルがあることを確認してください。
ファイルがあることを確認したら、スクリプトの url0 を確認した URL で書き換えて使用してください。
・ get_sitemap1( url0 ) を実行し、張られているリンク URL のリストを取得します。
・ そのリスト a1 を結合して文字列に修正し、コンソールに表示し、ファイル保存をします。このあたりは、取得したデータをリストのまま使用したいか、文字列 (str) に修正して使いたいか、の用途に応じて、カスタマイズして使用してください。
・ get_sitemap1() 関数の内部では、まず、request.get() を使って、インターネットから、指定したページの内容を取得します。
つぎに、BeautifulSoup を使って、HTML 形式の <loc …></loc> となっているタグの部分を取得します。<loc …> は、サイトマップでリンクを記載する際の仕様です。
まずはこのようなものかという程度の理解で動かしてみて、動かす中でカスタマイズしていくのが早いと思います。
得られた<loc> タグからテキスト部分を抽出して、リスト a1[] に追加しています。
まとめ
サイトマップの URL を指定すると、サイトからリンクを取得してテキストファイルで保存するサンプルコードをまとめました。
これで、任意のサイトについて、記事一覧の取得や、サイトマップの分析が可能となります。
なお、xml のサイトマップ形式ではなく、指定した一般のサイト上で、記載されているリンクなどを抽出したい場合は、以下の関連リンクにスクリプトをまとめています。もしも興味があるようでしたら、参考にしてみてください。リンクの取得は自由自在になると思います。
関連リンク
・ 天気予報を取得してテキストで出力する 【Python】
・ ウェブ検索と結果の取得を自動化する【Python & selenium】
・ 指定した URL からリンクを抽出する 【Python】
サンプルコード get_sitemap1.py
import os
import requests as rq1
from bs4 import BeautifulSoup as bs1
def write1( file1, str1 ):
with open( file1, 'w', encoding='utf-8' ) as f1:
f1.write( str1 )
return 0
def get_sitemap1( url0 ):
str1 = rq1.get( url0 ).content
bs2 = bs1(str1, 'html.parser')
a1 = []
loc0 = bs2.select('loc')
for loc1 in loc0:
a1.append( loc1.text )
a1.sort()
return a1
path1 = os.path.dirname(__file__) + "/"
url0 = "https://www.google.com/sitemap.xml"
a1 = get_sitemap1( url0 )
str1 = "\n".join( a1 )
print( str1 )
file1 = path1 + "url_sitemap1.txt"
write1( file1, str1 )