目的
自分のはてなブックマークに貯めこんだリンクについて、デッドリンクがあれば知りたいなーと思い、Python で書いてみました。
特定のユーザー (想定は自分) のはてなブックマークを一個一個アクセスし、レスポンスコード 200
が得られない場合はタイトルを出力しています。
はてなブックマークで公開されている REST API 系ではユーザーのブックマーク一覧を取得できないようでしたので、RSS から取得しています。
コード
import feedparser
import requests
currentPage = 1
USERNAME = "<はてなブックマークのユーザー名>"
URL = "https://b.hatena.ne.jp/{user}/bookmark.rss?page={page}"
geturl = URL.format(user=USERNAME,page=currentPage)
rssResponse = feedparser.parse(geturl)
# とりあえず中身があるかどうか確認
if len(rssResponse.entries) == 0:
exit("何かが間違っていると思います")
# メインのループ処理
while True:
for entry in rssResponse.entries:
try:
currentUrlStatusCode = requests.get(entry.link).status_code
except requests.exceptions.RequestException as e:
currentUrlStatusCode = e
if str(currentUrlStatusCode) != "200":
print(entry.title, ": NG (", currentUrlStatusCode, ")")
currentPage = currentPage + 1
geturl = URL.format(user=USERNAME,page=currentPage)
rssResponse = feedparser.parse(geturl)
# 簡易的な進捗表示。不要な場合はコメントアウト
print(currentPage)
# 要素数が 0 なら終わり
if len(rssResponse.entries) == 0:
break
print("終わり。最後のページは ", currentPage, " です。")
exit(0)
出力イメージ
...
<中略>
IBM Redbooks | Linux : NG ( 404 )
Exchange 2013 の CPU 使用率の上昇のトラブルシューティング | Microsoft Docs : NG ( 404 )
Not found | Nomura Research Institute (NRI) : NG ( 404 )
33
OSS iPedia 記事 : NG ( HTTPConnectionPool(host='ossipedia.ipa.go.jp', port=80): Max retries exceeded with url: /doc/201/ (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x000001EBC957F460>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed')) )
OSS iPedia 記事 : NG ( HTTPConnectionPool(host='ossipedia.ipa.go.jp', port=80): Max retries exceeded with url: /doc/457/ (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x000001EBC9537100>: Failed to establish a new connection: [Errno 11001] getaddrinfo failed')) )
PowerShell DSC for Linux is now available! - Windows PowerShell Blog - Site Home - MSDN Blogs : NG ( 403 )
34
終わり。最後のページは 34 です。
動作確認環境
- Windows 10
- Python 3.8.3 64-bit
備考
- リンクによっては「ドメインがもう無い」など様々な理由でコネクションエラーになったりするので、エラー処理をかませています。
- RSSフィードを操作する際は、feedparser を利用しています。XML を操作しなくて良いので、すごく楽でした。
- はてなブックマークの RSS の仕様やサンプルページはこちらにあります。