[{"data":1,"prerenderedAt":372},["ShallowReactive",2],{"content-/millionaire-articles-summary":3,"all-pages-for-dir":370,"og-image-/millionaire-articles-summary":371},{"id":4,"title":5,"body":6,"category":353,"description":354,"extension":355,"meta":356,"navigation":257,"ogImage":357,"path":358,"project_name":359,"published":360,"publishedAt":361,"seo":362,"stem":363,"tags":364,"todo":357,"unpublished":360,"updatedAt":357,"__hash__":369},"pages/2026-05/2026-05-31/millionaire-articles-summary.md","16本の特集記事を agent-browser に全部巡らせて1本にまとめた話",{"type":7,"value":8,"toc":342},"minimark",[9,13,21,25,38,41,44,47,103,106,110,113,121,131,141,189,199,203,210,217,221,224,227,230,233,240,243,246,290,293,296,307,310,313,335,338],[10,11,12],"p",{},"ある資産形成の連載特集を読んでいて、No.1 から No.16 まで全部ある構成だと気づいた。\n1本ずつブラウザで開いて読むのは骨が折れる。そこで agent-browser に全16記事を巡らせて、まとめて1本の記事に統合してもらうことにした。",[10,14,15,16,20],{},"結論から言うと、16本ぶんの無料公開範囲を全部集めて、共通パターンを抽出した1本のまとめが手元に残った。\nただし途中で ",[17,18,19],"code",{},"wait --load networkidle"," が接続タイムアウトで止まり、別タブを拾う事故も起きた。回避しながら16本を取り切るまでの記録を残しておく。",[22,23,24],"h2",{"id":24},"やりたかったこと",[26,27,28,32,35],"ul",{},[29,30,31],"li",{},"一覧ページに並ぶ連載記事（No.1〜16、URLは連番）を全部開く",[29,33,34],{},"各記事の本文を取得して、横断的に要約・統合する",[29,36,37],{},"16人ぶんのプロフィールと共通点を1枚にまとめる",[10,39,40],{},"記事本文をそのまま転載するのは著作権的にアウトなので、あくまで「全記事を取得して要約・統合する」というワークフローのレベルで進めた。\n出来上がったまとめも、テーマ（資産形成や投資の入口、暴落との向き合い方）という一般的な切り口でぼかしてある。",[22,42,43],{"id":43},"進め方",[10,45,46],{},"最初に一覧ページを agent-browser で開き、記事へのリンクを抜き出した。\nURLが連番だったので、16本ぶんのアドレスはここで全部揃った。",[48,49,54],"pre",{"className":50,"code":51,"language":52,"meta":53,"style":53},"language-bash shiki shiki-themes vitesse-light vitesse-light","# 一覧ページを開いてリンクを集める\nagent-browser open \"https://finance.yahoo.co.jp/feature/special/list/millionaire\"\nagent-browser eval 'Array.from(document.querySelectorAll(\"a\")).map(a => a.href)'\n","bash","",[17,55,56,65,86],{"__ignoreMap":53},[57,58,61],"span",{"class":59,"line":60},"line",1,[57,62,64],{"class":63},"sxvE3","# 一覧ページを開いてリンクを集める\n",[57,66,68,72,76,80,83],{"class":59,"line":67},2,[57,69,71],{"class":70},"senZ8","agent-browser",[57,73,75],{"class":74},"sdGka"," open",[57,77,79],{"class":78},"sMJiu"," \"",[57,81,82],{"class":74},"https://finance.yahoo.co.jp/feature/special/list/millionaire",[57,84,85],{"class":78},"\"\n",[57,87,89,91,94,97,100],{"class":59,"line":88},3,[57,90,71],{"class":70},[57,92,93],{"class":74}," eval",[57,95,96],{"class":78}," '",[57,98,99],{"class":74},"Array.from(document.querySelectorAll(\"a\")).map(a => a.href)",[57,101,102],{"class":78},"'\n",[10,104,105],{},"あとは16本を順に開いて本文を取るだけ……のはずだった。ここから2つの壁にぶつかる。",[22,107,109],{"id":108},"壁その1networkidle-が返ってこない","壁その1：networkidle が返ってこない",[10,111,112],{},"1記事目を開いて本文を取ろうとしたら、いきなりタイムアウトで落ちた。",[48,114,119],{"className":115,"code":117,"language":118},[116],"language-text","✗ Failed to read: ... (os error 10060)\n","text",[17,120,117],{"__ignoreMap":53},[10,122,123,126,127,130],{},[17,124,125],{},"agent-browser open ... && wait --load networkidle && eval"," のチェーンで、",[17,128,129],{},"networkidle"," の待機が成立しないまま接続が切れていた。\n対象サイトは広告やトラッキングで常時ネットワークが動いているらしく、「ネットワークが静かになる瞬間」が永遠に来ない。",[10,132,133,134,136,137,140],{},"リトライする前にルールどおり issue を立てて、原因と回避策を書き残した。\n回避は単純で、",[17,135,129],{}," をやめて ",[17,138,139],{},"load"," 待ちか固定待機に切り替えるだけ。",[48,142,144],{"className":50,"code":143,"language":52,"meta":53,"style":53},"# networkidle をやめて固定待機に逃がす\nagent-browser open \"https://finance.yahoo.co.jp/feature/special/okuribito001.html\"\nagent-browser wait 2000\nagent-browser eval 'document.body.innerText'\n",[17,145,146,151,164,175],{"__ignoreMap":53},[57,147,148],{"class":59,"line":60},[57,149,150],{"class":63},"# networkidle をやめて固定待機に逃がす\n",[57,152,153,155,157,159,162],{"class":59,"line":67},[57,154,71],{"class":70},[57,156,75],{"class":74},[57,158,79],{"class":78},[57,160,161],{"class":74},"https://finance.yahoo.co.jp/feature/special/okuribito001.html",[57,163,85],{"class":78},[57,165,166,168,171],{"class":59,"line":88},[57,167,71],{"class":70},[57,169,170],{"class":74}," wait",[57,172,174],{"class":173},"sM54T"," 2000\n",[57,176,178,180,182,184,187],{"class":59,"line":177},4,[57,179,71],{"class":70},[57,181,93],{"class":74},[57,183,96],{"class":78},[57,185,186],{"class":74},"document.body.innerText",[57,188,102],{"class":78},[10,190,191,192,194,195,198],{},"これで本文は取れるようになった。issue にも「",[17,193,129],{}," を避けて ",[17,196,197],{},"wait --load load"," か固定待機を使う」と解決策を残してある。",[22,200,202],{"id":201},"壁その2別タブの記事を拾う","壁その2：別タブの記事を拾う",[10,204,205,206,209],{},"本文が取れたと思ったら、中身がまったく別サイトの記事になっていた。\n現在ページのURLを確認すると ",[17,207,208],{},"about:blank"," で、複数タブが混在していた。open したタブと eval が走るタブがずれていたわけだ。",[10,211,212,213,216],{},"ここはセッションを固定して、open した直後の同じチェーンの中で本文まで取り切る方式に変えて解決した。\nタブを跨がせないことが肝で、",[17,214,215],{},"--session"," で固定してから一気通貫で抜くと安定した。",[22,218,220],{"id":219},"壁その3そもそも続きが読めない","壁その3：そもそも続きが読めない",[10,222,223],{},"16本を集める途中で、この連載が有料会員限定だと判明した。\n無料で取れるのは各記事の「リード文＋現在の資産状況＋投資を始めた頃のエピソード」までで、本文の核心は会員ページの向こうにある。",[10,225,226],{},"ここは欲張らず、無料で読める範囲だけを16本ぶん集める方針に切り替えた。\nプロフィール・資産額・投資の入口・きっかけは無料範囲に揃っていたので、まとめの素材としては十分だった。",[22,228,229],{"id":229},"コンテキスト汚染を避ける小細工",[10,231,232],{},"16本ぶんの本文を全部コンテキストに載せると重い。malformed で会話が落ちるリスクもある。\nそこで取得した本文は逐一ファイルに書き出し、ノイズ（ナビ・フッター・関連記事）を除いた集約版を1ファイルにまとめてから、それだけを読んで全体を把握した。",[10,234,235,236,239],{},"実際この日も ",[17,237,238],{},"tool call malformed"," を2回踏んでいる。\n本文の塊を引数に詰め込みすぎないよう、取得→ファイル保存→集約という流れに分けたのは正解だった。",[22,241,242],{"id":242},"進捗管理",[10,244,245],{},"16本という数になると、どこまで取れたか分からなくなる。\n進捗メモをチェックボックスで持って、取得・集約・ドラフトの段階を可視化しながら進めた。",[26,247,250,260,266,272,278,284],{"className":248},[249],"contains-task-list",[29,251,254,259],{"className":252},[253],"task-list-item",[255,256],"input",{"checked":257,"disabled":257,"type":258},true,"checkbox"," 一覧ページから16記事のURL・タイトルを取得",[29,261,263,265],{"className":262},[253],[255,264],{"checked":257,"disabled":257,"type":258}," agent-browser で16記事すべての無料公開範囲を収集（16ファイルに保存）",[29,267,269,271],{"className":268},[253],[255,270],{"checked":257,"disabled":257,"type":258}," ノイズ除去した集約版を1ファイルに作成",[29,273,275,277],{"className":274},[253],[255,276],{"checked":257,"disabled":257,"type":258}," 16人の一覧表＋共通点の分析を含むまとめドラフトを作成",[29,279,281,283],{"className":280},[253],[255,282],{"disabled":257,"type":258}," 数字・固有名詞の最終チェック（取材時点と更新時点で資産額がずれている記事あり）",[29,285,287,289],{"className":286},[253],[255,288],{"disabled":257,"type":258}," 公開先・形式の最終決定",[22,291,292],{"id":292},"まとめでわかったこと",[10,294,295],{},"無料範囲だけでも、16人を横に並べると共通パターンがくっきり出た。",[26,297,298,301,304],{},[29,299,300],{},"投資の入口は「持株会」か「株主優待」のどちらかに集中していた",[29,302,303],{},"暴落（リーマンショック、震災）を「恐怖」ではなく「仕込み場」として動いた人が多い",[29,305,306],{},"危機感（就職難、ブラック企業からの脱出）が原点になっているケースが目立つ",[10,308,309],{},"1本ずつ読んでいたら気づきにくい横串の共通点が、16本を一気に並べたことで見えた。\nこれは agent-browser に全記事を巡らせて1枚に集約させた効果だと思う。",[22,311,312],{"id":312},"学び",[26,314,315,323,329,332],{},[29,316,317,319,320,322],{},[17,318,129],{}," は万能ではない。広告だらけのサイトでは永遠に成立しないので、",[17,321,139],{}," か固定待機に逃がす",[29,324,325,326,328],{},"agent-browser はタブが混ざる。",[17,327,215],{}," で固定して、open から eval まで同じチェーンで取り切る",[29,330,331],{},"大量取得は逐一ファイルに落とす。コンテキストに塊を載せると malformed で落ちる",[29,333,334],{},"16本のような数物は、進捗をチェックボックスで持つと「どこまで取れたか」で迷わない",[10,336,337],{},"判断とぼかし方は人間が握り、ページを巡って本文を抜く泥仕事は agent-browser に任せる。\nこの切り分けが、16本という数を現実的な時間で1本にまとめる鍵だった。",[339,340,341],"style",{},"html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sM54T, html code.shiki .sM54T{--shiki-default:#2F798A;--shiki-dark:#2F798A}",{"title":53,"searchDepth":67,"depth":67,"links":343},[344,345,346,347,348,349,350,351,352],{"id":24,"depth":67,"text":24},{"id":43,"depth":67,"text":43},{"id":108,"depth":67,"text":109},{"id":201,"depth":67,"text":202},{"id":219,"depth":67,"text":220},{"id":229,"depth":67,"text":229},{"id":242,"depth":67,"text":242},{"id":292,"depth":67,"text":292},{"id":312,"depth":67,"text":312},"dev","Yahoo!ファイナンスの資産形成連載（全16記事）を agent-browser で順に取得し、要約・統合して1本のまとめにした作業ログ。networkidle のタイムアウトを回避しながら16本を集めた試行錯誤を記録する。","md",{},null,"/millionaire-articles-summary","misc-dev",false,"2026-05-31T00:00:00.000Z",{"title":5,"description":354},"2026-05/2026-05-31/millionaire-articles-summary",[71,365,366,367,368],"スクレイピング","Claude Code","要約","開発日記","FsXAta3JeORDFZ3TwLHEvrCHV7L6JBY493_cmjq3ZXc",[],"https://log.eurekapu.com/og/blog/millionaire-articles-summary.png?v=2026-05-31T00%3A00%3A00.000Z&title=16%E6%9C%AC%E3%81%AE%E7%89%B9%E9%9B%86%E8%A8%98%E4%BA%8B%E3%82%92%20agent-browser%20%E3%81%AB%E5%85%A8%E9%83%A8%E5%B7%A1%E3%82%89%E3%81%9B%E3%81%A61%E6%9C%AC%E3%81%AB%E3%81%BE%E3%81%A8%E3%82%81%E3%81%9F%E8%A9%B1&author=Kei%20Komatsu&sig=11131f34d6e419b6",1782528846005]