質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

Q&A

1回答

2310閲覧

headlessブラウザを立ち上げ並列で処理をする方法が知りたいです

Palo_Punte

総合スコア21

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Chrome

Google Chromeは携帯、テレビ、デスクトップなどの様々なプラットフォームで利用できるウェブブラウザです。Googleが開発したもので、Blink (レンダリングエンジン) とアプリケーションフレームワークを使用しています。

0グッド

0クリップ

投稿2020/07/08 09:05

goの並列処理は関数の前にgoを付ければいいのですが、ヘッドレスブラウザを立ち上げて並列でクロールをするやり方がググっても見つからなかったため、ご存知の方がいれば教えていただけないでしょうか?
下記のコードですと結構もっさりして並列の恩恵を感じられないのですがどのようにすれば良いのでしょうか?
firefoxの方が早いなどアドバイスをいただければと持っています。
よろしくお願いいたします。

Google Chrome 83.0.4103.97
ChromeDriver 83.0.4103.39
go version go1.13

package main import ( "fmt" "strings" "time" "github.com/PuerkitoBio/goquery" "github.com/sclevine/agouti" ) var pageMap map[string]*agouti.Page = make(map[string]*agouti.Page) func hoge(sites [][]string) { for _, site := range sites { driver := agouti.ChromeDriver( agouti.ChromeOptions("args", []string{ "--disable-dev-shm-usage", "--disable-gpu", "--headless", "--no-sandbox", "--single-process", "--window-size=10,10", }), ) err := driver.Start() if err != nil { fmt.Println("driver.Start()") fmt.Println(err) } go huga(site, driver) } time.Sleep(time.Second * 120) } func huga(site []string, driver *agouti.WebDriver) { page, exist := pageMap[site[1]] if !exist { tempPage, err := driver.NewPage(agouti.Browser("chrome")) if err != nil { fmt.Println("driver.NewPage") fmt.Println(err) return } pageMap[site[1]] = tempPage page = tempPage } err2 := page.Navigate(site[1]) if err2 != nil { fmt.Println("page.Navigate") fmt.Println(err2) return } getSource, err := page.HTML() if err != nil { fmt.Println("page.HTML()") fmt.Println(err) return } readerCurContents := strings.NewReader(getSource) doc, err := goquery.NewDocumentFromReader(readerCurContents) if err != nil { fmt.Println("goquery.NewDocumentFromReader") fmt.Println(err) return } doc.Find(site[2]).Each(func(index int, selection *goquery.Selection) { fmt.Println(selection.Text()) }) } func main() { sites := [][]string{ {"サイト名1", "サイトURL1", "body"},//サイト名、サイトURL、スクレイピング箇所のセレクタ {"サイト名2", "サイトURL2", "body"}, {"サイト名3", "サイトURL3", "body"}, {"サイト名4", "サイトURL4", "body"}, {"サイト名5", "サイトURL5", "body"}, } hoge(sites) }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ブラウザを並列で起動しているのですから、それはメモリも多く使用しますし、モッサリもすると思います。

代わりに goquery を使う事で軽く高速に処理できるはずです。

https://github.com/PuerkitoBio/goquery

投稿2020/07/14 07:27

mattn

総合スコア5030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Palo_Punte

2020/07/16 06:36

ブラウザ処理をより早くする方法が知りたいのです
mattn

2020/07/16 08:05

もっさりとはどういう意味でしょうか? 120 秒待っているのでプログラムは必ず 120 秒しないと終了しません。ヘッドレスブラウザの処理が全て終わったらプログラムも終了したいのであれば sync.WaitGroup を使って goroutine を待ち合せないといけません。
Palo_Punte

2020/07/16 10:44

わかりづらくて申し訳ございません huga関数が終わるまでの処理の時間を短くする方法が知りたかったのでtime.Sleep(time.Second * 120)が終わるまでの処理の話のつもりではありませんでした driver.Start()だけgo hugaの前に実行をしてから渡しているのですがdriver.Start()の記載箇所はこちらの方が処理時間が早くなるや、ChromeOptionsの設定に〜を記載をするともっと早くなるなどのアドバイスがほしく質問をさせていただいておりました
mattn

2020/07/17 15:56

ヘッドレスブラウザは単なるプロセスで、agoutil はそのプロセスと通信してるだけなので Go のコードを弄った所で速くはならないと思います。ちなみに goquery を使ってもサイトにログインしたりは出来ます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問