こんにちは、つくたろうです。
ウェブページには「noindexタグ」というものがあります。
ヘッダー部分とかに追加しておくと、そのページが検索エンジンにインデックスされなくなるというものですね。
具体的には、下のようにヘッダー内にrobotsメタタグとして記述されます。
<meta name="robots" content="noindex" />
noindexタグを入れたページはインデックス対象から外れるだけでなくサイト全体の質の判断材料からも除外されるので、質の低いページや内容に被りのあるページをnoindexにしておき「質の高いページだけを検索エンジンに評価させる」など、SEOの面なんかでも活用されています。
今回は、URLを入力すると、そのページにnoindexがあるかどうかを判定するpythonプログラムを作りました。
作ったきっかけ
色々使いこなすと恩恵が受けられるnoindexタグですが、ページがこれを含んでいるかどうかを確認するのは少し手間がかかります。
検索すると「noindexあるなしチェッカー」とかも出てくるんですが、アレはrobotsメタタグかどうかは関係なく、メタタグのcontentがnoindexの文字列を含んでいるページは全て「noindexあり」と判定してしまうという重大な欠陥をはらんだプログラムです。
試してみれば分かりますが、決して noindexタグを含んでいない記事でも、descriptionとかにnoindexの文字列を含んでいるだけで「noindexタグがある」と判定するというガバガバ仕様になっています。
しかも「あるなしチェッカー」は、入力したページの静的な部分のhtmlしか読まないので、JavaScriptとかで後から動的に付け加えたmetaタグなんかは完全スルーです。
はてなブログで記事ごとにnoindexを入れるとなると動的に与えるしかないんですが、これを全く読み取らない。はてなブログユーザーにはマジで使えない。
www.tsukutarou.net
このあるなしチェッカーを堂々と勧めてるサイトなんかもありますが、完全にエアプなのでしょう。信用してはいけません。
ただいちいちソースを検証してnoindexの有無を調べるのも面倒だし、ブラウザに余計なプラグインも極力入れたくないので、ツールは使いたい。
ということで、自分で簡単なコードを書いて作ってみました。
書いたコード
構成は関数部分とテスト部分になっています。メインの処理自体は関数になっています。
URLを引数に与えて、noindexの有無を標準出力に返します。
足りないライブラリは適宜インストールしてください。
import time import re import os from bs4 import BeautifulSoup from selenium import webdriver def CheckNoindex(PageURL): #ファイルのある場所に移動 os.chdir(os.path.dirname(__file__)) #ドライバーの設定 options = webdriver.ChromeOptions() options.add_experimental_option('excludeSwitches', ['enable-logging']) options.add_argument('--headless') driver = webdriver.Chrome('.\chromedriver',options=options) try: #URL読み込み driver.get(PageURL) time.sleep(1) #htmlの情報を取得 html = driver.page_source.encode('utf-8') soup = BeautifulSoup(html, "html.parser") finally: driver.close() #metaタグのうち「name="robots"」のものを抽出 metas = soup.find_all('meta', {'name': 'robots'}) #そもそもrobotsのname要素のmetaタグが無い場合はここで終了 if len(metas)==0: print(f"{PageURL} に noindexタグはありません") return #metaタグからcontensにnoindexがあるかどうかの抽出 meta_contents = [bool(re.search('noindex',tag["content"])) for tag in metas] #noindexの有無を出力 if any(meta_contents): print(f"{PageURL} は noindexタグを含んでいます") else: print(f"{PageURL} に noindexタグはありません") if __name__=="__main__": #テスト CheckNoindex("https://tsukutarou.com/entry/noindex") CheckNoindex("https://tsukutarou.com/entry/yesindex")
動作の様子
「動的にnoindexタグを設定したページ(https://tsukutarou.com/entry/noindex)」と、「noindexタグは入れていないページ(https://tsukutarou.com/entry/yesindex)」を使って実際に動作の様子を確認すると、以下のように出力されます:
ちゃんとnoindexの有無を判別しているのが分かります。
ちなみにこの2つのページはこないだ実験用環境として作ったサブブログ上の記事です。やっぱこれがあるとはてなブログがめちゃくちゃ捗ります。サブブログ、おすすめですよ。 www.tsukutarou.net
簡単な解説
コードを書きっぱなしもあれなので、一応どういうアルゴリズムでnoindexを抽出しているかを簡単に書こうと思います。まあコメント読んでもらえれば何してるかはわかると思いますが。
このプログラムは、seleniumとBeautifulSoupというライブラリを用いて、入力されたウェブページからhtmlタグなどサイトの情報を抽出しています。
抽出したサイトの情報からさらにname="robots"
のmetaタグのみを絞り込んで、metaタグごとにcontent
がnoindex
を含んでいるかを正規表現で判定しています。
最後に、判定結果をもとにnoindexの有無を出力して終わりです。
ぶっちゃけやってることはスクレイピングです。ちなみにスクレイピングってサイトによっていろいろ制約があったりするんですが、今回のツールはまあ自分のサイトのnoindexが反映されているかどうかの確認ぐらいにしか使わないと思います。他人のサイトに使って変なことになっても僕は責任を負いませんのであしからず。
動作させる場合の注意点
このプログラムはseleniumのwebdriverを使っているので、使う際はコードと同じディレクトリにchromedriverを入れておく必要があります。
このchromedriverなんですが、自分のPCのchromeのバージョンに合わせたバージョンのものを使う必要があります。
ダウンロードはこちらから適宜行ってください。chromeのバージョンと細かい数字まで合っていなくても、はじめの2桁ぐらい同じなら動くと思います。(多分)
chromeはどんどんアップデートされていくので、動かなくなったらその都度新しいchromedriverを入れなおせばまた動くようになります。
おわりに
今回は「ウェブページ中のnoindexタグの有無を確認するPythonプログラム」についての記事でした。
必要最低限の機能だけを備えた非常にシンプルな実装なので、もっと凝ったりできるところはたくさんあると思います。
ウェブアプリとかにしてもいいけどその分手間もかかりますし、エラーへの対応とかXSS対策とかいろいろ対処しなきゃいけないことが増えるのもアレなのでこれでいいかなと思っています。
また何か作ったら記事にしたいと思います。これからもよろしくお願いします。
ここまで読んでくれて、ありがとうございました!
2022/02/13 つくたろう
カテゴリ: