Chromedp paketi, harici bağımlılıklar (Selenium veya PhantomJS gibi) olmadan Go'da Chrome DevTools Protokolünü destekleyen tarayıcıları çalıştırmanın daha hızlı ve daha basit bir yoludur. Harici bağımlılık yoktur derken, tabi ki sisteminizde Google Chrome'un yüklü olması gerekiyor. Chromedp'ye headless modu gerektiği için minimum Chrome sürümünüz 59 olması gerekiyor.
go get -u github.com/chromedp/chromedp
package mainimport ("context""log""github.com/chromedp/chromedp")func main() {//chrome örneği oluşturalımctx, cancel := chromedp.NewExecAllocator(context.Background(),append(chromedp.DefaultExecAllocatorOptions[:],chromedp.Flag("headless", false),)...,)//headless: false ayarlayarak pencerenin görünmesini istedik//chrome nesnesini defer ile kapatmayı unutmuyoruzdefer cancel()//yeni durum oluşturuyoruzctx, cancel = chromedp.NewContext(ctx)//aynı şekilde defer ile penceremizide kapatıyoruzdefer cancel()//Twitter isminin kaydedileceği değişkeni oluşturalımvar twitterName string//chromedp.Run() içerisinde tarayıcıda yapılacak işlemleri yazıyoruz.err := chromedp.Run(ctx, //önce durumu (hangi pencere) olacağını belirtiyoruz//tarayıcının gitmsini istediğimiz adresi yazalımchromedp.Navigate(`https://kaanksc.com/posts/webview-statik-uygulama-ornegi3/`),//css seçici ile belirttiğimiz elementin yüklenmesini bekleyelimchromedp.WaitVisible(`.single__contents > p:nth-child(16) > a:nth-child(1)`, chromedp.ByQuery),//Tıklanılacak nesneyi yine css seçici ile belirtelimchromedp.Click(`.single__contents > p:nth-child(16) > a:nth-child(1)`, chromedp.ByQuery),//Bu işlemden sonra twitter'a gidecek//Twitter profilinde adın gösterildiği yeri css seçici ile beklemesini istedikchromedp.WaitVisible(`div.r-1b6yd1w:nth-child(1) > span:nth-child(1)`, chromedp.ByQuery),//belirttiğimiz css seçicisi ile elementin içindeki yazıyı twitterName değişkenine atayalımchromedp.Text(`div.r-1b6yd1w:nth-child(1) > span:nth-child(1)`, &twitterName),//burdan sonra tarayıcı penceresi kapanacak)//hata kontrolü yapaımif err != nil {log.Fatal(err)}//son olarak twitterName içindeki değişkeni ekrana bastıralımlog.Printf("Twitter İsim:%s\n", twitterName)}
Yukarıdaki örnekte yeni chrome penceresi oluşturma, tıklama, elementin yüklenmesini bekleme, element içindeki yazıyı alma ve adrese gitme gibi işlemlerin nasıl yapıldığını gördük.
Go Playground linkinden Go kodlarını çeken bir uygulama yazalım.
package mainimport ("context""log""github.com/chromedp/chromedp")func main() {//chrome örneği oluşturalımctx, cancel := chromedp.NewExecAllocator(context.Background(),append(chromedp.DefaultExecAllocatorOptions[:],chromedp.Flag("headless", true), //Bu sefer headless çalışmasını istedik//yani chrome pecneresi açılmayacak)...,)//chrome nesnesini defer ile kapatmayı unutmuyoruzdefer cancel()//yeni durum oluşturuyoruzctx, cancel = chromedp.NewContext(ctx)//aynı şekilde defer ile penceremizide kapatıyoruzdefer cancel()//go Kodlarının kaydedileceği değişkeni oluşturalımvar goKodu string//chromedp.Run() içerisinde tarayıcıda yapılacak işlemleri yazıyoruz.err := chromedp.Run(ctx, //önce durumu (hangi pencere) olacağını belirtiyoruz//tarayıcının gitmsini istediğimiz adresi yazalımchromedp.Navigate(`https://play.golang.org/p/a_SoTzENmV7`),//tarayıcının yüklenemesini bekleyeceği elementi css seçici ile yazıyoruzchromedp.WaitVisible(`#code`, chromedp.ByQuery),//textContent ile yazı alanı içeriğini çekebiliriz.chromedp.TextContent(`#code`, &goKodu, chromedp.ByQuery),)if err != nil {log.Fatal(err)}//son oalrak go kodlarını ekrana bastıralımlog.Printf("Go Kodu:\n%s", goKodu)}
Yukarıdaki örnekte headless modda çalışmayı ve yazı kutusu (input veya textarea) içindeki yazıları almayı öğrendik.
Daha fazla bilgi için https://github.com/chromedp/chromedp,
daha fazla örnek için https://github.com/chromedp/examples adresine bakabilirsiniz.