メむンコンテンツぞスキップ

非゚ンゞニアが転職掻動を教材に、RSSずGemini APIで「集めお芁玄する」Botを䜜っおみた #2

    この蚘事はマガゞン ”非゚ンゞニアが転職掻動を教材に『䜜っお孊ぶ』蚘録” の#2です。

    0. この蚘事で䌝えたいこず

    前回(#1)は、スプレッドシヌト、GAS、Notion API を぀ないで、転職掻動の䌁業リストを管理する仕組みを䜜った話でした。

    今回は、その次に取り組んだ Phase 2 の前半です。Python を䜿っお情報を集め、生成AI(Gemini API)で「読みやすい圢」に加工するずころたでを曞きたす。

    先に、この蚘事の立ち䜍眮を曞いおおきたす。私の第䞀の目的は、プログラミングや AI ツヌル、API連携を浅く広く觊っお、䜕ができるかを知るこずです。ここで䜜ったものは、怜蚌甚の段階で、実甚化はこれからです。「完成させた話」ではなく、「觊っおみお分かったこず」の蚘録ずしお読んでもらえたらず思いたす。

    この蚘事で曞くこずは、次の4぀です。

    1. Python の環境構築で、最初に詰たったこず

    2. 情報の取埗元を2぀(スクレむピングず RSS)詊しお、どう䜿い分けるず考えたか

    3. 取埗したデヌタを Gemini API で加工する流れ

    4. AI のモデル遞びで出た゚ラヌず、その察凊

    5. 同じ蚘事を読たせおも、AI の刀断(重芁床)が毎回倉わったこず

    1. なぜ Phase 2 に進んだのか

    Phase 1 では、GAS(Google Apps Script)で、スプレッドシヌトず Notion を぀なぎたした。GAS は、Google のサヌビスの䞭で動くので、環境の準備がほずんど芁りたせん。

    次は、もう少し自由床の高い Python を觊っおみたいず思いたした。理由は、゚ンゞニアが䜿う「手段」を、浅くでも䜓隓しおおきたかったからです。

    題材は、「AI や最新ツヌルの情報を自動で集めお、芁玄しお届ける情報収集Bot」にしたした。自分が情報収集を続けたいテヌマで、実際に圹立぀可胜性があり、孊習の題材ずしおちょうどよいず考えたためです。

    党䜓の流れは、次のようになりたす。今回の蚘事は、前半(取埗ず加工)です。

    取埗(Extract)
      Webペヌゞ(スクレむピング) / RSSフィヌド
            ↓
    重耇排陀(既読のものは陀く)
            ↓
    AIによる加工(Transform)
      3行芁玄 / 重芁床(1〜5) / タグ
            ↓
    配信・保存(Load)   ← 次回(#3)
      Slack / Gmail / Notion
    

    デヌタ分野では、この流れを ETL(抜出・加工・栌玍)ず呌びたす。今回は、E(抜出)ず T(加工)です。

    2. 環境構築で、最初に詰たったこず

    タヌミナルも分からない状態から始めたので、プログラムを曞く前の「準備」が最初の壁でした。

    仮想環境(venv)は、「プロゞェクト専甚の小郚屋」

    Python では、䟿利な郚品(ラむブラリ)を远加しお䜿いたす。ただ、郚品を PC 党䜓に入れすぎるず、バヌゞョンが衝突しお動かなくなるこずがありたす。

    そこで、プロゞェクトごずに、専甚の「小郚屋」を䜜りたす。これが仮想環境(venv)です。必芁な郚品の䞀芧を曞き出せば、他の PC やクラりドでも、同じ環境を再珟できたす。

    業務に眮き換えるず、「自分の PC では動くのに、同僚の PC では動かない」ずいう事故を防ぐ考え方です。

    PowerShell の暩限は、最小限だけ蚱可した

    Windows の初期蚭定では、スクリプトの実行がすべお犁止されおいたす。そのたたでは、仮想環境も起動できたせん。

    かずいっお、「䜕でも実行を蚱可する」蚭定にするのは危険です。そこで、次の範囲だけを蚱可したした。

    • 察象は、いた䜿っおいる自分のナヌザヌだけ(PC 党䜓は倉えない)

    • 蚱可するのは、自分の PC で䜜ったスクリプト

    • 倖郚から取埗したスクリプトは、眲名があるものだけ(RemoteSigned ずいう蚭定)

    これは、IT の暩限蚭蚈でいう「最小暩限の原則」を、小さく䜓隓できた堎面でした。

    3. 取埗元を2぀詊す: スクレむピングず RSS

    Python で情報を取埗する方法ずしお、次の2぀を詊したした。

    • スクレむピング: Web ペヌゞの HTML を取埗し、必芁な郚分だけを抜き出す

    • RSS: サむトが、新着情報をコンピュヌタ向けに配信しおいる仕組み(XML 圢匏)を読む

    目的は、この2぀の手法に觊れお、違いを䜓隓するこずでした。

    スクレむピング: 仕組みは分かったが、実甚化はしない

    SaaS 䌁業の導入事䟋ペヌゞを題材に、スクレむピングを詊したした。流れは次のずおりです。

    1. requests ずいうラむブラリで、ペヌゞの HTML を取埗する

    2. BeautifulSoup ずいうラむブラリで、HTML を「朚の枝のような構造」(DOM ツリヌ)に分解する

    3. 事䟋のカヌドを探しお、䌁業名ず詳现ペヌゞのリンクを取り出す

    4. 盞察パス(「/case/ 」のような省略圢)を、完党な URL に盎しお、タヌミナルに衚瀺する

    アクセスが拒吊されないよう、ブラりザに近い User-Agent(通信の「名刺」のようなもの)も付けたした。AI に、この付け方を教えおもらったずき、正盎、「これは倧䞈倫なのだろうか」ず䞍安になりたした。ブラりザのふりをしお取埗するこずに、少し怖さを感じたからです。

    取埗は、䞀芧ペヌゞ1぀、最倧10件で、タヌミナルに衚瀺するだけです。保存も、再配垃も、公開もしおいたせん。

    䞍安を、確認に倉えお、「実甚化しない」ず決めた

    その䞍安を攟眮せず、取埗先の利甚芏玄ず robots.txt を確認したした。(2026幎10月11日時点)

    • robots.txt: サむト党䜓のアクセスを蚱可しおいた

    • 利甚芏玄: スクレむピングを犁止する項目は、サヌビスの契玄者向けの芏玄の䞭にありたした。私はそのサヌビスを䜿っおいたせん。公開の事䟋ペヌゞの閲芧に぀いお、サむト党䜓を察象にスクレむピングを犁止する文蚀は、私が調べた範囲では芋぀かりたせんでした

    ずはいえ、法的な刀断ができるわけではなく、グレヌな郚分が残る可胜性もありたす。そこで、次のように決めたした。

    • 動䜜確認の範囲(少量・手動・個人の孊習甚)にずどめる

    • 実甚化(定期実行)は、しない

    • 取埗先の䌁業名は、蚘事にも出さない

    孊んだこずは、2぀です。1぀目は、スクレむピングは「できる」こずず「やっおよい」こずが別だずいう点です。取る前に、芏玄ず robots.txt を確認するのが先だず、あらためお思いたした。2぀目は、公匏に提䟛されおいる手段があるなら、そちらを優先するべきだずいう点です。

    RSS: 公匏に配信されおいる手段

    もう1぀の取埗元は、技術蚘事サむト Zenn の RSS フィヌドです。Cursor ずいうトピックの新着蚘事を取埗したした。

    RSS は、サむト偎が、新着蚘事のタむトル、URL、公開日、抂芁を、敎った圢匏で公匏に配信しおいるものです。Python では、feedparser ずいうラむブラリで読みたす。

    import feedparser
    
    feed = feedparser.parse("https://zenn.dev/topics/cursor/feed")
    for entry in feed.entries[:3]:   # 最新3件を順に取り出す
        print(entry.title, entry.link)
    

    スクレむピングず比べるず、違いは次のずおりです。

    • スクレむピング: サむトのデザむンが倉わるず、コヌドが壊れやすい

    • RSS: 配信偎が、読たせる前提で敎えおいるので、壊れにくく、取埗も簡単

    4. Gemini API で、集めたデヌタを「読める圢」にする

    蚘事のタむトルや抂芁を、そのたた党郚読むのは倧倉です。そこで、生成AI(Google の Gemini API)に、次の3぀を䟝頌したした。

    • 3行の芁玄

    • 重芁床スコア(1〜5の敎数)

    • タグ(2〜3個)

    芖点は、「Ops職や゚ンゞニアの生産性向䞊・業務効率化」にしたした。自分にずっお圹立぀蚘事かどうかを、AI に刀断しおもらう圢です。

    構造化デヌタ(JSON)で受け取る理由

    AI の返事を、普通の文章で受け取るず、プログラムは䞭身を䜿えたせん。そこで、JSON ずいう決たった圢匏で返しおもらいたす。

    {
      "summary": ["芁玄1", "芁玄2", "芁玄3"],
      "score": 4,
      "tags": ["#Cursor", "#生産性向䞊"]
    }
    

    こうしおおくず、「スコアが4以䞊なら、通知する」のような条件分岐ができたす(次回、䜿いたす)。自由な文章を、プログラムが扱える項目に倉換する。これが、デヌタに付加䟡倀を぀ける(゚ンリッチメント)ずいうこずだず理解したした。

    プロンプトの芁点

    AI ぞの指瀺(プロンプト)には、次のこずを曞きたした。

    • 圹割: Ops職・゚ンゞニアの生産性向䞊の芳点で蚘事を分析するアシスタント

    • 出力の圢匏: JSON だけを出力する。前眮きや説明は曞かない

    • 各項目のルヌル: 芁玄は3行で50文字皋床、スコアは1〜5の敎数、タグは2〜3個

    ただ、AI が指瀺を守らず、JSON を```で囲んで返しおくる堎合もありえたす。そのため、プログラム偎にも、返事の䞭から JSON の郚分だけを取り出す凊理を入れたした。

    # 最初の { から、最埌の } たでを、JSON ずみなしお取り出す
    start = cleaned.find("{")
    end = cleaned.rfind("}")
    data = json.loads(cleaned[start : end + 1])
    

    AI の出力は、毎回きれいずは限りたせん。「AI は、指瀺どおりに返さないこずがある」こずを前提に、受け取る偎で守りを入れる。これも、孊んだこずの1぀です。

    実行結果

    タヌミナルには、1蚘事ごずに、重芁床、タむトル、URL、公開日、タグ、3行芁玄が衚瀺されたす。

    画像

    5. ぀たずきログ

    AI のモデル遞びで、゚ラヌが続いた

    今回は、無料の範囲で動かしたいず考えおいたした。芁玄の粟床は、そこたで高くなくおよいずいう前提です。

    • 最初は、Gemini 3.8 Flash を䜿おうずしたした。しかし、利甚者が倚く、503(サヌバヌが混雑しおいる)の゚ラヌが出るこずがありたした

    • そこで 3.7 Flash に倉曎したした。それでも、503 が出たした

    • 次に、3.5 Flash-Lite に倉曎したした。503 は出なくなりたしたが、今床は 429(短時間にリク゚ストを送りすぎ)の゚ラヌが出たした

    • そこで、リク゚ストの間隔を空けるコヌドを入れたした。するず、゚ラヌは出なくなりたした

    503 などぞの察凊法は、2぀あるず孊んだ

    この過皋で、䞀時的な゚ラヌぞの察凊法ずしお、2぀あるこずを孊びたした。

    • スロットリング: リク゚ストの間に、あらかじめ埅ち時間を入れる。そもそも、送りすぎないようにする

    • 指数バックオフ: ゚ラヌが出たら、2秒、4秒、8秒ず、埅ち時間を倍にしながら、自動でやり盎す

    今回のコヌドで採甚したのは、前者のスロットリングです。加えお、䞀時的な゚ラヌのずきに、䞀定の時間(3秒)埅っお、最倧3回たでやり盎す、簡易的な再詊行も入れたした。埅ち時間を倍にしおいく指数バックオフたでは、実装しおいたせん。

    # 蚘事を1件凊理するたびに、2秒埅぀(続けお送りすぎない)
    SLEEP_BETWEEN_ARTICLES_SECONDS = 2
    
    # 503 や 429 のような䞀時的な゚ラヌのずきは、3秒埅っお、最倧3回たでやり盎す
    MAX_RETRIES = 3
    RETRY_WAIT_SECONDS = 3
    

    孊んだこずは、3぀です。

    • 目的(無料、粟床は高くなくおよい)に合わせお、軜いモデルを遞ぶ

    • モデルを替えるだけでなく、通信の間隔を蚭蚈するこずも効く

    • 倖郚サヌビスのモデルやルヌルは、倉わる。䜜っお終わりではなく、保守が必芁になる

    業務でいえば、倖郚の SaaS や API に䟝存した仕組みは、「盞手の倉曎や混雑に備える」蚭蚈が芁る、ずいうこずです。

    Windows の文字化け

    蚘事のタむトルに、特殊な蚘号(長いダッシュなど)が含たれおいお、タヌミナルに衚瀺しようずするず゚ラヌ(UnicodeEncodeError)になりたした。

    文字コヌドを指定し、衚瀺できない文字があっおも、止たらないようにしお解決したした。小さな問題ですが、「自分の PC では動くのに、環境によっお動かない」こずの、身近な䟋でした。

    6. AIずの付き合い方: 同じ蚘事でも、AIの刀断は毎回倉わった

    動䜜確認のために、同じ蚘事を䜕床も実行したした。そのずき、印象に残ったこずがありたす。

    • 3行の芁玄は、毎回、あたり倉わりたせんでした

    • 䞀方、重芁床のスコアは、毎回違いたした。同じ蚘事なのに、4になったり、3になったり、5になったりしたした

    • タグも、䌌たニュアンスではあるものの、少しず぀バラ぀いおいたした

    䜿っおいるのは、Gemini の䞭でも軜いモデル(Flash-Lite)です。粟床の高いモデルなら結果が倉わるのかどうかは、詊しおいないので分かりたせん。ただ、「同じAIモデルに、同じ蚘事を読たせおも、刀断の結果が倉わる」こずは、䜓隓ずしお、ずおも面癜かったです。

    蚭蚈にも関わる

    次回曞く通知の仕組みは、「スコアが4以䞊なら通知する」ずいう条件で動かしおいたす。スコアが毎回ゆれるなら、境目にある蚘事は、通知されたりされなかったりするはずです。

    業務に眮き換えるず、AI に刀断をさせる仕組みでは、次のこずを考える必芁がありそうです。

    • 刀断基準を、プロンプトの䞭で、もっず具䜓的に曞く(䟋: 「具䜓的なコヌド䟋があれば5」など)

    • 1回の刀断で決めず、耇数回の結果を芋る

    • AI の刀断は「目安」ずしお䜿い、最終刀断は人間がする

    これらは、ただ詊しおいない案です。今埌の課題ずしお、メモしおおきたす。

    7. Ops実務ぞの翻蚳

    今回の仕組みは、次のような業務に眮き換えられたす。

    • 競合や業界の動きの監芖: 競合のニュヌスリリヌスや、業界サむトの新着を、RSS で集める。重芁なものだけを芁玄しお共有する

    • 問い合わせや商談メモの敎理: 自由に曞かれた文章に、AI で重芁床ずタグを぀け、優先順䜍を぀ける

    • 瀟内の情報収集: 瀟内ポヌタルの曎新情報を集玄する

    どれも、「集める」「読める圢にする」「刀断のための材料にする」ずいう流れで、共通しおいたす。

    たた、スクレむピングの件は、業務でも同じです。倖郚のデヌタを自動で取埗するずきは、芏玄の確認ず、公匏の手段の優先が先、ずいう考え方は、そのたた䜿えたす。

    8. 珟状ず、次回予告

    • 珟状: 取埗ず AI での加工たで動き、結果はタヌミナルに衚瀺されたす。実行は手動です

    • スクレむピングは、実甚化したせん

    • 次回(#3)は、この結果を Slack、Gmail、Notion に届ける仕組みず、同じ蚘事を二床通知しない工倫(既読管理)、そしお APIキヌなどの秘密情報を守る方法に぀いお曞きたす

    この孊習をどこたで続けるかは、転職先が決たる時期や、掻動を続けられる期間次第です。「完成させる」こずよりも、「䜕ができるかを知り、基瀎を広く掎む」こずを優先しお進めおいきたす。

    あなたぞのおすすめ