wallabagを建てよう

スポンサーリンク
スポンサーリンク
スポンサーリンク

始まりは「あれ?なんだっけ」

Webで検索して情報を得たとしましょう。

そこを利用して何か作業しました。

必要なくなったのでブラウザのタブを閉じました。

数日後・・・

作業したところの修正をしなければなりませんでした。さてどうやったっけ・・・?

履歴を検索できれば良し。何かのキーワードを覚えているのならまだマシ。

心得がある人はタグも管理できるPocketというツールを利用している人もいるはずです。

ですがこのツールって個人が管理するような感じでコラボレーションする場合は別途有料で行うようです。(調べてはいませんが)

またこの手のツールはアップデートが頻繁にあり(良いことですが)それに伴いユーザーインタフェースが多少使いづらかったりして大変なことが多いです。

またPocketの情報を他人に見られるのもちょっと抵抗あったりして。

時代に逆行するようですが、この手は自分の手元にノートのようにおいておきたいものです。

そこで今回見つけたのはセルフホスティング式のPocket互換wallabagの登場です。

wallabagとは

OSS版Pocketとでも言いましょうか。

自宅にサーバがある人はぜひ検討してもらいたい一品です。

気になったWebの記事をあとで読むというサービスを作り出します。

サイトの取得も行ってくれるので速報ニュースのような記事を文字通り「あとで読む」為にクリップしておくことが可能です。

対応アプリケーションも多様で、chrome拡張やFirefox拡張、Android版、ios版とあります。大体網羅していますね。

それをインストールして、ユーザー別に記事をどんどん追加していくのが今回の目的です。

インストールは簡単

LinuxサーバーおよびDockerインストール済みであればdocker-compose.ymlを自分なりにカスタマイズすれば起動します。

インストール方法は探せばいくらでも出てきますが、私が参照したのは

これでサーバーとして立ち上がります。

あれ?取れてない

chrome拡張やAndroidでかたっぱしから必要な記事を投げ込むのですが、うまく取ってくれないサイトがあったりします。

qiitaさんのところがうまく取れてないようです。

この時内部のクローラに指示を出さなければならないのですが、そのやり方が出てないんですよ。

dockerに全部押し込んでいるのでログすら出てきません。そこでこれからその方法を説明します。

docker内部のデータを取り出す

先ほど前に示した記事で説明します。変更されている方は別途変更してください。またdocker-composeコマンドを取り入れている方はdocker composeをdocker-composeと読み変えてください。

wallabagが動作していることが前提です。

cd [wallabagのdocker-compose.ymlのある場所]
docker compose cp wallabag:/var/www/wallabag/vendor/j0k3r/graby-site-config ./wallabag/graby-site-config
docker compose cp wallabag:/var/www/wallabag/app/config/config_prod.yml ./wallabag/config_prod.yml

最初からvolumesで指定しても自動生成するタイプなのでこうやって起動してる最中のデータを取り出さないとなりません。

ここを参照しながら./wallabag/config_prod.ymlのmonologの部分を変更します。

monolog:
  handlers:
      main:
          type: fingers_crossed
          action_level: error
          handler: nested
          channels: ['!graby']
      nested:
          type: stream
          path: "%kernel.logs_dir%/%kernel.environment%.log"
          level: debug
      graby:
          type: stream
          path: "%kernel.logs_dir%/graby.log"
          level: info
          channels: ['graby']
      console:
          type: console

一旦wallabagを停止させます。

その後docker-compose.ymlのvolumesに以下を追加します。

    volumes:
      - /どこか適当な場所/wallabag/config_prod.yml:/var/www/wallabag/app/config/config_prod.yml
      - /どこか適当な場所/wallabag/graby-site-config:/var/www/wallabag/vendor/j0k3r/graby-site-config:rw
      - /どこか適当な場所/wallabag/logs:/var/www/wallabag/var/logs

その後wallabagを起動します。

すると./wallabag配下にデータが読み書きできる状態になります。

まずは適当なサイトのコンフィグを参照してください。なんでもいいです。コンフィグは.txtになっているのでテキストエディタでもなんでもいいです。私はVSCodeで編集してます。

今回は.wordpress.com.txtを開いてみます。すると中に書かれているのは

# try to target content block within div#content
body: //div[@id="content"]//div[contains(@class, 'entry-content') or contains(@class, 'entrytext') or @class='main' or @class='entry']
# if that fails, get div#content
body: //div[@id='content']
title: //meta[@property='og:title']/@content

date: //div[@id='content']//span[contains(@class, 'entry-date')]
date: //div[contains(@class, 'entry-meta')]//time[@pubdate or @pubDate]
author: //div[contains(@class, 'entry-meta')]//a[@rel='author']

prune: no

strip: //nav
strip: //header
strip: //*[@id='comments' or @id='respond']
strip: //div[contains(@class, 'comments')]
strip_id_or_class: sharedaddy
strip_id_or_class: wpadvert
strip_id_or_class: commentlist
strip_id_or_class: sociable
strip_id_or_class: related_post
strip_id_or_class: wp-socializer
strip_id_or_class: addtoany
strip: //div[contains(concat(' ',normalize-space(@class),' '),' navigation ')]
#strip: //iframe

test_url: https://elisehahn.wordpress.com/2013/09/22/looking-back-to-move-forward-navigating-race-and-racism-in-neoliberal-terrain/

全文失礼。ここから各サイト毎にデータを作っていきます。

まず書かれている内容としては[どの項目]: [xpath]となっています。

例えば上記の場合body: //div[@id=”content”]//div[contains(@class, ‘entry-content’) or contains(@class, ‘entrytext’) or @class=’main’ or @class=’entry’]となっているので1ページを取り込んだあと表示部分を取りきる「Body」をこのxpathを評価され取り込まれます。

取り込むxpathは例えばですが私の場合、chromeでそのサイトを開き開発者モード(F12を押すと出てくるデバッグモードです)を利用して目的のxpathを探していきます。

次に同じbody: //div[@id=’content’]が来ていますが注釈に書かれている通りxpathが効かなかった場合の次点を設定しています。つまり同じbodyに対しては上から評価されていきます。

次にtitle,date,authorときています。それぞれ取り込まれます。

実はこのシステムではgrobal.txtというのがあってsite-configファイルで取り切れない場合は適時取ってくれるのですべて設定する必要はないのですが、今回はそれぞれ取り込むようにした方がいいとおもいます。

途中にあるのは文字通り不必要な部分をカットしていく部分になります。例えば広告とかですね。

最後のtest_url:はどのURLで確認したかを記録しておきます。注釈みたいなものですね。

目的のサイトのデータができたらファイルを[サイト名.txt]として保存します。例えばqiita.com.txtとかですね。

その後./wallabag/logsにgraby.logというのがあります。うまく動けばログに取り込まれるまでの動作が記録されます。

例えばbodyがちゃんと取り込まれたかとかいろいろと評価されて最終的にSuccess ? 1が出れば取り込まれているはずです。

ようはスクレイピングってやつですね。

サイトからデータを取るという事

今回はあえて内容は書きません。ご自身で挑戦してください。

なぜかというと記事自体は著作権の塊みたいなものなので、それを個人で自力で取り込む事自体は許容されるのですが取り込む方法は引っかかるからです。

大丈夫。色々とやっていけばいつかは取れるようになります。壊れはしません。取得に失敗しましたと言われるだけですから。

なにより数百のサンプルがあるのです。どれかが近いはずです。

たいていは取得できるようにできていますので、失敗したところだけ頑張ればいいだけです。xpathやり始めると中毒になりますよ!

個人のスクラップブックとして

活用しましょう!

コメント

タイトルとURLをコピーしました