【Python】ページのリンク切れをチェックする

機能

ページのリンク切れをチェックするPythonプログラムです。

ページ内のリンクを取得し、リンク先にアクセスします。

リンク切れ(HTTPステータスコードが200以外)のURLがあれば、コンソールに出力します。

実行結果

サンプル動画

youtu.be

プログラム

#! Python3
# 機能
#  ページのリンク切れをチェックする
# 使い方
#  1.Pythonを実行する
# 実行コマンド
#  python link_checker.py URL
#  python link_checker.py https://qiita.com/hfujima/items/7d0e7624ab7e6cd649f3

import re
import sys
import bs4
import requests
from urllib.parse import urljoin

# ページ内のリンクを取得する関数
def get_link(url):
    # ページ取得
    res = requests.get(url)
    res.raise_for_status()

    # リンク取得
    soup = bs4.BeautifulSoup(res.text, "lxml")
    links = soup.select("a")

    keys = set()
    results = []
    for link in links:
        # リンクURL取得
        link_url = link.get("href")
        if not link_url:
            continue

        # URL補完
        if not link_url.startswith("http"):
            link_url = urljoin(url, link_url)

        # リンクテキスト取得
        link_text = link.text
        if not link_text:
            link_text = ""
        link_text = link_text.strip()
        link_text = re.sub(r"\n", " ", link_text)

        # 重複削除
        key = link_url + link_text
        if key in keys:
            continue
        keys.add(key)

        results.append({"url": link_url, "text": link_text})

    return results


# ページのリンク切れをチェックする関数
def check_link(url):
    # リンク取得
    results = get_link(url)

    for result in results:
        try:
            # リンクアクセス
            res = requests.get(result["url"])
            if res.status_code != 200:
                print("NG URL -> " + result["url"])
        except:
            print("ERROR URL -> ", result["url"])


if len(sys.argv) != 2:
    sys.exit("使い方:python link_checker.py URL")

check_link(sys.argv[1])

使い方

  1. Pythonを実行する

実行コマンド

python link_checker.py URL

requestsとbs4をインストールしていない場合は以下のコマンドでインストールして下さい。

pip install requests
pip install beautifulsoup4

参考文献

www.oreilly.co.jp