Python - リンクチェック - 概要

 クラウディア
1. 概要
2. ソース
3. 修正

1. 概要

 まずは、指定したコンテンツの、リンクを抽出。

2. ソース

 まずは、こんなソースを書いてみました。
import sys
from urllib import request
from bs4 import BeautifulSoup

argv = sys.argv
argc = len(argv)

if (len(argv) < 2):
    print("チェック対象の URL が指定されていません")
    exit()

try:
    html = request.urlopen(sys.argv[1])
    soup = BeautifulSoup(html, "html.parser")

    links = [url.get('href') for url in soup.find_all('a')]
    print(links)
except Exception as ex:
    print("例外[", ex.args, "]")



python ソース.py チェックURL
 てな感じで、起動します。  ところが、本サイトのルートをチェックしようとしたら
例外[ (SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1091)'),) ]
 てなことになっちゃった。

3. 修正

 本当は、証明書は、正しいんだけど、証明書のエラーらしい。  いろいろ対策はあるようですが、「SSL 証明書が正しくないサイトに対して Python でアクセスする|Toru Kamigaki@Python|note」が一番簡単なので。
import sys
import ssl
from urllib import request
from bs4 import BeautifulSoup

argv = sys.argv
argc = len(argv)

if (len(argv) < 2):
    print("チェック対象の URL が指定されていません")
    exit()

try:
    ssl._create_default_https_context = ssl._create_unverified_context

    html = request.urlopen(sys.argv[1])
    soup = BeautifulSoup(html, "html.parser")

    links = [url.get('href') for url in soup.find_all('a')]
    print(links)
except Exception as ex:
    print("例外[", ex.args, "]")


 これで、本サイトのルートをチェックすると
['./etc/', './etc/', './00/', './fbsd/', './fbsd/11.03/', './fbsd/12.01/', './fbsd/11.04/', './desktop/', './usb/', './daily/', './linux/', './ymo/07/', './tool/', './windows/', './db/', './shell/', './solaris/', './unix/', './iphone/', './ymo/', './lang/c/', './lang/cli/', './lang/csharp/', './lang/haskell/', './lang/lua/', './lang/perl/', './lang/php/', './lang/python/', './lang/ruby/', './ymo/13/', './sitemap.html', 'https://px.a8.net/svt/ejp?a8mat=3BFMPC+DZ3AYA+4J34+60OXD', '/etc/04.php', './00/02.html']
 これは、くっきり正しく出力されました。
 
 
カウンタバックグラウンド