Når et API bare ikke vil kutte det, kan du alltid ty til å skrape HTML, og Rust kan hjelpe deg.

Nettskraping er en populær teknikk for å samle inn store mengder data fra nettsider raskt og effektivt. I fravær av et API, kan nettskraping være den nest beste tilnærmingen.

Rustens hastighet og minnesikkerhet gjør språket ideelt for å bygge nettskraper. Rust er hjemsted for mange kraftige parsing- og datautvinningsbiblioteker, og dens robuste feilhåndteringsfunksjoner er nyttige for effektiv og pålitelig nettdatainnsamling.

Nettskraping i rust

Mange populære biblioteker støtter nettskraping i Rust, inkludert reqwest, skrape, plukke ut, og html5 noensinne. De fleste Rust-utviklere kombinerer funksjonalitet fra reqwest og scraper for deres web-skraping.

Reqwest-biblioteket gir funksjonalitet for å lage HTTP-forespørsler til webservere. Reqwest er bygget på Rusts innebygde hyper kasse mens den leverer et API på høyt nivå for standard HTTP-funksjoner.

Scraper er et kraftig nettskrapingsbibliotek som analyserer HTML- og XML-dokumenter og trekker ut data ved hjelp av CSS-velgere og XPath-uttrykk.

Etter å ha opprettet et nytt Rust-prosjekt med last ny kommando, legg til reqwest og skrape kasser til avhengighetsdelen av din cargo.toml fil:

[avhengigheter]
reqwest = {versjon = "0.11", funksjoner = ["blokkerer"]}
skrape = "0.12.0"

du vil bruke reqwest til sende HTTP-forespørsler og skrape for parsing.

Hente nettsider med Reqwest

Du sender en forespørsel om innholdet til en nettside før du analyserer den for å hente spesifikke data.

Du kan sende en GET-forespørsel og hente HTML-kilden til en side ved å bruke tekst funksjon på funksjonen til reqwest bibliotek:

fnretrieve_html() -> String {
la svar = får(" https://news.ycombinator.com").unwrap().text().unwrap();
komme tilbake respons;
}

De funksjonen sender forespørselen til nettsiden, og tekst funksjonen returnerer teksten til HTML.

Parsing HTML med Scraper

De retrieve_html funksjonen returnerer teksten til HTML, og du må analysere HTML-teksten for å hente de spesifikke dataene du trenger.

Scraper gir funksjonalitet for å samhandle med HTML i Html og Velger moduler. De Html modulen gir funksjonalitet for å analysere dokumentet, og Velger modulen gir funksjonalitet for å velge spesifikke elementer fra HTML.

Slik kan du hente alle titlene på en side:

bruk scraper::{Html, Selector};

fnhoved-() {
la respons = reqwest:: blokkering:: get(
" https://news.ycombinator.com/").unwrap().text().unwrap();

// analyser HTML-dokumentet
la doc_body = Html:: parse_document(&response);

// velg elementene med tittellinjeklassen
la title = Selector:: parse(".titleline").unwrap();

til tittel i doc_body.select(&title) {
la titles = title.text().collect::<Vec<_>>();
println!("{}", titler[0])
}
}

De parse_document funksjonen til Html modulen analyserer HTML-teksten, og Parse funksjonen til Velger modulen velger elementene med den angitte CSS-velgeren (i dette tilfellet tittellinje klasse).

De til loop går gjennom disse elementene og skriver ut den første tekstblokken fra hver.

Her er resultatet av operasjonen:

Velge attributter med skraper

For å velge en attributtverdi, hent de nødvendige elementene som før og bruk attr metode for tag-verdiforekomsten:

bruk reqwest:: blokkering:: få;
bruk scraper::{Html, Selector};

fnhoved-() {
la svar = får(" https://news.ycombinator.com").unwrap().text().unwrap();
la html_doc = Html:: parse_document(&response);
la class_selector = Selector:: parse(".titleline").unwrap();

til element i html_doc.select(&class_selector) {
la link_selector = Selector:: parse("en").unwrap();

til link i element.select(&link_selector) {
hvislaNoen(href) = link.value().attr("href") {
println!("{}", href);
}
}
}
}

Etter å ha valgt elementer med tittellinje klasse ved hjelp av analysere funksjon, den til løkke krysser dem. Inne i loopen henter koden deretter en tagger og velger href attributt med attr funksjon.

De hoved- funksjonen skriver ut disse koblingene, med et resultat som dette:

Du kan bygge sofistikerte webapplikasjoner i rust

Nylig har Rust blitt tatt i bruk som et språk for webutvikling fra front-end til server-side apputvikling.

Du kan utnytte webmontering til å bygge fullstack-webapplikasjoner med biblioteker som Yew og Percy eller bygge serverside applikasjoner med Actix, Rocket og en rekke biblioteker i Rust-økosystemet som gir funksjonalitet for å bygge web applikasjoner.