När ett API bara inte klipper det kan du alltid ta till att skrapa HTML, och Rust kan hjälpa dig.

Webbskrapning är en populär teknik för att snabbt och effektivt samla in stora mängder data från webbsidor. I avsaknad av ett API kan webbskrapning vara det näst bästa tillvägagångssättet.

Rosts hastighet och minnessäkerhet gör språket idealiskt för att bygga webbskrapor. Rust är hem för många kraftfulla parsnings- och dataextraktionsbibliotek, och dess robusta felhanteringsfunktioner är praktiska för effektiv och tillförlitlig webbdatainsamling.

Webskrapning i rost

Många populära bibliotek stöder webbskrapning i Rust, inklusive reqwest, skrapa, Välj, och html5 någonsin. De flesta Rust-utvecklare kombinerar funktionalitet från reqwest och scraper för sin webbskrapning.

Reqwest-biblioteket tillhandahåller funktionalitet för att göra HTTP-förfrågningar till webbservrar. Reqwest är byggt på Rusts inbyggda hyper låda samtidigt som den levererar ett högnivå-API för vanliga HTTP-funktioner.

Scraper är ett kraftfullt webbskrapningsbibliotek som analyserar HTML- och XML-dokument och

extraherar data med hjälp av CSS-väljare och XPath-uttryck.

Efter att ha skapat ett nytt Rust-projekt med last ny kommando, lägg till reqwest och skrapa lådor till beroendesektionen i din cargo.toml fil:

[beroenden]
reqwest = {version = "0.11", funktioner = ["blockering"]}
skrapa = "0.12.0"

Du kommer att använda reqwest till skicka HTTP-förfrågningar och skrapa för att analysera.

Hämta webbsidor med Reqwest

Du skickar en begäran om en webbsidas innehåll innan du analyserar den för att hämta specifik data.

Du kan skicka en GET-förfrågan och hämta HTML-källan för en sida med hjälp av text funktion på skaffa sig funktion av reqwest bibliotek:

fnretrieve_html() -> Sträng {
låta svar = få(" https://news.ycombinator.com").unwrap().text().unwrap();
lämna tillbaka svar;
}

De skaffa sig funktionen skickar begäran till webbsidan och text funktion returnerar texten i HTML.

Analysera HTML med skrapa

De retrieve_html funktion returnerar HTML-texten och du måste analysera HTML-texten för att hämta den specifika data du behöver.

Scraper tillhandahåller funktionalitet för att interagera med HTML i Html och Väljare moduler. De Html modulen ger funktionalitet för att tolka dokumentet och Väljare modulen ger funktionalitet för att välja specifika element från HTML.

Så här kan du hämta alla titlar på en sida:

använda sig av scraper::{Html, Selector};

fnhuvud() {
låta respons = reqwest:: blocking:: get(
" https://news.ycombinator.com/").unwrap().text().unwrap();

// analysera HTML-dokumentet
låta doc_body = Html:: parse_document(&response);

// välj elementen med titellinjeklass
låta title = Selector:: parse(".titleline").packa upp();

för titel i doc_body.select(&title) {
låta titles = title.text().collect::<Vec<_>>();
println!("{}", titlar[0])
}
}

De parse_document funktion av Html modulen analyserar HTML-texten och Analysera funktion av Väljare modulen väljer elementen med den angivna CSS-väljaren (i det här fallet titellinje klass).

De för loop går igenom dessa element och skriver ut det första textblocket från varje.

Här är resultatet av operationen:

Välja attribut med skrapa

För att välja ett attributvärde, hämta de nödvändiga elementen som tidigare och använd attr metod för taggvärdeinstansen:

använda sig av reqwest:: blocking:: get;
använda sig av scraper::{Html, Selector};

fnhuvud() {
låta svar = få(" https://news.ycombinator.com").unwrap().text().unwrap();
låta html_doc = Html:: parse_document(&response);
låta class_selector = Selector:: parse(".titleline").packa upp();

för element i html_doc.select(&class_selector) {
låta link_selector = Selector:: parse("a").packa upp();

för länk i element.select(&link_selector) {
omlåtaNågra(href) = link.value().attr("href") {
println!("{}", href);
}
}
}
}

Efter att ha valt element med titellinje klass med hjälp av analysera funktion, den för slingan korsar dem. Inne i slingan hämtas sedan koden a taggar och väljer href attribut med attr fungera.

De huvud funktion skriver ut dessa länkar, med ett resultat som detta:

Du kan bygga sofistikerade webbapplikationer i Rust

Nyligen har Rust anammats som ett språk för webbutveckling från front-end till server-side apputveckling.

Du kan använda webbsammansättning för att bygga full-stack webbapplikationer med bibliotek som Yew och Percy eller bygga server-side applikationer med Actix, Rocket och mängden bibliotek i Rust-ekosystemet som tillhandahåller funktionalitet för att bygga webb applikationer.