2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Web Scraper on työkalu, joka poimii tiedot automaattisesti verkkosivustoilta. Niitä käytetään laajasti tiedonkeruussa, hakukoneoptimoinnissa, markkinatutkimuksessa ja muilla aloilla. Tässä artikkelissa esitellään yksityiskohtaisesti, miten Go 1.19:n avulla voidaan ottaa käyttöön yksinkertaistettu automatisoitu sivustomallien indeksointityökalu, joka auttaa kehittäjiä keräämään tietoja tehokkaasti.
Ennen kuin aloitat, varmista, että järjestelmääsi on asennettu Go 1.19. Voit tarkistaa Go-version seuraavalla komennolla:
go version
Jos et ole vielä asentanut Goa, voit ladata sen osoitteesta Mene viralliselle verkkosivustolle Lataa ja asenna uusin versio.
Verkkoindeksointirobotin perustyönkulku on seuraava:
Go-kielellä on useita suosittuja indeksointikehyksiä, kuten:
Tämä artikkeli käyttää pääasiassa Collya ja Goquerya verkkoindeksointiin ja sisällön jäsentämiseen.
Suunnittelemme yksinkertaistetun automatisoidun sivustomallin indeksointityökalun. Perusprosessi on seuraava:
Luo ensin uusi Go-projekti:
mkdir go_scraper
cd go_scraper
go mod init go_scraper
Asenna sitten Colly ja Goquery:
go get -u github.com/gocolly/colly
go get -u github.com/PuerkitoBio/goquery
Kirjoita seuraavaksi yksinkertainen indeksointirobotti verkkosisällön indeksoimiseksi:
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")
}
Yllä olevan koodin suorittaminen indeksoi osoitteen http://example.com sisällön ja tulostaa sivun otsikon.
Jotta voimme poimia tarvittavat tiedot verkkosivulta, meidän on käytettävä Goquerya HTML-sisällön jäsentämiseen. Seuraava esimerkki näyttää, kuinka Goquerya käytetään linkkien ja tekstin poimimiseen verkkosivulta:
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")
}
Indeksointirobotin tehokkuuden parantamiseksi voimme käyttää Collyn samanaikaisuusfunktiota:
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() // 等待所有异步任务完成
}
Tallenna kaapatut tiedot paikalliseen tiedostoon tai tietokantaan. Tässä on esimerkkinä CSV-tiedosto:
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()
}
Indeksointirobotin vakauden parantamiseksi meidän on käsiteltävä pyyntövirheet ja otettava käyttöön uudelleenyritysmekanismi:
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()
}
Seuraava esimerkki näyttää, kuinka uutissivuston otsikot ja linkit kaavitaan ja tallennetaan CSV-tiedostoon:
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()
}
Jotta kohdesivusto ei estä sinua, voit käyttää välityspalvelinta:
c.SetProxy("http://proxyserver:port")
Teeskentele olevasi eri selain asettamalla käyttäjäagentti:
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"
Voit käyttää Collyn laajennuskirjastoa Colly-Redis toteuttaaksesi hajautettuja indeksointirobotteja:
import (
"github.com/gocolly/redisstorage"
)
func main() {
c := colly.NewCollector()
redisStorage := &redisstorage.Storage{
Address: "localhost:6379",
Password: "",
DB: 0,
Prefix: "colly",
}
c.SetStorage(redisStorage)
}
Dynaamisille verkkosivuille voit käyttää päätöntä selainta, kuten chromedp:tä:
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)
}
Tämän artikkelin yksityiskohtaisen esittelyn kautta olemme oppineet käyttämään Go 1.19:ää yksinkertaistetun automatisoidun sivustomallin indeksointityökalun toteuttamiseen. Aloitimme indeksointirobotin perussuunnitteluprosessista ja siirryimme vähitellen tärkeimpiin osiin, kuten HTML-jäsennykseen, samanaikaiseen käsittelyyn, tietojen tallentamiseen ja virheiden käsittelyyn, ja osoitimme, kuinka verkkosivujen tietoja indeksoidaan ja käsitellään tiettyjen koodiesimerkkien avulla.
Go-kielen tehokkaat samanaikaisuuden käsittelyominaisuudet ja monipuoliset kolmannen osapuolen kirjastot tekevät siitä ihanteellisen valinnan tehokkaiden ja vakaiden verkkoindeksointirobottien rakentamiseen. Jatkuvan optimoinnin ja laajentamisen avulla voidaan saavuttaa monimutkaisempia ja kehittyneempiä indeksointitoimintoja, jotka tarjoavat ratkaisuja erilaisiin tiedonkeruutarpeisiin.
Toivon, että tämä artikkeli voi tarjota sinulle arvokasta tietoa indeksointirobottien käyttöönotosta Go-kielellä ja innostaa sinua tutkimaan ja kehittämään enemmän tällä alalla.