sheepfold
2021年5月

sheepfold

サイトをクローリングし、PDF形式でアーカイブするプログラムです。
小規模
Python
Puppeteer

概要

特定サイト上の複数のページをPDF形式でアーカイブするために開発しました。これまで扱ったことのあるBeautiful Soupではスクリーンのキャプチャができないため、ヘッドレスブラウザを活用することにしました。ヘッドレスブラウザはPuppeteerのPython移植版であるPyppeteerを使用しています。PuppeteerはSeleniumよりも軽量で環境構築がしやすいため、今回のようなライトな使い方においてはPuppeteerの方がよいと考えました。

工夫点

画像の読み込みを待ってからキャプチャ

アーカイブ対象のサイトは画像が豊富で、それらが非同期で読み込まれます。そのためページ遷移後にページの最下部までゆっくりとスクロールして画像を全て読み込ませ、その動作が完了してからキャプチャをとるようにしました。

Pythonで初めての非同期処理

Puppeteerは並列実行が可能ですが、サーバーに負荷をかけぬよう同時実行数を制御するようにしています。

不要部分はキャプチャしない

読み込み後にCSSを操作するJavaScriptコードを実行させ、キャプチャしたい場所以外の要素をページから削除しました。

無効なファイル名のエスケープ

PDFにはページのh1要素を使用していました。このときWindowsファイル名としては無効な文字(\/:*?"<>|)が含まれることがあるため、それらを全角文字に置きかえています。