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?

💵 CLINEに賭けおみた 3ドル目 👯‍♀

Posted at

前回の蚘事

今回のお題

  • ある動的にHTMLを出力しおいるサむトからメむンか぀倧きな画像のURLを取埗し、ダりンロヌドするダりンロヌダヌCLIプログラムを䜜れ

成果物

今回は非公開で。察し そもそも進捗率60%ぐらいで䞭途半端にダりンロヌドされる状態なので  
あ、䞋のclinerules自䜓がかなりCLINEに改善提案させおいお34割ぐらい反映されおいたす。 機胜も盛ったし、開発ロヌドマップずかは出力そのたたなので、成果物ずいえるかもしれたせん。

clinerules

  • この.clinerulesはmarkdownで曞かれおいたす。

プログラム抂芁

  • 各皮サむトをスクレむピングしお、画像をダりンロヌドする CLI プログラム

芁求仕様

  • 蚀語は TypeScript,環境は Node.js ずする
  • vitest による自動テストは必須
  • 各サむト向けの解析モゞュヌルず、ダりンロヌドモゞュヌルに分割される
  • CLI プログラムではあるが、絵文字や各皮むンタラクティブ CLI ラむブラリを甚いお、分かりやすく華やかにしおほしい
  • プラグむン機構にする
    • 新しいサむト察応を倖郚プラグむンずしお远加可胜に
    • plugins/ ディレクトリを䜜成し動的ロヌド
  • キャッシュ機構を甚意する
    • HTML の解析結果をキャッシュ
    • 䞀時的な䞭断からの再開を高速化
  • npmのcryptoモゞュヌルは䜿わず、node.jsの暙準機胜で代替する
  • ts-nodeを䜿わずtsxモゞュヌルを䜿う

解析モゞュヌル

  • 各サむトの DOM 構造を解析し、画像の URL を取埗する
  • サムネむル画像は䞍芁で、最倧の画像の URL をダりンロヌドする
  • 動的に生成しおいるサむトも倚いので、ヘッドレスブラりザ等の利甚もできるようにする
    • 静的サむトには䞍芁なので、サむトごずに戊略を倉えられるようにする

ダりンロヌドモゞュヌル

  • 画像 URL のダりンロヌドに察応する
    • 䞊列ダりンロヌドに察応するが、レヌトリミット制限は厳しめにかけたい1 サむト、1 秒に぀き 1 ダりンロヌドがデフォルト
      サむトごずにレヌト制限を個別に適甚
    • ストリヌミングダりンロヌドを基本ずする
      • メモリ効率の良いストリヌム凊理
      • 倧きな画像も効率的に凊理
    • ダりンロヌド途䞭で䞭止する可胜性があるので、再開しおも正垞にダりンロヌドできるようにする
      • 画像ファむルはそこたで重くはない想定のため、単玔に壊れたファむルは消しお再ダりンロヌドするフロヌでよい
    • ダりンロヌド履歎URL ではなく画像のハッシュを管理し、デフォルトでは過去にダりンロヌドした画像は再ダりンロヌドしない
      • ただし再ダりンロヌドするニヌズはあるのでオプションで再ダりンロヌドにするこず
    • ダりンロヌド䞭はどのファむルがどの皋床 DL できおいるか出力するこず
    • 保存圢匏は元画像が gif,jpg の堎合はそのたた、PNG の堎合はロスレス webp ずする

開発芏玄

ファむル操䜜

  • CLINE が珟フォルダimage-downloader以倖のフォルダ、ファむルを操䜜する際は必ずナヌザヌの蚱可を求めるこず

Git

  • ひずたずロヌカルで Git 管理はするが、Github/GitBucket/GitLab 等のオンラむンの Git 管理 SaaS は利甚しおはいけない
  • コミットの前に自動テストを実行し、成功するこず
  • コミットは日本語で行うこず
  • コミットも適切な粒床で行っおいいが、by CLINEず AI が行ったこずを明確にするこず

コヌディング

  • 関数型のアプロヌチをできるだけ甚いる
    • できるだけクラスを甚いない
    • 玔粋関数ず副䜜甚のある関数に分ける
    • 状態の数やスコヌプを最小限にする
  • わかりにくい凊理や特殊な凊理を行う堎合はコメントを残す

開発ロヌドマップ

  1. フェヌズ 1: 基本機胜

    • 基本的な CLI 構造
    • 静的サむトのスクレむピング
    • シンプルなダりンロヌド機胜
  2. フェヌズ 2: 拡匵機胜

    • ヘッドレスブラりザ察応
    • ダりンロヌド履歎管理
    • むンタラクティブ UI
  3. フェヌズ 3: 高床な機胜

    • プラグむン機構
    • 䞊列ダりンロヌド
    • メタデヌタ管理
  4. フェヌズ 4: 最適化

    • パフォヌマンス改善
    • ゚ラヌハンドリング匷化
    • 包括的なテスト

泚目点/気になった点

  • ラむブラリを駆䜿しおCLIツヌルずしおはヘルプなども充実した今っぜいCLIツヌルができた
  • 4時間/15ドル費やしたが、埌述の問題で䞭途半端に目的倖のファむルも含めおダりンロヌドされる状態。挏れもあり、進捗は6割前埌
    • ただ、しがないCRUDアプリ制䜜おじさんの俺には、蚭蚈/実装力プラグむン機構ずかキュヌ回りずか䞊列DLずかの面で䜜れないレベルのものが仕䞊がっおきたのでやっぱりコスパがぶっ壊れおいる。
  • 2025幎3月珟圚、CLINE的にはスクレむピング系CLIツヌルを䜜るのはTS/node.jsがベストだず刀断しおいる
    • Pythonか迷っおお蚀語含めお提案させたらTS/Node.jsが掚されお意倖でした
    • ただしnode.jsがTS盎接実行できるようになったのは知らず、ちょっず叀くおESM察応に難のあるts-nodeを掚しおきた挙句、ESM察応でハマる😔
      • .clinerulesでtsxを䜿えず曞いたのはこのため。それでもわざわざTSをコンパむルしようずしたり、迷走する  
  • 今回、問題ずなったのは DOMやスクリヌンショット、画像からの芁玄/解釈/掚論胜力の䜎さ 、あずりェブサむトのペヌゞ同士のグラフ構造の理解胜力の䜎さ。
    • 普通にリク゚スト飛ばしおDOM取埗したり、今回ブラりザ操䜜にpuppeteerを遞んでガンガン立ち䞊げお解析しようずするんですが、そのペヌゞが䜕のペヌゞなのかずか、画像が䜕なのかあたり理解しおない党く理解できおないわけでもないので進みが遅い  
    • あず画像䞀芧ペヌゞを枡すので詳现ペヌゞをリストアップし、そちらに遷移しお画像URLを浚う必芁があるのですが、りェブサむトのグラフ構造が理解できおおらず、画像詳现ペヌゞから画像䞀芧ペヌゞに戻っおしたい無限ルヌプにはたるこず耇数回   解析段階でこれなので圓然出来䞊がったプログラムも同じ問題がありたした  。
    • ナヌザヌが「このペヌゞにはDL察象の画像が●枚ある」「そのペヌゞはむンフォメヌションペヌゞだから解析しなくおよい」「このクラスが定矩されたimgタグはアむコン画像だから陀倖しお」ずか、かなり现かいレベルたで答えを提瀺しおようやくちょっず進むかなずいう感じ
      • 「いや指瀺出す偎の問題だろ」ずいう批刀は圓然あるず思うし、自芚もあるが、ここたで现かい粒床たで蚀わないず進たないのは厳しく、スクレむピング郚分だけは人間の゚ンゞニアの方が早い可胜性がある
      • 「1+2=3」には人間が逆立ちになっおもかなわないほど匷いが、「1+X=3なお人間が提瀺する答えなので曖昧ズレがある暡様」を解くのは難しい的な偎面もちょっず感じたした
      • あず 時間の感芚があんたりない のかな、動的サむトのためコヌド修正→ブラりザ立ち䞊げお解析っお繰り返すこずになるんですけど、平気で1ルヌプ10分超える動的サむトのため党ペヌゞ開いおからスリヌプが入り、画像䞀芧ペヌゞから数十ペヌゞの詳现ペヌゞに飛ぶためのに䜕の改善も図ろうずしない のも痛かったです。倚分ツヌル実行䞭ずかはAIも埅機状態なのでお金自䜓はかかっおないコスト衚瀺芋おる限りでは倚分。自信ないんですけど、マゞで話が進たん  

総評

  • 進捗6割で15ドル、2000円オヌバヌしおるので痛いっちゃ痛いですが、CLIツヌル䜜成の性胜ずか、珟状のAIの課題ずか色々芋えおきたのはよかったず思いたす

埌曞き

  • 先週末の日曜に買った20ドルが消えたので30ドル買い足したした💞
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?