0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

無人の自動化から一次情報を取りに行くと、だいたい403で止まる

0
Posted at

背景

セール情報サイトを毎日自動更新しているのですが、その一次情報を取ってくるところで毎回つまずいています。

「今日のセールを調べて記事にする」という処理を無人で走らせているので、取得に失敗するとその日のサイト更新が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 にあります。

判定の順番を決めておく

取得が不安定なので、記事にするかどうかの判定順も固定しました。

  1. 割引率と終了日が出典で確認できる → 値引きセールの記事にする
  2. 日付の確定した告知が一次情報で取れる → ニュース記事にする(値引きが無くても成立する)
  3. どちらも0件 → 価格に依存しない解説記事にする

前は 1 が駄目だとすぐ 3 に落ちていました。2 を飛ばしていたのが、更新が薄くなっていた最大の理由です。

思ったこと

無人で走る自動化のいちばん厄介な失敗は、落ちることではなくて、静かに0件で成功することです。

403 は少なくとも音がします。「200 だけど中身が空」は音がしないので、こちらのほうが怖い。

なので、取得のたびに件数を見て、0件だったら「取れなかった」と「本当に無かった」を区別して記録する、というところまでを取得処理の一部だと考えたほうがいいです。

どのURLが取れてどれが取れないかは、実測しないと分かりません。そして一度実測したら、それは資産なので捨てずに残す。次に同じ壁に当たるのは、たぶん3日後の自分です。


本記事はAI補助で執筆した、個人開発の紹介記事です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?