しばらく前に一度やりはじめて挫折した件。再度,要求仕様を良く考えてChatGPT-5 Thinking に依頼してみた顛末が以下のとおり。かなり苦労したが目的は一応たっせられた。このブログ記事を月単位でpdfにアーカイブするというものだ。
その過程でわかったことがある。ChatGPT-5の能力を持ってしても,単純な構文エラー([]の数がつり合わない)を生ずることがある。一方で原因不明のトラブルが発生した。これは未解決のままだ。2020年6月分のアーカイブの際に,wkhtmltopdfがうまく機能しないというもの。いちおうの回避プログラムも提案してもらったので,なんとかはなっている。
pythonを使う際には仮想環境にしないといけないのがちょっと面倒だ。
% brew install wkhtmltopdf
% python3 -m venv path/to/venv
% source path/to/venv/bin/activate
(venv) % python3 -m pip install --upgrade pip
(venv) % python3 -m pip install pymupdf requests beautifulsoup4 numpy playwright
(venv) % ./blgpdf 202510 202510
などなど。
Q(koshix):私は,https://koshix.blogspot.com に2018年12月から毎日ブログを掲載しています。このデータを月単位でpdfファイルとしてダウンロードしたいと考えています。例えば https://koshix.blogspot.com/2025/09/ とすれば,2025年9月分のデータにアクセスすることができます。ところで,この場合9月21日までが1ページにまとまって出力されますが,それを越える部分(9月20日以前)は,ページ末の「前の投稿」からたどる必要があります。これによって,次の1ページで9月1日までのデータにアクセスすることができます。ブログの分量によっては,1月分が1ページで収まる場合もありますが,今のようにそうでない場合もあります。おおむね2ページで収まると考えています。さて,このような状況で月単位のpdfファイルを取得するのですが,実際に試してみると1ページのpdfの後半には連続したブランクページがたくさん含まれているようです。できればこの空白を取り除いた上で,1ページ目ともしあれば2ページ目(これも空白を取り除く)をつなげた1本のpdfファイルにまとめてほしいのです。ファイル名は例えば,2025-09.pdf などとなります。このような仕事をコマンドラインから実行するプログラムを作ってください。そのプログラム名を blgpdf とすれば,blgpdf 202506 202509のようにすれば,2025年6月から2025年9月までの4つのファイル(6月,7月,8月,9月)が得られるようにしたいのです。ここまでで何か質問はありませんか。なければあらためて依頼のゴーサインを出します。A(ChatGPT-5 Thinking,35秒):ありがとうございます。要件は把握しました。実装前に最小限だけ確認させてください(全部 “はい/いいえ/短文” で返せます):1.依存ツール:wkhtmltopdf(HTML→PDF化)+ Python パッケージ PyMuPDF(空白ページ検出と削除)を使ってよいですか?・macOS(Homebrew)で brew install wkhtmltopdf、pip install pymupdf を想定しています。2.空白ページの扱い:文中に紛れ込んだ“実質的に真っ白なページ”も削除対象にしてよいですか?(末尾に連なる白紙だけでなく、途中にあっても除去)3.出力場所:デフォルトは「カレントディレクトリ」に YYYY-MM.pdf を保存でよいですか?(例:./2025-09.pdf)・もし希望があれば --outdir オプションを付けます。4.レンダリング待ち:Blogger の遅延読み込み対策として、wkhtmltopdf --javascript-delay 2000(2秒待ち)を入れます。既定で問題なければこの設定で進めます。(必要なら秒数を指示ください)5.2ページ目URLの検出:月ページ下部の “前の投稿 / Older posts” リンク(search?updated-max= を含む)を自動検出して拾う方式で問題ないですか?(テーマ依存のラベル文言差は無視し、URLパターンで判定します)OK でしたら、すぐに blgpdf(単一ファイルのPythonスクリプト、CLI)をお渡しします。例:blgpdf 202506 202509 → 6〜9月を順に取得・白紙除去・結合・保存。Q(koshix):1 yes 2 no 3 yes 4 yes 5 yes これですすめてください。どうぞよろしくおねがいします。A(ChatGPT-5 Thinking,20秒):了解です。ご指定どおり進めます。(以下略)Q(koshix):空白ページの除去が全くできていないので,2000ページものpdfが出力されていました。 なんとかなりませんか。A(ChatGPT-5 Thinking,23秒):原因は、wkhtmltopdf が実体のない要素や印刷用 CSS の影響で“見た目は白紙だが内部的には何かがある”ページを大量に吐き出し、以前の「テキスト/画像/ベクターの有無」判定では白紙と認識できなかったことにあります。(以下略)Q(koshix):やはりうまくいかないのですが,dpiを増やしたり閾値を大きくするのは逆効果ではないのですか?A(ChatGPT-5 Thinking,32秒):ご指摘のとおり、「DPIを上げる」「閾値(white_ratio)を大きくする」は白紙判定を“厳しく”する方向なので、見えない微小ゴミ(細い罫線・1pxの影・アンチエイリアス・不可視要素のにじみ)を拾ってしまい、白紙とみなせなくなる=逆効果になりがちです。(以下略)Q(koshix):だいぶよくなりました。ところが,1ページで収まらない場合に,ページ末尾の「前の投稿」で過去のページを辿る必要があるのですが,ページ末尾の「次の投稿」の方の未来のページを辿ってそれを2ページ目として採用している場合が見受けられます。なんとかなりませんか。A(ChatGPT-5 Thinking,28秒):了解です。2ページ目は必ず「前の投稿(= Older posts = 過去方向)」だけを辿るようにロジックを強化しました。(以下略)Q(koshix):常に前の投稿へを参照するようになっていませんか。目標月の1日までが1ページ内に収まっていれば,前の投稿へのリンクを辿る必要がない場合もあるのですけど。A(ChatGPT-5 Thinking,19秒):助かりました。ご指摘の通り、「1ページ目にその月の1日が含まれている場合は“前の投稿”を辿らない」条件を厳密に入れました。・・・以下延々と別のエラーコードの修正で格闘を続けた・・・・・・2020/06 がうまくダウンロードできない状態が続く・・・Q(koshix):(venv) koshi@mba2020 ~ % ./blgpdf 202006 -vFile "/Users/koshi/./blgpdf", line 248dil = ( ^SyntaxError: '(' was never closedA(ChatGPT-5 Thinking,17秒):ごめん、私の括弧ミスでした(dil = ( 行)。膨張処理のところをシンプルに書き直して、構文エラーを解消した完全版を置いておきます。これに差し替えてください。・・・結局 2020/06 の問題の方は解決しなかった・・・・・・ChatGPTでも単純なプログラムのミスを犯すのだった・・・
P. S. 10/21 brew upgrade にエラーが出ていたので,ChatGPT-5 の指示を受けながら,brew cleanup, brew update, brew upgrade, brew doctor を繰り返してエラーを潰していった。その過程でwkhtmltopdf が使えないことがわかり,代替として提示された chromium もだめだといわれた。仕方がないので再び ChaatGPT-5 に相談して上記プログラムの修正を図ったところ,brew とは関係なしに,python -m pip install playwright pymupdf requests beautifulsoup4 と python -m playwright install chromium の環境を使った修正版が使えることになった。こちらの方が数式が保持されていてうれしい。
[1]blgpdf のソースコード(2025.10.21版)
0 件のコメント:
コメントを投稿