概要
特定サイト上の複数のページをPDF形式でアーカイブするために開発しました。これまで扱ったことのあるBeautiful Soupではスクリーンのキャプチャができないため、ヘッドレスブラウザを活用することにしました。ヘッドレスブラウザはPuppeteerのPython移植版であるPyppeteerを使用しています。PuppeteerはSeleniumよりも軽量で環境構築がしやすいため、今回のようなライトな使い方においてはPuppeteerの方がよいと考えました。
工夫点
画像の読み込みを待ってからキャプチャ
アーカイブ対象のサイトは画像が豊富で、それらが非同期で読み込まれます。そのためページ遷移後にページの最下部までゆっくりとスクロールして画像を全て読み込ませ、その動作が完了してからキャプチャをとるようにしました。
Pythonで初めての非同期処理
Puppeteerは並列実行が可能ですが、サーバーに負荷をかけぬよう同時実行数を制御するようにしています。
不要部分はキャプチャしない
読み込み後にCSSを操作するJavaScriptコードを実行させ、キャプチャしたい場所以外の要素をページから削除しました。
無効なファイル名のエスケープ
PDFにはページのh1
要素を使用していました。このときWindowsファイル名としては無効な文字(\/:*?"<>|
)が含まれることがあるため、それらを全角文字に置きかえています。