tech

勉強のために、各社の社説を収集してデータベース化する その5

一連の投稿(勉強のために、各社の社説を収集してデータベース化する)の続きです。
さて、今回は取得したデータを整形する機能について考えていきます。
「スクレイピング 保存」ざっくりと下調べしたところ、CSVに保存する方法の解説が多いですね。
株価とか数値を扱うものは適していると思いますが、記事など文書メインのデータだとcsv化するとあとで面倒になる可能性があります。
理由は今回の投稿を読んでいただけるとなんとなくわかっていただけるかと思います。(カンマセパレートということは文の中にカンマがあると、、、)
よって、今回は、あえてテキストに出力して、そこから最終的にデータベースに落とし込むことを考えたいと思います。

最終的な保存イメージを先につくる

最終的な保存イメージは早いうちに、しっかり考えておいた方が良いです。
作りながら保存イメージを考えると、取得の時にああしておけばよかった、と後悔しがちになります。

今回でいうところの最終的な保存イメージとはデータベースの構造であるデータベーススキーマになります。
前もって設計していた時はこんな感じにしていました。

  • 日付
  • 新聞社名
  • タイトル(ない場合はnull
  • 記事本文

もう一度振り返ってみても特に穴があるように感じませんので、このままいきたいと思います。
なお、今回のデータベース保存までの工程ですが、いったん取得したデータを後述の通り適切な形に加工し、まずテキストに書き出します。
そしてテキストから再度読み取って、DBに格納する流れを取りたいと思います。
なぜいったんテキストに書き出すという回りくどい方法をとるかというと、デバッグ的なデータの出力イメージをまずつかみたかったからです。
慣れればテキストに書き出す必要はなく、すべてメモリ上で完結させればよいと思います。

保存イメージに合うように取得データを加工する

日付

もっとも簡単な方法は実行日を日付として保存データとしてテキストに書き出す方法です。
ただし、新聞は休刊日があったりするので、下手をすると休刊日にもかかわらず、前日の記事を取得して来てしまう可能性があります。
したがってよりこだわるなら、取得する記事から当日の日付を取得し、かつその日付がプログラム実行日と同じかを確認させる方がよさそうです。
上記の機能は、前回までのプログラムに実装していなかったので、今後の課題になります。

新聞社名

これは簡単で新聞社ごとに記事取得のプログラムを分ける予定なので、固定の値として保存可能です。

タイトルについては、各新聞社のweb固有の位置がありますのでその解析ができれば、取得できます。
基本的に取得した値をそのままテキストに書き出す形でよいと思います。ただし後述の理由から改行コードを削除する機能を盛り込みたいと思います。
この実装も今後の課題になります。

記事本文

最後です。これは記事そのものを利用します。したがってあまり気にしていません。この部分に関しては改行も気にしないことにします。

補足:改行コードの意味

さて少し脱線しますが、改行コードを気にする箇所としない箇所があります。
理由は、日付、新聞社名、タイトル、記事本文のどのデータを参照しているかを改行コードを利用して区切るためです。
今回のプログラムは、中間生成物としてのテキストに以下のようなイメージでデータを書き出します。
日付(1つめの改行コード)
新聞社名(2つめの改行コード)
タイトル(3つめの改行コード)
記事本文(この中にいくら改行コードがあってもよい。記事の終わりはファイルの終端を表す文字コードで判別する)

このような形にしておくと、データベースに格納するとき中間生成物のテキストを読み込むと、1つめの改行コードまでのデータを日付として区別できます。
同様に、1つ目の改行コード以降で2つ目改行コードまでのデータは新聞社、といった具合です。
最後の、記事本文だけは、記事の終端の判別をファイルの終端の文字コードで判別するので、改行コードが間にいくつあっても気にしません。
これが、タイトルになどに改行コードがあった場合に困る理由です。
タイトルに改行コードがあると、その改行コードから先の部分がタイトルでなく記事に分類されてしまいます。

あとがき

今回の検討を踏まえた実装はまた次回に。
中間生成物としてテキストを作るのはあまり良いプログラミングとは言えませんが、個人的には出力イメージがつかめてプログラムの作りはじめなどにはよく使います。

-tech
-, ,