パニック速報

The next stage is paradise…

パ二速ランダム記事リンクの作り方 はてなブログランダム記事リンクの作り方

備忘録

開発環境

Visual Studio Code
今日までまともにIDE使ったことなかったけど勉強がてらVSCode入れてみた。
以下の解説通りやれば特に苦労することなくWindows環境にPython導入できたし、pipも楽勝でできた。
www.python.jp
今までわざわざLinux構築してたのあほくさw

使うライブラリは以下の通り。Pythonスクレイピングする際の定番ですね。

pip install lxml
pip install requests
pip install beautifulsoup4

全記事のURLを取得する。

Pythonでパ二速のアーカイブにHTTPリクエストしてBS4でパースしてURLだけリストに格納するループ」を作ります。理解れ
こちらの方が全エントリのタイトルとURLを取得するコードを書いてくれてるので、流用引用します。ありがとうございます。
s51517765.hatenadiary.jp

タイトルは不要なので出力結果から削除して、テキストファイルに書き出すように改変しています。
一応動いてるけど今後の勉強のためにこここうしたらいいとかあったら教えて

import requests
from bs4 import BeautifulSoup

f = open('F:\panisoku2.txt', 'w', encoding='UTF-8')

def soup_panisoku(url):
    html = requests.get(url)
    soup = BeautifulSoup(html.text, 'lxml') ##lxmlを指定するほうがよい

    alink = soup.select('a') #linkの一覧をListとして取得

    #print(len(alink)) #Listの長さ
    for i in range(len(alink)):
        if alink[i].get("class")!=None: #クラスが未設定でない
            if 'entry-title-link' in alink[i].get('class'): #エントリーのclassとして指定されているものの時
                if alink[i].get("href") not in list: #すでに抽出済みでなければ
                    list.append(alink[i].get("href"))
                    f.write(alink[i].get('href')+'\n')
                    print(alink[i].get('href'))
if __name__ == '__main__':
    list=[]
    rootUrl='https://vip-de-marika.hatenablog.jp/archive?page=' #エントリー一覧の基本url
    n=1
    while(True):
        url=rootUrl+str(n)
        soup_panisoku(url)
        n+=1

出力結果がこんな感じ。つらつら全記事分のURLがメモ帳に出力されます。
f:id:vip-de-marika:20220317113209p:plain

ランダム記事用のスクリプトを作成する。

メッセージをランダムに出力するJavascriptの教科書的なコードを改変して、ランダム記事にしていきます。
以下の記事のコードを流用引用しました。ありがとうございます。
www.tagindex.com

<script type="text/javascript">
<!--
var msg = new Array();

// 設定開始(メッセージの内容を設定してください)
msg[0] = '<a href="https://vip-de-marika.hatenablog.jp/entry/2022/03/16/154543">ランダム記事リンク</a>';
msg[1] = '<a href="https://vip-de-marika.hatenablog.jp/entry/2022/03/16/120000">ランダム記事リンク</a>';
msg[2] = '<a href="https://vip-de-marika.hatenablog.jp/entry/2022/03/15/195232">ランダム記事リンク</a>';
msg[3] = '<a href="https://vip-de-marika.hatenablog.jp/entry/2022/03/15/172831">ランダム記事リンク</a>';
msg[4] = '<a href="https://vip-de-marika.hatenablog.jp/entry/2022/03/15/170924">ランダム記事リンク</a>';
msg[5] = '<a href="https://vip-de-marika.hatenablog.jp/entry/2022/03/15/164945">ランダム記事リンク</a>';
msg[6] = '<a href="https://vip-de-marika.hatenablog.jp/entry/2022/03/15/151418">ランダム記事リンク</a>';
msg[7] = '<a href="https://vip-de-marika.hatenablog.jp/entry/2022/03/15/121438">ランダム記事リンク</a>';
msg[8] = '<a href="https://vip-de-marika.hatenablog.jp/entry/2022/03/15/120000">ランダム記事リンク</a>';
msg[9] = '<a href="https://vip-de-marika.hatenablog.jp/entry/2022/03/14/145534">ランダム記事リンク</a>';
msg[10] = '<a href="https://vip-de-marika.hatenablog.jp/entry/2022/03/14/144137">ランダム記事リンク</a>';
msg[11] = '<a href="https://vip-de-marika.hatenablog.jp/entry/2022/03/14/134603">ランダム記事リンク</a>';
︙
以下略
// 設定終了

var no = Math.floor(Math.random() * msg.length);
// 表示
document.write(msg[no]);
// -->
</script>


👆これをはてなブログのデザイン設定のサイドバーのモジュールを追加のHTMLに貼り付けて適用保存して完成。
f:id:vip-de-marika:20220317114651p:plain

URLの量が膨大なのでエクセルで文字列結合して作ってます。
f:id:vip-de-marika:20220317114925p:plain

ランダム記事リンクを画像にするならaタグの中にimgタグ入れれば出来るはず。画像ください。

まとめ

見ての通り全記事のURLリストを取得した日時点までの記事が対象になるので定期的に一連の手順を踏む必要があるけどそれでも7500記事くらいあるから気にならなさそう。
構想段階では、はてなブログAPIやらAWS Lambdaとdynamodbを駆使して現代的でモダンな実装にしようと思ったけど、全記事URL取得やってる最中にAWSとかに金払うのアホくさいしjs使えばいいやってなってこうなった。
テキストファイルとはいえ7万文字超えてるので、ちょっと重くなるかなと思いましたがそうでもなくてよかったです。
久しぶりにコード書いて頭の体操になったわ。