前回からずいぶん間が空きましたが、連載企画です。
さて、この企画立ち上げてそれなり動くプログラムを作り上げて、これまで安定性を確認してきました。
今回はその結果報告です。以下の目次を見ていただくと概要が把握できると思います。
今現在でている課題
文字コード関連のエラー
まず、文字コード関連でエラーが発生しました。
cp932 codec can't encode character
というエラーが発生したので、原因を調査しました。ネットで簡単に解決できました。
原因はfile I/O時の文字コードとのことでした。これまでは
f = open(target_file, 'w')
といった形で、文字コードの指定をしていなかったのですが、この場合出力される文字コードの変換がpythonで自動的にOSのデフォルトで選択されるらしいです(今回はwindows環境)。
読み込んだ文字列とOSの文字列の変換がうまくいかない場合、上記のようなエラーが発生するとのことなので、出力の文字コードUTFで指定したところうまくいきました。
f = open(target_file, 'w', encoding='UTF-8')
参照先の新聞社のXPathの変更があった
これは、新聞社のwebページデザイン変更で仕方ありません。
むしろ初めからある程度織り込んでいたところがあります。
問題はどの程度の頻度かなので、確認する意味でもカウントしています。
8月下旬から運用開始して、4社の新聞社のページを見てますが、エラーが発生したのは1社でした。
こういった変更が定期的に行われているのか、それともほぼないのか、プログラムのメンテナンス性にかかわってくるので、引き続きwatchしたいと思います。
1日2記事の社説があるので、対応したい
エラーではないのですが、新聞社の社説は基本的に1日2記事、掲載されてます。
現在、社説一覧の中の最も先頭の記事が最新とみなし、その1記事をXPathで取得する実装としています。
そのため、改良方法はそのXpathの部分を2記事目も取得するよう追記すればいいと思われますが、厄介なことにごくまれに1記事しか社説がないことがあります。
そういった日は、上記の方法だと前日の記事が取得されてしまいます。
本プログラムは毎日cronのごとく自動実行されてますので、記事内容までは管理人は確認しておりません。
こういった外れ取得を除外するにはどうしたらいいか検討中です。
毎日自動実行すると、新聞の休刊日に当たった場合にも、同様の外れ取得が起きます。
これにも対処したい。
対処案
現在の実装案ですが、「記事の取得は社説一覧の先頭から2本をまず取得する」ように変更します。
次に取得した記事の中に配信日時が入っているエリアがあるので、それを取得し実行日の日付と比較させます。
日付が本日のものであれば、記事を取得しそれ以外であれば取得不要(前に取得したものまたは休刊日)とします。
こんな感じで直そうかなと思ってます。
メンテナンス性をアップしたい
ただ新聞社ごとに配信日時を格納するエリアが異なるので、XPathと同じくまた管理する情報が増えるのが痛いですね。
プログラム中にXpathをべた書きしているので、どこを直すべきかをいちいち洗わないといけないという点でメンテナンス性が落ちてきました。
現在の実装では、記事取得プログラムを新聞社ごとに分けて書いてますが、各社のXPathと出力先ファイル以外はすべて同じ内容なので、プログラム冒頭に各社用の変数をまとめ、記事取得関数は各社の変数を取得して実行するように改良しようと思います。
実行が遅い
Seleniumの宿命なのか、実行速度が非常に遅いです。
ブラウザを起動して記事取得するのでそのせいかもしれないですが、割とストレスなので当初やめていたRequestとBeautifulSoupの組み合わせで実装しなおそうかなと思ってます。
あとがき
本日は以上です。相手サイトの安定性(という言葉が適切か?)も含めて、試運転してきましたが、やはりメンテナンス性の問題に行き当たったので、改良が必要になりました。
引き続き運転していって満足いくものに仕上げたいと思います。
余談ですが、Selenium使って株の自動取引にチャレンジしている方もいるみたいですが、反応遅すぎて管理人的には危険じゃないかと思う次第です。