Webskrabning, også kendt som webdataudtrækning, er en automatiseret metode til at udtrække data eller indhold fra websider.
Webskrabere automatiserer dataudtræk uden menneskelig indblanding. En skraber får adgang til en webside ved at sende HTTP-anmodninger, ligesom en webbrowser gør. Men i stedet for at vise den HTML, den henter, behandler den den i henhold til dine instruktioner og gemmer resultatet.
Webskrabere er praktiske til at hente data fra websteder, der ikke leverer API'er. De er populære inden for områder som datavidenskab, cybersikkerhed, frontend og backend-udvikling.
Webskrabning på vej
I Go er der forskellige web-skrabepakker. De populære inkluderer goquery, Colly og ChromeDP.
ChromeDP er en selenlignende webdriverpakke. Det understøtter Chrome-udviklerværktøjsprotokollen i Go uden afhængigheder.
Colly er et webskrabningsspecifikt bibliotek bygget ved hjælp af goquery. Men goquery er den hurtigere mulighed for at skrabe websteder i Go.
Hvad er goquery?
CSS-biblioteket, jQuery, hjalp med at inspirere
goquery. Det er et Go-bibliotek baseret på net/html pakke, som implementerer en HTML5-kompatibel tokenizer og parser. Den bruger også Cascadia-pakken, som implementerer CSS-vælgere til brug med parseren leveret af net/html.Installation af goquery
Kør kommandoen nedenfor i din terminal for at installere goquery. Hvis du støder på fejl, kan du prøve at opdatere din Go-version.
gå få github.com/PuerkitoBio/goquery
Web-skrabningsprocessen
Du kan opdele den overordnede skrabeproces i tre mindre opgaver:
- Fremstilling af HTTP-anmodninger.
- Brug af vælgere og locatorer for at få de nødvendige data.
- Lagring af data i en database eller datastrukturer til videre behandling.
Fremstilling af HTTP-anmodninger i Go
Du kan sende HTTP-anmodninger ved hjælp af net/http pakke, som Go-standardbiblioteket inkluderer.
pakke vigtigste
importere "net/http"
importere "log"
importere "fmt"funcvigtigste() {
weburl := "https://news.ycombinator.com/"
svar, err:= http. Hent (webURl)
hvis fejl!= nul {
log. Fatalln (fejl)
} andethvis respons. Statuskode == 200 {
fmt. Println("Vi kan skrabe dette")
} andet {
log. Fatalln("Rab ikke dette")
}
}
http. Få returnerer en svartekst og en fejl. respons. Statuskode er statuskoden for anmodning-svar.
Ved at lave HTTP-anmodninger, hvis svarstatuskode er 200 du kan fortsætte med at skrabe hjemmesiden.
Få de nødvendige data ved hjælp af goquery
Få hjemmesidens HTML
Først skal du parse den almindelige HTML fra svaret (respons.body) for at få et komplet dokumentobjekt, der repræsenterer websiden:
dokument, fejl := goquery. NewDocumentFromReader (svar. Legeme)
hvis fejl!= nul {
log. Fatalln (fejl)
}
Du kan nu bruge dokumentobjektet til at få adgang til den struktur og det indhold, som websiden indeholder.
Valg af nødvendige elementer fra HTML
Du bliver nødt til at inspicere websiden for at kontrollere strukturen af de data, du skal udtrække. Dette vil hjælpe dig med at konstruere en vælger for at få adgang til den.
Ved hjælp af vælgere og lokaliseringsværktøjer kan du udtrække den HTML, du har brug for, ved hjælp af Find dokumentobjektets metode.
Det Find metoden tager en CSS-vælger for at finde det element, der indeholder de data, du har brug for:
dokument. Find("tr.athing")
Ovenstående kode returnerer kun det første HTML-element, der matcher vælgeren, eller en tom liste, hvis der slet ikke var et match.
Valg af flere elementer fra HTML
Det meste af tiden vil du gerne hente alle de HTML-elementer, der matcher din vælger.
Du kan vælge alle matchende elementer i HTML ved hjælp af Hver metode til værdien, der Find() vender tilbage. Det Hver metoden indtager en funktion med to parametre: et indeks og en vælger af typen *goquery. Udvælgelse.
dokument. Find("tr.athing").Hver(func(indeks int, vælger *goquery. Udvælgelse) {
/* Procesvælger her */
})
I funktionsteksten kan du vælge de specifikke data, du ønsker fra HTML-koden. I dette tilfælde skal du bruge links og titler på hvert indlæg på siden. Brug Find metode for vælgerparameteren til at indsnævre sættet af elementer og udtrække tekst eller attributværdier.
dokument. Find("tr.athing").Hver(func(indeks int, vælger *goquery. Udvælgelse) {
titel := vælger. Find("td.title").Tekst()
link, fundet := vælger. Find("a.titlelink").Attr("href")
})
Koden ovenfor kalder Tekst metode til resultatet fra vælger. Find at udtrække indholdet af en tabelcelle. Valg af attributter - som link- og billed-URL'er - kræver, at du bruger Attr metode. Denne metode returnerer også en værdi, der angiver, om attributten overhovedet eksisterer.
Processen er den samme for at vælge hvilke elementer og egenskaber fra en webside.
Det Find metoden er meget kraftfuld, hvilket giver en bred vifte af operationer til at vælge og lokalisere HTML-elementer. Du kan udforske disse i goquery-dokumentationen.
Gem de skrabet data
Link-attributten og titlen er strenge, som du kan tildele variabler. I virkelige scenarier vil du gemme til en database eller en datastruktur til manipulation. Ofte vil en simpel brugerdefineret struktur være tilstrækkelig.
Opret en struktur med felter titel og link og et udsnit af structs til at holde struct-typen.
type Information struktur {
link snor
titel snor
}
info := lave([]Information, 0)
Når du har oprettet strukturen og udsnittet, i brødteksten af dokumentmetodefunktionen, skal du udfylde udsnittet i den funktion, du videregiver til metoden Find. Brug struct-typen til at instansiere nye datastrukturer, der hver indeholder ét resultat.
info = Tilføj(info, information{
titel: titel,
link: link,
})
Dette tilføjer typer af Information(strukturen) til info(udsnittet), hvorfra du kan manipulere dataene, som du vil.
Udskrivning af udsnittet viser, at du med succes har skrabet webstedet og udfyldt udsnittet.
fmt. Println (info)
Det er rimeligt at gemme de skrabet data i en lokal cache, så du ikke rammer serveren på websiden mere, end du behøver. Dette vil ikke kun reducere trafikken, men fremskynde din app, da det er hurtigere at hente lokale data, end det er at lave anmodninger og skrabe websteder.
Der er mange databasepakker i Go, som du kan bruge til at gemme dataene. Det database/sql pakken understøtter SQL-databaser. Der er også NoSQL-databaseklienter som MongoDB Go driver, og serverløse databaser som FaunaDB ved hjælp af FaunaDB driver.
Essensen af webskrabning i farten
Hvis du forsøger at skrabe data fra et websted, er goquery et glimrende sted at begynde. Men det er en kraftfuld pakke, der kan mere end blot web-skrabning. Du kan finde ud af mere om dens funktionalitet i den officielle projektdokumentation.
Webskrabning er en vigtig færdighed på tværs af forskellige teknologiområder, og det vil være nyttigt under mange af dine projekter.
Sådan implementeres objektorienterede programmeringskoncepter i Go
Læs Næste
Relaterede emner
- Programmering
- Web-udvikling
- Programmering
Om forfatteren

Goodness er en teknisk forfatter, backend-udvikler og dataanalytiker, der forenkler forskellige teknologiemner, mens han udforsker dette fascinerende felt.
Abonner på vores nyhedsbrev
Tilmeld dig vores nyhedsbrev for tekniske tips, anmeldelser, gratis e-bøger og eksklusive tilbud!
Klik her for at abonnere