電波ビーチ

☆(ゝω・)v

消費したコンテンツ 2月2023

全然時間内のに全然パフォーマンスでないぜ!!!個人的にはクリスマスあたりの気持ちがうろついているが、残念だったな、もう2月も終わりだぜ!!!今月一番おもしろかったのは所属してた部署が破壊されてヌルっと別の会社に委譲されてたことです(それも委譲決まってから知らされた)

続きを読む

消費したコンテンツ 1月2023

実に9ヶ月ぶりくらいのいつものフォーマット記事。すごい色々あったけど全部忘れた。だいぶコンテンツ消費にかける時間や意欲が薄まっていた。とはいえ、この9ヶ月間の間もそれなりに消費はしていた。記録に残してはないので記憶にあるぶんしか覚えてないけど。そういう過去には振り返らず、あくまで今月分だけで書く

  • 映画
    • Da 5 Bloods
    • Minding the Gap
    • 100日間生きたワニ
  • 配信
    • Sanrio Virtual Festival 2023
    • ChatGPT
続きを読む

Devcontainerが作れなくなった/動かなくなって慌てた話

  • 何が起きたか
  • 結論

何が起きたか

今日も元気にdevcontainervscodeRemote-Container)で気軽に環境を破壊しちゃおうかな、って新しく作成したら、

mkdir: cannot create directory '/home/node/.vscode-server': No space left on device

とか、既存のプロジェクトをdevcontainerで開いても

failed to solve: failed to register layer: Error processing tar file(exit status 1): write /home/vscode/.oh-my-zsh/themes/kphoen.zsh-theme: no space left on device

とか言われる。新しいファイルを作成する容量がない、だと?コンテナの分際でたわけたことをぬかしおる

「あれ〜?まあ2ヶ月くらい色んな捨てimage作っては放置してるしなんならmac自体ずっと再起動してないしな」みたいに思って、とりあえずDockerをアプデしたりmacを再起動したりしたが改善せず。

続きを読む

Google Apps ScriptでYoutube動画の公開設定を管理する

Google Apps ScriptでYoutube Data APIを気軽に使える(別にアクセストークンとかキーの発行とか要らない!)らしい。ということでデモ的に触ってみて、ごく簡易な管理シートを作ってみた。

github here (MITライセンスにしてる)

Sheetはこちら -> Youtube MyVideo Status Manager - SpreadSheet。コピーを作成して適当にどうぞ

  • 使い方
  • Youtube API
  • Triggerによる投機実行
  • 勉強になりました
続きを読む

chromedp+goqueryを使ったスクレイピングのスニペット

タイトルですべてを語っているだけの自分用メモ

背景

そういう機会に直面してしまった。pythonなら余裕だがpython/Node以外だとそういえばやったことがない。せっかくなのでGoでやる。以上

chromedpは初めて使った

chromedp/chromedp - github

四方山

また、最初テキトーにググった内容をノールックでパクろう参考にしようとしてたため、日本語記事ではchromedpより多くヒットしたagoutiを使おうとしてたが、コピペサンプルを実装して「あれ?なんか動かんな」ってなってから初めて調べて、1年前にプロジェクト終了のお知らせを出してたのを知った。使用するライブラリのreadmeくらいちゃんと読もうね....

chromedpはagoutiと違ってseleniumやchromedriverといったwebdriverのたぐいを用意しなくても動くのが便利。昨今のスクレイピングツールはだいたいそういう感じなのかもしれないが知らない

コード

素晴らしいことにchromedpのリポジトリにはたくさんの(完動する)サンプルがある。ろくにリファレンス読まずとも今回やりたかった用途程度ならば剽窃書けてしまった。

「JSがロードされたあとの、ブラウザでレンダリングされた結果のhtml」が欲しかったのである。この用途でいうと、以下のサンプルでいい

なお、今回のはホントにイージーなので、むしろgoqueryを使わなくてもいいのだが、怠惰なので使った。ついでにUser-Agentをランダムに生成してくれるパッケージを使ってみた。スクレイピング仕草(?)

github.com

package main

import (
    "context"
    "fmt"
    "log"
    "strings"
    "time"

    "github.com/DataHenHQ/useragent"
    "github.com/PuerkitoBio/goquery"
    "github.com/chromedp/chromedp"
)

func main() {
    // user-agent
    ua, err := useragent.Desktop()
    if err != nil {
        log.Fatalln(err)
    }
    // options いろいろあるけど今回はuser-agentだけ
    opts := append(chromedp.DefaultExecAllocatorOptions[:],
        chromedp.UserAgent(ua),
    )
    ctx, cancel := chromedp.NewExecAllocator(context.Background(), opts...)
    defer cancel()

    // create context
    ctx, cancel = chromedp.NewContext(ctx)
    defer cancel()
    // time out
    ctx, cancel = context.WithTimeout(ctx, 50*time.Second)
    defer cancel()

    var wholeHtml string
    // run task list
    err = chromedp.Run(
        ctx,
        chromedp.Navigate("ターゲットのサイトURL"),
        chromedp.Sleep(1000*time.Millisecond), // いちおうスクレイピング仕草(?)
        chromedp.WaitVisible("div.mb-2:nth-child(2)"),
        chromedp.OuterHTML("html", &wholeHtml, chromedp.ByQuery),
    )
    if err != nil {
        log.Fatalln(err)
    }
    dom, err := goquery.NewDocumentFromReader(strings.NewReader(wholeHtml))
    if err != nil {
        log.Fatalln(err)
    }
    a := dom.Find("div.text-base:nth-child(1)").Text()
    b := dom.Find("div.mb-2:nth-child(2)").Text()
    fmt.Printf("GET TEXT:\nA: %s\nB: %s\n", a, b)
}

CSSセレクターは横着してfirefoxのdevtoolの「コピー->CSSセレクター」でコピーしたものをそのまんま貼り付けただけである。うーん怠惰

参考

Golang+chromedp+goquery 简单爬取动态数据

全体的な構成を参考にした(bilibiliのサイトなのでちょっと重い)

chromedp で Chrome を見える状態(not headless)で起動して、かつ終了しないようにする - Qiita

オプションの書き方を参考にした

WSL2で雑にgoのweb開発環境

ゴール

wsl側で起動したgoのwebサーバーにwindows側のlocalhostでアクセスするまでやるよ

  • ゴール
  • WSL2
  • update, upgrade
  • 今回目指すディレクトリ構造
  • goのインストール
  • PATHを通す
  • プロジェクト作成
  • wslで起動したサーバーにwindows側でlocalhostでアクセスする
続きを読む