0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【実録】スクレイピングで20回ブロックされた男が、RSSフィードという「裏の最短配送ルート」を見つけて大勝利した話 〜puoppo誕生秘話〜

0
Last updated at Posted at 2026-07-02

【実録】スクレイピングで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という名前が生まれました。

構成はシンプルです。

  1. RSSで記事の概要をfeedparserで取得
  2. それをまとめてGemini APIに投げる
  3. 要約・傾向分析させる

物流的に言うなら、こんな感覚でした。

1件ずつ手作業で仕分けていた荷物を、まとめてスキャンして自動仕分けする設備を導入した

1件では見えなかったものが、まとめて処理することで初めて見える形になる。

このとき組んだ約10時間の開発が、後にpuoppo_appとして今もDocker化・機能追加を続けているプロジェクトの原型になっています。


まとめ:現場で学んだ「エンジニアのルート設計」

今回の一連の経験から、大きな教訓を得ました。

  1. 力技(正面突破)の前に、まずは「公開データ(API・RSS)」を探せ
  2. 1件が薄い情報でも、母数が増えれば意味のあるデータに変わる
  3. 「集める」だけで満足せず、「集めたものをどう活かすか」まで考える

ブロックされ続けた20回は、今思えば無駄ではありませんでした。

あの遠回りがなければ、RSSにも辿り着かなかったし、puoppoという発想にも至らなかったと思います。

もし、スクレイピングのブロックで消耗している方がいたら、一度サイトの隅に「RSS」の裏口が用意されていないか確認してみてください。

そして、もし小さなデータが集まったら、それを束ねて眺めてみると、思わぬヒントが見つかるかもしれません。


最後まで読んでいただきありがとうございました!
この記事が役に立ったら、LGTM(いいね)を押していただけると励みになります!

関連記事

0
1
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
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?