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å få funksjonen til reqwest bibliotek:
fnretrieve_html() -> String {
la svar = får(" https://news.ycombinator.com").unwrap().text().unwrap();
komme tilbake respons;
}
De få 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.