Quantcast
Channel: 19日に更新してた
Viewing all articles
Browse latest Browse all 57

【golang】chromedp を使って "ニュースでわかる「現代英語」"のスクリプトを取ってくる

$
0
0

お題の通りですが、聞き逃しをダウンロードしたものにつけるので、多くても5-6ファイルなので関数化してまとめました。

引数は jsonを struct 化したものから引いてきているものを使っているので、別に変数名は aa_vinfo1 由来でなくても file_title でも、ちょっと手間がかかる aa_contents_id でもいいのですが、どうせ趣味のプログラミングで資源はあんまり考えなくていいですし、せっかく struct 化しているのだから手間が少なく、もとのプログラムで使っていないものをということで。

タイトルの "」"の後に半角スペースがある回がほとんどなのですが、たまに無い回があるのでスペースの除去は別にしています。

cdp.node の中身はこちらを御参照ください。
pkg.go.dev

こういうのは pythonでやられる方が多いでしょうが、golang& chromedp で出来なくもないということで。*1

>>|go|
func newsdewakaru(aavinfo1 string) (script string) {

// https://www.nhk.or.jp/radioondemand/json/7512/bangumi_7512_01.json
// aavinfo1を引数として、jsonに入っているタイトルからページタイトルを検索する
aavinfo1 = strings.Replace(aavinfo1, "ニュースで学ぶ「現代英語」", "", 1)
// 」のあとに半角スペースがないときもあるため
aavinfo1 = strings.TrimLeft(aavinfo1, "")

// chromedpオプション設定
allocCtx, cancel := chromedp.NewExecAllocator(context.Background(), chromedp.ExecAllocatorOption{
chromedp.NoFirstRun,
chromedp.NoDefaultBrowserCheck,
chromedp.Flag("disable-extensions", true),
chromedp.Headless,
}...)
defer cancel()

// chromedp起動
ctx, cancel := chromedp.NewContext(allocCtx, chromedp.WithLogf(log.Printf))
defer cancel()

// ニュースで学ぶ「現代英語」のurl
url := "https://www.nhk.jp/p/rs/77RQWQX1L6/list/"

err := chromedp.Run(ctx,
// そこそこ待たないとうまく動かないことがあるため、以下数か所にスリープを入れている
chromedp.Sleep(time.Second),
chromedp.Navigate(url),
chromedp.Sleep(time.Second),

// アンコール放送の場合、最初のページに解説ページのリンクが出てこないため、過去のページを検索
chromedp.ActionFunc(func(ctx context.Context) error {

for {
var nodes *cdp.Node
if err := chromedp.Nodes(`//h3`, &nodes, chromedp.NodeVisible, chromedp.AtLeast(0)).Do(ctx); err != nil {
return err
}

for _, l := range nodes {
// l.Children[0].NodeValueがリンクテキスト
if l.Children[0].NodeValue == aavinfo1 {
return nil
}
}

// クリックする部分のxpathは一定
// chromedp.Click(`//*[@id="past-pg"]/div/div[2]/a/span`, chromedp.BySearch).Do(ctx)
chromedp.Click(`//span[text()="もっと見る"]`, chromedp.BySearch).Do(ctx)
time.Sleep(3 * time.Second)

}
}),

// 目的のページのリンクをクリック
chromedp.Click(`//h3[text() = "`+aavinfo1+`"]`, chromedp.BySearch),
chromedp.Sleep(2*time.Second),

// 詳細記事(スクリプトがあるページ)のリンクをクリック
chromedp.Click(`//li[text() = "詳細記事"]`, chromedp.BySearch),
chromedp.Sleep(2*time.Second),

// スクリプトのテキストを取得
chromedp.Text(`//*[@id="article-0"]`, &script),
chromedp.Sleep(time.Second),
)
if err != nil {
log.Fatalln(err)
}

// 全文を改行で分ける
splitText := strings.Split(script, "\n")

// いらない部分を取り除く
var joinedText []string

for _, j := range splitText {

if strings.HasPrefix(j, "(20") || strings.HasPrefix(j, "※") || j == "" || j == "" || j == "全文" {
continue
}
joinedText = append(joinedText, j)
}

// つなぎ直す
script = strings.Join(joinedText, "\n\n")

// fmt.Println(script)

return
}
|

*1:枯れ木も山の賑わいということでクソコードを産出しておきます


Viewing all articles
Browse latest Browse all 57

Trending Articles