あひるの勉強部屋

つらつらつら~と不定期にカキコするブログ

小説サイトの新着を取得するやつを作ったときの話

たまには Python を使ってみるかというノリで、いつも読んでる Web 小説のページをスクレイピングして最新のものがあれば Slack に通知するやつを作ってみました。 Pythonをほとんど知らず、調べながらやったので、その過程で調べた内容についてのメモを残します。

環境

やったこと

venv

パッケージ管理をプロジェクト毎にしたかったので、よく使われている virtualenv を使おうと思いましたが、 Python 3.3 からは venv として Python の標準機能にもほぼ同様のものが備わったようです。

$ python3 -m venv project_name でサクッと生成しました。
追加パッケージなしでこれができるのはありがたいです。

requests, BeautifulSoup4

定番らしい組み合わせでスクレイピングします。
幸い対象が静的 html だったので、requests で GET して、BeautifulSoup4 で必要な DOM を取り出すだけの超シンプルな実装ですみました。
途中、大きく詰まったところとしては GET したファイルの日本語が文字化けしていたことです。

r = requests.get(TARGET_URL)
r.encoding = r.apparent_encoding

といったように apparent_encoding を指定することで charset から文字コードを検出してくれます。 apparent_encoding のソース

対象の html は以下のような構造でした。

<div class="index_box">
    <dl class="novel_sublist2">
        <dd class="subtitle">
            <a href="url">タイトル1</a>
        </dd>
        <dt class="long_update">
            20xx/xx/xx xx:xx
            <span title="20xx/xx/xx xx:xx 改稿"><u></u></span>
        </dt>
    </dl><dl class="novel_sublist2">
        <dd class="subtitle">
            <a href="url">タイトルN</a>
        </dd>
        <dt class="long_update">
            20xx/xx/xx xx:xx
            <span title="20xx/xx/xx xx:xx 改稿"><u></u></span>
        </dt>
    </dl>
</div>

今回必要だったのはタイトルおよび更新日時なので dl タグ一覧を取り出して、dd, dt タグをそれぞれ処理しました。 必要な情報が取れたところで、あとは最終更新日時を比較して最新が来て入れば Slack に通知を適当に実装して完了です。

VS Code

VS Code でコーディングするにあたり、Python 拡張をインストールしました。 Python拡張をインストールすると pylint が見つからないだの警告を出してきます。 せっかくなので使いたいですが、今回は venv で使いたかったのでワークスペースの設定が必要でした。

{
    "python.pythonPath": "./bin/python",
    "python.linting.pylintPath": "./bin/pylint",
    "python.linting.pylintEnabled": true,
    "python.linting.enabled": true,
}

これでこのワークスペースを開いたときは venv の pylint を参照してくれるようになりました。

つくったもの

こんな感じ

さいごに

このメモ書いてる時に気づいたんですが、a タグのリンクを Slack に投稿した方が絶対に使いやすい