HITTOBITO

仕事

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制作だけではなく、ネットワーク/サーバー、システム開発まで幅広く網羅。

この人が最近書いたものを見る

一覧

これを読んだ人にオススメ

ひっとびととは?

WEB制作・プロデュース会社『フューチャーヒット』の人々が趣味などをゆるく紹介するサイトです。
フューチャーヒットの「人々」が自由に、でも真剣に取り組んでいく様子をこの「ひっとびと」を通してお届けしていければと思います。

詳細はこちらから