informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Web Scraper adalah alat yang secara otomatis mengekstrak data dari situs web. Mereka banyak digunakan dalam pengumpulan data, optimasi mesin pencari, riset pasar dan bidang lainnya. Artikel ini akan memperkenalkan secara detail cara menggunakan Go 1.19 untuk mengimplementasikan alat perayapan templat situs otomatis yang disederhanakan guna membantu pengembang mengumpulkan data secara efisien.
Sebelum memulai, pastikan Anda telah menginstal Go 1.19 di sistem Anda. Anda dapat memeriksa versi Go dengan perintah berikut:
go version
Jika Anda belum menginstal Go, Anda dapat mendownloadnya dari Buka situs web resmi Unduh dan instal versi terbaru.
Alur kerja dasar perayap web adalah sebagai berikut:
Dalam bahasa Go, terdapat beberapa framework crawler yang populer, seperti:
Artikel ini terutama akan menggunakan Colly dan Goquery untuk perayapan web dan penguraian konten.
Kami akan merancang alat perayapan templat situs otomatis yang disederhanakan. Proses dasarnya adalah sebagai berikut:
Pertama, buat proyek Go baru:
mkdir go_scraper
cd go_scraper
go mod init go_scraper
Kemudian, instal Colly dan Goquery:
go get -u github.com/gocolly/colly
go get -u github.com/PuerkitoBio/goquery
Selanjutnya, tulis perayap sederhana untuk merayapi konten web:
package main
import (
"fmt"
"github.com/gocolly/colly"
)
func main() {
// 创建一个新的爬虫实例
c := colly.NewCollector()
// 设置请求时的回调函数
c.OnRequest(func(r *colly.Request) {
fmt.Println("Visiting", r.URL.String())
})
// 设置响应时的回调函数
c.OnResponse(func(r *colly.Response) {
fmt.Println("Visited", r.Request.URL)
fmt.Println("Response:", string(r.Body))
})
// 设置错误处理的回调函数
c.OnError(func(r *colly.Response, err error) {
fmt.Println("Error:", err)
})
// 设置HTML解析时的回调函数
c.OnHTML("title", func(e *colly.HTMLElement) {
fmt.Println("Title:", e.Text)
})
// 开始爬取
c.Visit("http://example.com")
}
Menjalankan kode di atas akan merayapi konten http://example.com dan mencetak judul halaman.
Untuk mengekstrak data yang diperlukan dari halaman web, kita perlu menggunakan Goquery untuk mengurai konten HTML. Contoh berikut menunjukkan cara menggunakan Goquery untuk mengekstrak link dan teks dari halaman web:
package main
import (
"fmt"
"github.com/gocolly/colly"
"github.com/PuerkitoBio/goquery"
)
func main() {
c := colly.NewCollector()
c.OnHTML("body", func(e *colly.HTMLElement) {
e.DOM.Find("a").Each(func(index int, item *goquery.Selection) {
link, _ := item.Attr("href")
text := item.Text()
fmt.Printf("Link #%d: %s (%s)n", index, text, link)
})
})
c.Visit("http://example.com")
}
Untuk meningkatkan efisiensi crawler, kita dapat menggunakan fungsi konkurensi Colly:
package main
import (
"fmt"
"github.com/gocolly/colly"
"github.com/PuerkitoBio/goquery"
"log"
"time"
)
func main() {
c := colly.NewCollector(
colly.Async(true), // 启用异步模式
)
c.Limit(&colly.LimitRule{
DomainGlob: "*",
Parallelism: 2, // 设置并发数
Delay: 2 * time.Second,
})
c.OnHTML("body", func(e *colly.HTMLElement) {
e.DOM.Find("a").Each(func(index int, item *goquery.Selection) {
link, _ := item.Attr("href")
text := item.Text()
fmt.Printf("Link #%d: %s (%s)n", index, text, link)
c.Visit(e.Request.AbsoluteURL(link))
})
})
c.OnRequest(func(r *colly.Request) {
fmt.Println("Visiting", r.URL.String())
})
c.OnError(func(r *colly.Response, err error) {
log.Println("Error:", err)
})
c.Visit("http://example.com")
c.Wait() // 等待所有异步任务完成
}
Simpan data yang diambil ke file atau database lokal. Berikut adalah file CSV sebagai contoh:
package main
import (
"encoding/csv"
"fmt"
"github.com/gocolly/colly"
"github.com/PuerkitoBio/goquery"
"log"
"os"
"time"
)
func main() {
file, err := os.Create("data.csv")
if err != nil {
log.Fatalf("could not create file: %v", err)
}
defer file.Close()
writer := csv.NewWriter(file)
defer writer.Flush()
c := colly.NewCollector(
colly.Async(true),
)
c.Limit(&colly.LimitRule{
DomainGlob: "*",
Parallelism: 2,
Delay: 2 * time.Second,
})
c.OnHTML("body", func(e *colly.HTMLElement) {
e.DOM.Find("a").Each(func(index int, item *goquery.Selection) {
link, _ := item.Attr("href")
text := item.Text()
fmt.Printf("Link #%d: %s (%s)n", index, text, link)
writer.Write([]string{text, link})
c.Visit(e.Request.AbsoluteURL(link))
})
})
c.OnRequest(func(r *colly.Request) {
fmt.Println("Visiting", r.URL.String())
})
c.OnError(func(r *colly.Response, err error) {
log.Println("Error:", err)
})
c.Visit("http://example.com")
c.Wait()
}
Untuk meningkatkan stabilitas crawler, kita perlu menangani kesalahan permintaan dan menerapkan mekanisme percobaan ulang:
package main
import (
"fmt"
"github.com/gocolly/colly"
"github.com/PuerkitoBio/goquery"
"log"
"os"
"time"
)
func main() {
file, err := os.Create("data.csv")
if err != nil {
log.Fatalf("could not create file: %v", err)
}
defer file.Close()
writer := csv.NewWriter(file)
defer writer.Flush()
c := colly.NewCollector(
colly.Async(true),
colly.MaxDepth(1),
)
c.Limit(&colly.LimitRule{
DomainGlob: "*",
Parallelism: 2,
Delay: 2 * time.Second,
})
c.OnHTML("body", func(e *colly.HTMLElement) {
e.DOM.Find("a").Each(func(index int, item *goquery.Selection) {
link, _ := item.Attr("href")
text := item.Text()
fmt.Printf("Link #%d: %s (%s)
n", index, text, link)
writer.Write([]string{text, link})
c.Visit(e.Request.AbsoluteURL(link))
})
})
c.OnRequest(func(r *colly.Request) {
fmt.Println("Visiting", r.URL.String())
})
c.OnError(func(r *colly.Response, err error) {
log.Println("Error:", err)
// 重试机制
if r.StatusCode == 0 || r.StatusCode >= 500 {
r.Request.Retry()
}
})
c.Visit("http://example.com")
c.Wait()
}
Contoh berikut menunjukkan cara mengikis judul dan tautan situs web berita dan menyimpannya ke file CSV:
package main
import (
"encoding/csv"
"fmt"
"github.com/gocolly/colly"
"log"
"os"
"time"
)
func main() {
file, err := os.Create("news.csv")
if err != nil {
log.Fatalf("could not create file: %v", err)
}
defer file.Close()
writer := csv.NewWriter(file)
defer writer.Flush()
writer.Write([]string{"Title", "Link"})
c := colly.NewCollector(
colly.Async(true),
)
c.Limit(&colly.LimitRule{
DomainGlob: "*",
Parallelism: 5,
Delay: 1 * time.Second,
})
c.OnHTML(".news-title", func(e *colly.HTMLElement) {
title := e.Text
link := e.ChildAttr("a", "href")
writer.Write([]string{title, e.Request.AbsoluteURL(link)})
fmt.Printf("Title: %snLink: %sn", title, e.Request.AbsoluteURL(link))
})
c.OnRequest(func(r *colly.Request) {
fmt.Println("Visiting", r.URL.String())
})
c.OnError(func(r *colly.Response, err error) {
log.Println("Error:", err)
if r.StatusCode == 0 || r.StatusCode >= 500 {
r.Request.Retry()
}
})
c.Visit("http://example-news-site.com")
c.Wait()
}
Agar tidak diblokir oleh website target, Anda dapat menggunakan proxy:
c.SetProxy("http://proxyserver:port")
Berpura-pura menjadi browser yang berbeda dengan mengatur agen pengguna:
c.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
Anda dapat menggunakan perpustakaan ekstensi Colly Colly-Redis untuk mengimplementasikan crawler terdistribusi:
import (
"github.com/gocolly/redisstorage"
)
func main() {
c := colly.NewCollector()
redisStorage := &redisstorage.Storage{
Address: "localhost:6379",
Password: "",
DB: 0,
Prefix: "colly",
}
c.SetStorage(redisStorage)
}
Untuk halaman web dinamis, Anda dapat menggunakan browser headless seperti chromedp:
import (
"context"
"github.com/chromedp/chromedp"
)
func main() {
ctx, cancel := chromedp.NewContext(context.Background())
defer cancel()
var res string
err := chromedp.Run(ctx,
chromedp.Navigate("http://example.com"),
chromedp.WaitVisible(`#some-element`),
chromedp.InnerHTML(`#some-element`, &res),
)
if err != nil {
log.Fatal(err)
}
fmt.Println(res)
}
Melalui pengenalan mendetail di artikel ini, kita telah mempelajari cara menggunakan Go 1.19 untuk mengimplementasikan alat perayapan templat situs otomatis yang disederhanakan. Kami memulai dari proses desain perayap dasar dan secara bertahap beralih ke aspek-aspek utama seperti penguraian HTML, pemrosesan bersamaan, penyimpanan data, dan penanganan kesalahan, serta mendemonstrasikan cara merayapi dan memproses data halaman web melalui contoh kode spesifik.
Kemampuan pemrosesan konkurensi bahasa Go yang kuat dan perpustakaan pihak ketiga yang kaya menjadikannya pilihan ideal untuk membangun perayap web yang efisien dan stabil. Melalui optimalisasi dan perluasan berkelanjutan, fungsi crawler yang lebih kompleks dan canggih dapat dicapai untuk memberikan solusi bagi berbagai kebutuhan pengumpulan data.
Saya harap artikel ini dapat memberi Anda referensi berharga untuk mengimplementasikan web crawler dalam bahasa Go dan menginspirasi Anda untuk melakukan lebih banyak eksplorasi dan inovasi di bidang ini.