仕事
WEB制作を効率化する (3) ページ内リンクの確認
2018年09月06日 よっしー
==== ご注意 ====
紹介しているコードは、大きな負荷をサーバーに与えてしまう可能性があります。
サーバーがダウンさせたりというような、攻撃と取られるような状況を生み出しかねないので、かならず、自身が責任が持てるサーバーに対して実行してください。
はじめに
納品前のページ内リンクに切れているものがないかの確認、手動でできるのは、十数ページが限界。というか、手動だと 1 ページですら見落とし発生しそうで、怖いですよね。
メニューなどを含めると1ページあたり100カ所くらいリンクがあって、それが 1,000 ページあると、100,000 カ所リンクがあることになります。
もはや、数の暴力です。
とはいえ、品質を維持するためにも、チェックは必要です。
人力チェックだけで行うのは、現実的ではないかもしれません。
そこで、ある程度の自動化を考えます。
最近、Python + BeautifulSoap を利用したスクレイピングの記事が増えているので、それを参考に、リンク切れチェックの自動化を試してみたいと思います。
スクリプトを書いてる
今回の記事では、指定したURL内から、<a href="***">
の *** 部分を抜き出して、http ステータスを確認するスクリプトを、python で書いてみたいと思います。
分かりやすくするためエラー処理や、細かい制御は取り除いてあるので、各自、拡張してみてください。
いいコードが書けたら、メールください。
手順1 / URLを開いてページ内のリンクを抽出するところまで作ります。
ソースコード
import requests
from bs4 import BeautifulSoup
target_url = 'https://(チェックしたいURL)'
if __name__ == '__main__':
# 内部リンクをチェックしたいURLを抽出
r = requests.get(target_url)
# ページのエンコードを確認
content_type_encoding = r.encoding if r.encoding != 'ISO-8859-1' else None
# beautiful soap を設定
bs = BeautifulSoup(r.content, 'html.parser', from_encoding=content_type_encoding)
# beautiful soap を利用して、<a hfef="***"> の *** を抽出
for tag_a in bs.find_all("a"):
url = tag_a.get('href')
print(url)
https://hittobito.com
を対象に、実行してみると、https://hittobito.com
のリンクが抽出されます。このページには、131個のリンクが設定されています。思ったよりありますね。
実行結果
https://hittobito.com
https://hittobito.com
/about.html
/member.html
・
・
・
/member.html
https://www.f-hit.com/#SECTION7
/policy.html
/contact.html
#wrap
手順2 / 抽出された URL を絶対URLに書き換えてステータス確認する
手順1で抽出された URL を見ると、絶対・相対リンクや、アンカー、外部リンクが混在していますので、内部リンクだけを対象に、絶対パスに URL を書き換えます。
外部リンクへのチェックは、チェック対象外のサーバーへの負荷になるため、手動で行いましょう。
ここも単純化してますが、本当は、URL をもっとちゃんと解析した方がいいと思いますが、とりあえず、今回はこれで。
ソースコード
import requests
from bs4 import BeautifulSoup
import urllib
target_url = 'https://(チェックしたいURL)'
if __name__ == '__main__':
# 内部リンクをチェックしたいURLを抽出
r = requests.get(target_url)
# ページのエンコードを確認
content_type_encoding = r.encoding if r.encoding != 'ISO-8859-1' else None
# beautiful soap を設定
bs = BeautifulSoup(r.content, 'html.parser', from_encoding=content_type_encoding)
# 解析対象の hostname を取得
target_url_p = urllib.parse.urlparse(target_url)
hostname = target_url_p.netloc
# beautiful soap を利用して、<a hfef="***"> の *** を抽出
for tag_a in bs.find_all("a"):
url = tag_a.get('href')
# URL を 絶対パスに変換
url = urllib.parse.urljoin(target_url, url)
# 内部リンクだけを対象にチェック
if hostname in url:
r2 = requests.get(url, allow_redirects=False)
print(str(r2.status_code) + ' : ' + url)
これを実行すると、先ほどのURL一覧が、https://hittobito.com
で始まるように書き換えられています。先頭行に http のステータスコードが表示されています。
実行結果
200 : https://hittobito.com
200 : https://hittobito.com
200 : https://hittobito.com/about.html
200 : https://hittobito.com/member.html
・
・
・
200 : https://hittobito.com/member.html
200 : https://hittobito.com/policy.html
200 : https://hittobito.com/contact.html
200 : https://hittobito.com/#wrap
r2 = requests.get(url, allow_redirects=False)
の部分で、オプション allow_redirects=False
を指定しているのは、これを指定しておかないと、302 リダイレクトが発生しているページも 200 で返ってきてしまうので、入れておきましょう
また、テストサーバーなどで BASIC 認証がかかっている場合は、requests.get
に、auth=('username', 'password')
をオプションに指定すればアクセスできます。
リンク切れてるところないかなーという、もやもやの解消の一助になればと思いました。
この記事を書いた人
-
よっしー
ディレクター (東京支社)
ディレクター
(東京支社)
田畑では愛車トラクターを乗りこなし、米も作る農家が本業というIT系ファーマー、いや、ファーマー系エンジニア? こだわりのあるモノ作りが得意。野菜とWEBの旬な情報はお任せ! 新しい技術やサービスは、まず自ら使ってみる事をモットーにしているプロジェクトマネージャー。WEB制作だけではなく、ネットワーク/サーバー、システム開発まで幅広く網羅。
田畑では愛車トラクターを乗りこなし、米も作る農家が本業というIT系ファーマー、いや、ファーマー系エンジニア? こだわりのあるモノ作りが得意。野菜とWEBの旬な情報はお任せ! 新しい技術やサービスは、まず自ら使ってみる事をモットーにしているプロジェクトマネージャー。WEB制作だけではなく、ネットワーク/サーバー、システム開発まで幅広く網羅。
この人が最近書いたものを見る
これを読んだ人にオススメ
最新の3件
タグ一覧
WEB制作・プロデュース会社『フューチャーヒット』の人々が趣味などをゆるく紹介するサイトです。
フューチャーヒットの「人々」が自由に、でも真剣に取り組んでいく様子をこの「ひっとびと」を通してお届けしていければと思います。