【実録】スクレイピングで20回ブロックされた男が、RSSフィードという「裏の最短配送ルート」を見つけて大勝利した話 〜puoppo誕生秘話〜
はじめに
こんにちは!
物流現場で7年以上働きながら、独学でPythonを学んでいるトラックドライバーです。
これは「学習◯時間のトラックドライバーが〜した話」シリーズが始まるもっと前の話です。
Pythonを学び始めて間もない頃のエピソードになります。
今振り返ると、この一件がなければpuoppo_appは生まれていませんでした。
私のエンジニア人生における"原点"のエピソードです。
先日、あるWebサイトから最新情報を自動で取得するツールを開発しようと、BeautifulSoupとRequestsを駆使してスクレイピングに挑戦しました。
待っていたのは、怒涛の「アクセス拒否(403 Forbidden)」の嵐。
- User-Agentを偽装
- 待機時間をランダムに設定
- あれこれ手を尽くす
それでも、ことごとくブロックされること20回以上。
「もう力技(正面突破)じゃ無理だ…」
そう絶望しかけたその時、ある「裏の最適ルート」に気づきました。
それがRSSフィードです。
今回は、
- 泥臭い試行錯誤の末にRSSへ辿り着いた話
- そこから「AI要約アプリ
puoppo」の着想に至った話
この2つを、現場感覚満載でお届けします。
※本記事はシリーズ記事とは少し毛色が違う、puoppo誕生の裏側を綴った番外編です。
1. 泥沼の正面突破:ブロックとの20回戦
最初は「情報を引っ張ってくるだけだし、サクッと終わるだろう」と高をくくっていました。
試したこと(積み重なるデスマーチ)
第1〜5戦
通常のスクレイピング。即座に「403 Forbidden」で門前払い。
第6〜12戦
「ロボットだと思われているなら」と、ブラウザのふりをするためにUser-Agentヘッダーを偽装。
しかし、数回成功したのちに即BAN。
第13〜20戦
サーバー負荷を考慮してtime.sleep()でインターバルを空け、さらにランダムな秒数に設定。
それでも、大手ニュースサイトの高度なセキュリティ(WAFやボット検知)の前に撃沈。
物流で言えば、こんな感じです。
荷受け場に行ったら毎回違う警備員に止められ、並び方を変えても、しまいには出入り禁止を食らった
「さすが大手、セキュリティが桁違いだな…」
変なところで感心してしまいました。
2. 視点を変えた「ルート最適化」:RSSという救世主
20回目のブロックを食らった時、ふと我に返りました。
「そもそも、HTMLをパース(解析)して、デザインの隙間からデータを抜き出す必要ってあるのか?」
サイトのフッターを凝視すると、小さく光るアイコンを見つけました。
RSSです。
feedparserというライブラリを使ってみると、あれだけ苦労していたのが嘘のように、わずか数行で安全にデータを回収できました。
import feedparser
RSS_URL = "https://example.com/feed"
def fetch_latest_topics(url):
feed = feedparser.parse(url)
for entry in feed.entries[:5]:
print(f"タイトル: {entry.title}")
print(f"リンク : {entry.link}")
print(f"公開日時: {entry.published}")
正面突破であれだけ拒否されていたデータが、一瞬で綺麗に構造化されて返ってきました。
ただ、取得できたタイトルや概要を眺めていて、正直こう思ったんです。
「……これ、1件1件はめちゃくちゃ短いな。情報量も大したことない」
3. 「100件集まったら?」という閃き
RSSで取れるのは、あくまで見出しと短い概要だけ。
1件だけ見れば「ふーん」で終わる情報です。
でも、ふと視点を変えてみました。
「これが1件じゃなくて、100件集まったらどうなる?」
物流の仕事でも、1件のクレームや1件の遅延報告だけを見ても大した意味は持ちません。
でも、それが積み重なって100件になったとき、そこには必ず傾向が見えてきます。
- この時間帯のこのルートで遅延が集中している
- このお客様は同じ理由で何度も不満を漏らしている
RSSの概要文も同じじゃないか、と思ったんです。
1件1件は薄くても、100件分の見出しと概要を並べれば、
- 書き手が本当に伝えたいこと
- 繰り返し出てくる話題
- 透けて見える不満
こういうものが浮かび上がってくるはずだ、と。
とはいえ、100件分を人間の目で1件ずつ読んで傾向を掴むのは正直しんどい。
荷物を1個ずつ手作業で仕分けるようなものです。
「だったら、これをAIに要約させれば一瞬じゃん」
これがpuoppo誕生の瞬間でした。
4. RSS × Gemini API で生まれたpuoppo
仕事中に閃いて、忘れないようにメモをして、帰宅後に早速形にしてみました。
ちなみに、この名前にもちょっとした思考の飛躍があります。
世論調査(Public opinion poll)
→「pu」「op」「po」を繋げて puoppo
→発音すると、プォッポ
→なんか鳩の鳴き声みたいだな…
→鳩といえば、伝書鳩
→伝書鳩といえば、平和のニュース
→平和の象徴
→よし、これでいくか!🕊
こうしてpuoppoという名前が生まれました。
構成はシンプルです。
- RSSで記事の概要を
feedparserで取得 - それをまとめてGemini APIに投げる
- 要約・傾向分析させる
物流的に言うなら、こんな感覚でした。
1件ずつ手作業で仕分けていた荷物を、まとめてスキャンして自動仕分けする設備を導入した
1件では見えなかったものが、まとめて処理することで初めて見える形になる。
このとき組んだ約10時間の開発が、後にpuoppo_appとして今もDocker化・機能追加を続けているプロジェクトの原型になっています。
まとめ:現場で学んだ「エンジニアのルート設計」
今回の一連の経験から、大きな教訓を得ました。
- 力技(正面突破)の前に、まずは「公開データ(API・RSS)」を探せ
- 1件が薄い情報でも、母数が増えれば意味のあるデータに変わる
- 「集める」だけで満足せず、「集めたものをどう活かすか」まで考える
ブロックされ続けた20回は、今思えば無駄ではありませんでした。
あの遠回りがなければ、RSSにも辿り着かなかったし、puoppoという発想にも至らなかったと思います。
もし、スクレイピングのブロックで消耗している方がいたら、一度サイトの隅に「RSS」の裏口が用意されていないか確認してみてください。
そして、もし小さなデータが集まったら、それを束ねて眺めてみると、思わぬヒントが見つかるかもしれません。
最後まで読んでいただきありがとうございました!
この記事が役に立ったら、LGTM(いいね)を押していただけると励みになります!
関連記事