Webscraping, ook wel webgegevensextractie genoemd, is een geautomatiseerde methode om gegevens of inhoud van webpagina's te extraheren.
Webschrapers automatiseren gegevensextractie zonder menselijke tussenkomst. Een scraper krijgt toegang tot een webpagina door HTTP-verzoeken te verzenden, net zoals een webbrowser dat doet. In plaats van de HTML weer te geven die het ophaalt, verwerkt het het echter volgens uw instructies en slaat het het resultaat op.
Webschrapers zijn handig voor het ophalen van gegevens van websites die geen API's bieden. Ze zijn populair op gebieden als datawetenschap, cyberbeveiliging, frontend- en backend-ontwikkeling.
Webscraping in Go
In Go zijn er verschillende webscraping-pakketten. De populaire zijn onder meer goquery, Colly en ChromeDP.
ChromeDP is een seleniumachtig webstuurprogrammapakket. Het ondersteunt het Chrome-protocol voor ontwikkelaarstools in Go zonder afhankelijkheden.
Colly is een webscraping-specifieke bibliotheek die is gebouwd met goquery. Maar goquery is de snellere optie voor het schrapen van websites in Go.
Wat is goquery?
De CSS-bibliotheek, jQuery, hielp inspireren goquery. Het is een Go-bibliotheek op basis van de net/html pakket, dat een HTML5-compatibele tokenizer en parser implementeert. Het gebruikt ook het Cascadia-pakket, dat CSS-selectors implementeert voor gebruik met de parser die wordt geleverd door net/html.
Goquery installeren
Voer de onderstaande opdracht uit in uw terminal om goquery te installeren. Als je fouten tegenkomt, probeer dan je Go-versie bij te werken.
Gaan download github.com/PuerkitoBio/goquery
Het webschrapproces
U kunt het algehele schraapproces in drie kleinere taken verdelen:
- HTTP-verzoeken maken.
- Selectors en locators gebruiken om de benodigde gegevens te krijgen.
- Opslaan van gegevens in een database of datastructuren voor verdere verwerking.
HTTP-verzoeken maken in Go
U kunt HTTP-verzoeken verzenden met behulp van de net/http pakket, dat de Go-standaardbibliotheek bevat.
pakket hoofd
importeren "net/http"
importeren "loggen"
importeren "fmt"funchoofd() {
webUrl := "https://news.ycombinator.com/"
reactie, fout:= http. Ophalen (webUrl)
indien fout != nul {
logboek. Fataal (fout)
} andersindien antwoord. StatusCode == 200 {
fmt. Println("We kunnen dit schrapen")
} anders {
logboek. Fatalln("Schraap dit niet")
}
}
http. Krijgen retourneert een antwoordtekst en een fout. antwoord. Status code is de aanvraag-antwoordstatuscode.
Bij het maken van HTTP-verzoeken, als de reactie statuscode is 200 u kunt doorgaan met het schrapen van de website.
De vereiste gegevens verkrijgen met behulp van goquery
HTML van de website verkrijgen
Eerst moet u de gewone HTML uit het antwoord ontleden (reactie.lichaam) om een compleet documentobject te krijgen dat de webpagina vertegenwoordigt:
document, err := goquery. NewDocumentFromReader (respons. Lichaam)
indien fout != nul {
logboek. Fataal (fout)
}
U kunt nu het documentobject gebruiken om toegang te krijgen tot de structuur en inhoud van de webpagina.
Vereiste elementen uit de HTML selecteren
U moet de webpagina inspecteren om de structuur te controleren van de gegevens die u moet extraheren. Dit zal u helpen bij het maken van een selector om toegang te krijgen.
Met behulp van selectors en locators kunt u de benodigde HTML extraheren met de Vind methode van het documentobject.
De Vind methode heeft een CSS-selector nodig om het element te lokaliseren dat de gegevens bevat die u nodig hebt:
document. Find("tr.athing")
De bovenstaande code retourneert alleen het eerste HTML-element dat overeenkomt met de selector, of een lege lijst als er helemaal geen overeenkomst was.
Meerdere elementen uit HTML selecteren
Meestal wilt u alle HTML-elementen ophalen die overeenkomen met uw selector.
U kunt alle overeenkomende elementen in de HTML selecteren met behulp van de Elk methode van de waarde die Vind() geeft terug. De Elk methode neemt een functie in met twee parameters: een index en een selector van het type *goquery. Selectie.
document. Find("tr.athing").Elke(func(inhoudsopgave int, selector *goquery. Selectie) {
/* Proceskiezer hier */
})
In de hoofdtekst van de functie kunt u de specifieke gegevens die u wilt uit de HTML selecteren. In dit geval heb je de links en titels van elk bericht op de paginalijsten nodig. Gebruik de Vind methode van de selectorparameter om de set elementen te verfijnen en tekst of attribuutwaarden te extraheren.
document. Find("tr.athing").Elke(func(inhoudsopgave int, selector *goquery. Selectie) {
titel := kiezer. Find("td.title").Text()
link, gevonden := selector. Find("a.titlelink").Attr("href")
})
De bovenstaande code roept de Tekst methode van het resultaat van kiezer. Vind om de inhoud van een tabelcel te extraheren. Als u attributen selecteert, zoals link- en afbeeldings-URL's, moet u de Attr methode. Deze methode retourneert ook een waarde die aangeeft of het attribuut überhaupt bestaat.
Het proces is hetzelfde voor het selecteren van elementen en attributen van een webpagina.
De Vind methode is zeer krachtig, waardoor een breed scala aan bewerkingen mogelijk is om HTML-elementen te selecteren en te lokaliseren. U kunt deze onderzoeken in de goquery-documentatie.
De geschraapte gegevens opslaan
Het link-attribuut en de titel zijn tekenreeksen die u aan variabelen kunt toewijzen. In echte scenario's slaat u op in een database of een gegevensstructuur voor manipulatie. Vaak zal een simpele custom struct voldoende zijn.
Maak een structuur met velden titel en link en een stukje structs om het struct-type vast te houden.
type Informatie structureren {
koppeling draad
titel draad
}
info := maken([]Informatie, 0)
Nadat u de struct en het segment hebt gemaakt, vult u in de hoofdtekst van de documentmethodefunctie het segment in de functie die u doorgeeft aan de methode Zoeken. Gebruik het struct-type om nieuwe gegevensstructuren te instantiëren, die elk één resultaat bevatten.
info = toevoegen(info, informatie{
titel: titel,
link: link,
})
Dit voegt soorten toe Informatie(de structuur) naar de info(de slice) van waaruit u de gegevens naar believen kunt manipuleren.
Het afdrukken van het segment laat zien dat u de website met succes hebt geschraapt en het segment hebt ingevuld.
fmt. Println (info)
Het is redelijk om de geschraapte gegevens in een lokale cache op te slaan, zodat u de server van de webpagina niet meer raakt dan nodig is. Dit zal niet alleen het verkeer verminderen, maar ook uw app versnellen, omdat het sneller is om lokale gegevens op te halen dan om verzoeken te doen en websites te schrapen.
Er zijn veel databasepakketten in Go die u zou kunnen gebruiken om de gegevens op te slaan. De database/sql pakket ondersteunt SQL-databases. Er zijn ook NoSQL-databaseclients zoals de MongoDB Go-stuurprogramma, en serverloze databases zoals FaunaDB met behulp van de FaunaDB-stuurprogramma.
De essentie van webscraping in Go
Als u gegevens van een website probeert te schrapen, is goquery een uitstekende plek om te beginnen. Maar het is een krachtig pakket dat meer kan dan alleen webschrapen. U kunt meer informatie vinden over de functionaliteit in de officiële projectdocumentatie.
Webscraping is een belangrijke vaardigheid op verschillende technologiegebieden en het zal van pas komen tijdens veel van uw projecten.
Objectgeoriënteerde programmeerconcepten implementeren in Go
Lees volgende
Gerelateerde onderwerpen
- Programmeren
- Webontwikkeling
- Programmeren
Over de auteur
Goodness is een technisch schrijver, backend-ontwikkelaar en data-analist, die verschillende technologische onderwerpen vereenvoudigt terwijl hij dit fascinerende veld verkent.
Abonneer op onze nieuwsbrief
Word lid van onze nieuwsbrief voor technische tips, recensies, gratis e-boeken en exclusieve deals!
Klik hier om je te abonneren