背景
セール情報サイトを毎日自動更新しているのですが、その一次情報を取ってくるところで毎回つまずいています。
「今日のセールを調べて記事にする」という処理を無人で走らせているので、取得に失敗するとその日のサイト更新が0件になります。
0件で終わる日が続いたことがあって、ログを見たら理由が全部「取得できなかった」の一行だけでした。
何を試して何が駄目だったのかが残っていないので、翌日も同じ経路を試して同じように落ちる…。
これは取得の問題というより、記録の問題だと思いました。
何が起きるか、実測で並べる
今日ぶんの取得を、結果ごとに分けて書いてみます。全部 Claude Code の WebFetch(URLを取ってきて本文をマークダウンに整形するツール)で叩いた実測です。
まず、素直に取れたもの。
https://www.itoen.co.jp/news/release/ 200 ニュース一覧・詳細とも取れる
https://www.ucc.co.jp/company/news/ 200 年別インデックスも取れる
https://www.nissin.com/jp/news/ 200 詳細ページの表まで取れる
https://www.ssnp.co.jp/beverage/ 200 業界紙。ページングも効く
https://prtimes.jp/topics/keywords/{キーワード} 200 一覧が取れる
メーカーの広報ページと業界紙は、意外なくらい普通に取れます。
次に、403 を返すもの。
https://www.suntory.co.jp/news/ 403 Forbidden
https://www.asahibeer.co.jp/news/ 403 Forbidden
この2社は本文すら返ってきません。認証が要るわけではなく、ツール経由のアクセスを弾いている挙動です。
最後に、200 だけどリダイレクトを追う必要があるもの。
https://www.lion.co.jp/ja/company/press/ 302 → http://www.lion.co.jp/ja/news/
http://www.lion.co.jp/ja/news/ 302 → http://www.lion.co.jp/ja/newsroom/news/
http://www.lion.co.jp/ja/newsroom/news/ 200 ここでやっと一覧が出る
2段です。私が使っているツールはホストをまたぐリダイレクトを自動で追わず、リダイレクト先のURLを返してくるので、呼び直しが2回要りました。
これは安全側の設計として正しいと思っていて、勝手に追ってしまうと「取りに行ったつもりのないドメイン」を叩くことになります。ただ、知らないと「lion.co.jp は取れない」と誤って結論します。
403 を諦めない
サントリーとアサヒが取れないと、ビール系の記事が書けなくなります。
ここで効くのが迂回路です。日本の消費財メーカーは、自社サイトの広報ページとほぼ同じ内容を PR TIMES にも出しています。そして PR TIMES の個別リリースページは取れます。
https://prtimes.jp/main/html/rd/p/{リリース番号}.{企業ID}.html
この形なら全文が取れます。一覧は https://prtimes.jp/topics/keywords/{キーワード} から辿れます。
一方で、同じ PR TIMES でも下記の形は使えませんでした。
https://prtimes.jp/main/html/searchrlp/company_id/{企業ID}
こちらは JavaScript で描画しているので、HTTP としては 200 が返るのに一覧が0件に見えます。同じサイトの中でも、URLの形によって取れたり取れなかったりする、ということです。
「200 が返ったのに中身が空」は一番危ないパターンで、エラーにならないぶん、そのまま「今日は新着なし」と解釈されます。今日もコカ・コーラとキリンHDのニュースルームで同じことが起きました。
台帳に残す
それで、こういう実測を毎回ログに書き捨てるのではなく、調査手順のドキュメント側に台帳として残すようにしました。
サイトごとに「1番目に当たるソース、2番目、403のときの迂回先、JS描画で使えないURL形」を順番に書いてあります。実際にはこんな粒度です。
1. メーカー公式の一覧(取得可)
伊藤園 https://www.itoen.co.jp/news/release/ … 新商品・価格改定とも取れる
2. 403 の迂回(サントリー・アサヒ)
PR TIMES 個別リリース https://prtimes.jp/main/html/rd/p/{release}.{company}.html
※ searchrlp/company_id/{id} は JS描画で使えない
3. 業界紙(取得可)
https://www.ssnp.co.jp/beverage/ (/page/N/ でページング)
前は「Amazonの商品ページを見て価格を確認する」を前提に手順が書いてありました。でも Amazon の商品ページとタイムセールページは 503 か 403 でまず取れません。取れない前提で手順を組み直したほうが、結果的に記事は出ます。
具体的には、値引き率と終了日が確認できないなら値引きの記事は諦めて、日付の確定した告知(新商品の発売日、価格改定の実施日)を記事にする、という判断に切り替えました。
今日でいうと、UCC が2026年11月1日出荷分から家庭用飲料45品を改定する、という発表が取れました。「UCC BLACK無糖」185g缶が145円から155円になる、という個別価格まで業界紙側で確認できたので、それを記事にしています。値引きではありませんが、日付と品目数と改定率は一次情報で確定しています。
書けたものは https://coffee.autoarticles.net にあります。
判定の順番を決めておく
取得が不安定なので、記事にするかどうかの判定順も固定しました。
- 割引率と終了日が出典で確認できる → 値引きセールの記事にする
- 日付の確定した告知が一次情報で取れる → ニュース記事にする(値引きが無くても成立する)
- どちらも0件 → 価格に依存しない解説記事にする
前は 1 が駄目だとすぐ 3 に落ちていました。2 を飛ばしていたのが、更新が薄くなっていた最大の理由です。
思ったこと
無人で走る自動化のいちばん厄介な失敗は、落ちることではなくて、静かに0件で成功することです。
403 は少なくとも音がします。「200 だけど中身が空」は音がしないので、こちらのほうが怖い。
なので、取得のたびに件数を見て、0件だったら「取れなかった」と「本当に無かった」を区別して記録する、というところまでを取得処理の一部だと考えたほうがいいです。
どのURLが取れてどれが取れないかは、実測しないと分かりません。そして一度実測したら、それは資産なので捨てずに残す。次に同じ壁に当たるのは、たぶん3日後の自分です。
本記事はAI補助で執筆した、個人開発の紹介記事です。