Nettskraping med Java forklart i enklere vilkår

Nettskraping lar deg effektivt samle store mengder data fra internett på en veldig rask måte, og er spesielt nyttig i tilfeller der nettsteder ikke eksponerer dataene sine på en strukturert måte gjennom bruk av Application Programming Interfaces (API).

Tenk deg for eksempel at du lager et program som sammenligner prisene på varer på tvers av e-handelssider. Hvordan ville du gått frem til dette? En måte er å manuelt sjekke prisen på varer selv på tvers av alle nettstedene og registrere funnene dine. Dette er imidlertid ikke en smart måte ettersom det er tusenvis av produkter på e-handelsplattformer, og det vil ta deg evigheter å trekke ut relevant data.

En bedre måte å gjøre dette på er gjennom nettskropping. Nettskraping er prosessen med å automatisk trekke ut data fra nettsider og nettsteder ved bruk av programvare.

Programvareskript, referert til som nettskrapere, brukes for å få tilgang til nettsider og hente data fra nettsidene. Dataene som hentes, vanligvis i en ustrukturert form, kan deretter analyseres og lagres på en strukturert måte som er meningsfull for brukerne.

Nettskraping er svært verdifullt ved datautvinning, da det gir tilgang til et vell av data og muliggjør automatisering, slik at du kan planlegge at nettskrapingskriptet skal kjøre til bestemte tider eller som svar på visse triggere. Nettskraping lar deg også få sanntidsoppdateringer og gjør det enkelt å gjennomføre markedsundersøkelser.

Mange bedrifter og selskaper er avhengige av nettskraping for å trekke ut data for analyse. Bedrifter som spesialiserer seg på menneskelige ressurser, e-handel, finans, eiendom, reiser, sosiale medier og forskning bruker nettskraping for å trekke ut relevante data fra nettsteder.

Google bruker selv nettskraping for å indeksere nettsteder på internett slik at det kan gi relevante søkeresultater til brukerne.

Det er imidlertid viktig å utvise forsiktighet ved nettskraping. Selv om skraping av offentlig tilgjengelig data ikke er ulovlig, tillater noen nettsteder ikke skraping. Dette kan være fordi de har sensitiv brukerinformasjon, deres vilkår for bruk eksplisitt forbyr nettskrapning, eller de beskytter åndsverk.

I tillegg tillater noen nettsteder ikke nettskraping, da det kan overbelaste nettstedets server og føre til økte båndbreddekostnader, spesielt når nettskraping gjøres i stor skala.

For å sjekke om et nettsted kan skrotes, legg til robots.txt til nettstedets URL. robots.txt brukes til å indikere for roboter hvilke deler av nettstedet som kan skrapes. For eksempel, for å sjekke om du kan skrape Google, gå til google.com/robots.txt

User-agent: * refererer til alle roboter eller programvareskript og crawlere. Disallow brukes til å fortelle roboter at de ikke har tilgang til noen URL under en katalog, for eksempel /search. Tillat indikerer kataloger hvor de kan få tilgang til URL-er fra.

Et eksempel på et nettsted som ikke tillater skraping er LinkedIn. For å sjekke om du kan skrape LinkedIn, gå til linkedin.com/robots.txt

Som du kan se, har du ikke lov til å skrape LinkedIn uten deres tillatelse. Sjekk alltid om et nettsted tillater skraping for å unngå juridiske problemer.

Hvorfor Java er et egnet språk for nettskraping

Mens du kan lage en nettskrape med en rekke programmeringsspråk, er Java spesielt ideell for jobben av flere grunner. For det første har Java et rikt økosystem og et stort fellesskap og tilbyr en rekke nettskrapebiblioteker som JSoup, WebMagic og HTMLUnit, som gjør det enkelt å skrive nettskrapere.

  Slik viser du batteriprosent på iPhone

Det gir også HTML-parsing-biblioteker for å forenkle prosessen med å trekke ut data fra HTML-dokumenter og nettverksbiblioteker som HttpURLConnection for å sende forespørsler til forskjellige nettadresser.

Javas sterke støtte for samtidighet og multithreading er også fordelaktig ved nettskraping, da det muliggjør parallell behandling og håndtering av nettskrapingsoppgaver med flere forespørsler, slik at du kan skrape flere sider samtidig. Siden skalerbarhet er en nøkkelstyrke til Java, kan du komfortabelt skrape nettsteder i massiv skala ved å bruke en nettskraper skrevet i Java.

Javas støtte på tvers av plattformer kommer også godt med da den lar deg skrive en nettskraper og kjøre den i et hvilket som helst system som har en kompatibel Java Virtual Machine. Derfor kan du skrive en nettskraper i ett operativsystem eller enhet og kjøre den i et annet operativsystem uten å måtte endre nettskraperen.

Java kan også brukes med hodeløse nettlesere som Headless Chrome, HTML Unit, Headless Firefox og PhantomJs, blant andre. En hodeløs nettleser er en nettleser uten et grafisk brukergrensesnitt. Hodeløse nettlesere kan simulere brukerinteraksjoner og er svært nyttige når du skraper nettsider som krever brukerinteraksjoner.

For å dekke det hele er Java et veldig populært og mye brukt språk som støttes og enkelt kan integreres med en rekke verktøy som databaser og databehandlingsrammer. Dette er fordelaktig fordi det sikrer at når du skraper data, støtter sannsynligvis alle verktøyene du trenger for å skrape, behandle og lagre dataene Java.

La oss se hvordan vi kan bruke Java til nettskraping.

Java for nettskraping: Forutsetninger

For å bruke Java i nettskraping, må følgende forutsetninger være oppfylt:

1. Java – du bør ha Java installert, helst den nyeste versjonen av langsiktig støtte. I tilfelle du ikke har Java installert, gå til installer Java for å lære hvordan du installerer Java på maskinen din

2. Integrert utviklingsmiljø (IDE) – Du bør ha en IDE installert på maskinen din. I denne opplæringen vil vi bruke IntelliJ IDEA, men du kan bruke hvilken som helst IDE du er kjent med.

3. Maven – dette vil bli brukt til avhengighetsadministrasjon og for å installere et nettskrapingsbibliotek.

I tilfelle du ikke har Maven installert, kan du installere den ved å åpne terminalen og utføre:

sudo apt install maven

Dette installerer Maven fra det offisielle depotet. Du kan bekrefte at Maven ble installert vellykket ved å utføre:

mvn -version

I tilfelle installasjonen var vellykket, bør du få en slik utgang:

Sette opp miljøet

Slik setter du opp miljøet ditt:

1. Åpne IntelliJ IDEA. Klikk på Prosjekter på venstre menylinje, og velg deretter Nytt prosjekt.

  ChatGPT vs. Bings AI Chatbot: 10 nøkkelforskjeller

2. I vinduet Nytt prosjekt som åpnes, fyll det opp som vist nedenfor. Sørg for at språket er satt til Java, og byggesystemet til Maven. Du kan gi prosjektet et hvilket som helst navn du foretrekker, og bruk deretter Plassering for å spesifisere mappen der du vil at prosjektet skal opprettes. Når du er ferdig, klikker du på Opprett.

3. Når prosjektet er opprettet, bør du ha en pom.xml i prosjektet som vist nedenfor.

Pom.xml-filen er opprettet av Maven og inneholder informasjon om prosjektet og konfigurasjonsdetaljer som brukes av Maven til å bygge prosjektet. Det er denne filen vi også bruker for å indikere at vi skal bruke eksterne biblioteker.

Når vi bygger en nettskraper, vil vi bruke jsoup-biblioteket. Vi må derfor legge den til som en avhengighet i pom.xml-filen slik at Maven kan gjøre den tilgjengelig i prosjektet vårt.

4. Legg til jsoup-avhengighet i pom.xml-filen ved å kopiere koden nedenfor og legge den til pom.xml-filen din

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.16.1</version>
        </dependency>
    </dependencies>

Resultatet skal være som vist nedenfor:

I tilfelle du støter på en feil som sier at avhengigheten ikke kan bli funnet, klikk på det angitte ikonet for Maven for å laste inn endringene som er gjort, laste avhengigheten og fjerne feilen.

Med det er miljøet ditt helt klart.

Nettskraping med Java

For nettskraping skal vi skrape data fra ScrapeThisSitesom gir en sandkasse der utviklere kan øve på nettskraping uten å støte på juridiske problemer.

For å skrape et nettsted ved hjelp av Java

1. På venstre menylinje på IntelliJ åpner du src-katalogen, deretter hovedkatalogen, som er inne i src-katalogen. Hovedkatalogen inneholder en katalog kalt java; høyreklikk på den og velg New, deretter Java Class

Gi klassen et hvilket som helst navn du liker, for eksempel WebScraper, og trykk deretter Enter for å opprette en ny Java-klasse.

Åpne den nyopprettede filen som inneholder Java-klassene du nettopp opprettet.

2. Nettskraping innebærer å hente data fra nettsteder. Derfor må vi spesifisere URLen som vi vil skrape data fra. Når vi har spesifisert URL-en, må vi koble til URL-en og lage en GET-forespørsel for å hente HTML-innholdet på siden.

Koden som gjør dette er vist nedenfor:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

import java.io.IOException;

public class WebScraper {
    public static void main(String[] args) {
        String url = "https://www.scrapethissite.com/pages/simple/";
        try {
            Document doc = Jsoup.connect(url).get();
            System.out.println(doc);

        } catch (IOException e) {
            System.out.println("An IOException occurred. Please try again.");
        }
    }
}

Produksjon:

Som du kan se, returneres HTML-en til siden og er det vi skriver ut. Når du skraper, kan URL-en du angir ha en feil, og ressursen du prøver å skrape, eksisterer kanskje ikke i det hele tatt. Derfor er det viktig å pakke inn koden vår i en try-catch-erklæring.

Køen:

Document doc = Jsoup.connect(url).get();

Brukes til å koble til for å koble til URL-en du vil skrape. Get()-metoden brukes til å lage en GET-forespørsel og hente HTML-en på siden. Det returnerte resultatet lagres deretter i et JSOUP Document-objekt, kalt doc. Ved å lagre resultatet i et JSOUP-dokument kan du bruke JSOUP API til å manipulere den returnerte HTML-en.

  Hva er Area 51 IPTV og er det trygt å bruke?

3. Gå til ScrapeThisSite og inspiser siden. I HTML-en bør du se strukturen vist nedenfor:

Legg merke til at alle landene på siden er lagret under en lignende struktur. Det er en div med en klasse kalt land med et h3-element med en klasse med landnavn som inneholder navnet på hvert land på siden.

Inne i hoved-div, er det en annen div med en klasse med land-info, og den inneholder informasjon som hovedstad, befolkning og landområde. Vi kan bruke disse klassenavnene til å velge HTML-elementene og trekke ut informasjon fra dem.

4. Trekk ut spesifikt innhold fra HTML-en på siden ved å bruke følgende linjer:

Elements countries = doc.select(".country");         
for (Element country : countries) {
   String countryName = country.select(".country-name").text();
   String capitalCity = country.select(".country-capital").text();
   String population = country.select(".country-population").text();
   System.out.println(countryName + " - " + capitalCity + " Population - " + population);
}

Vi bruker metoden select() for å velge elementer fra HTML-en til siden som samsvarer med den spesifikke CSS-velgeren vi sender inn. I vårt tilfelle sender vi inn klassenavnene. Fra å inspisere siden så vi at all landinformasjon på siden er lagret under en div med en landklasse.

Hvert land har sin egen div med en klasse av land og div inneholder informasjon som landets navn, hovedstad og befolkning.

Derfor velger vi først alle landene på siden ved å bruke klassen .country. Vi lagrer dette i en variabel kalt land av typen Elements, som fungerer akkurat som en liste. Vi bruker deretter en for-løkke for å gå gjennom land og trekke ut landets navn, hovedstad og befolkning og skrive ut det som er funnet.

Hele kodebasen vår er vist nedenfor:

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import org.jsoup.nodes.Element;

import java.io.IOException;

public class WebScraper {
    public static void main(String[] args) {
        String url = "https://www.scrapethissite.com/pages/simple/";
        try {
            Document doc = Jsoup.connect(url).get();

            Elements countries = doc.select(".country");
            
            for (Element country : countries) {
                String countryName = country.select(".country-name").text();
                String capitalCity = country.select(".country-capital").text();
                String population = country.select(".country-population").text();
                System.out.println(countryName + " - " + capitalCity + " - Population - " + population);
            }

        } catch (IOException e) {
            System.out.println("An IOException occurred. Please try again.");
        }
    }
}

Produksjon:

Med informasjonen vi får tilbake fra siden, kan vi gjøre en rekke ting, for eksempel skrive den ut som vi nettopp gjorde eller lagre den i en fil i tilfelle vi ønsker å gjøre ytterligere databehandling.

Konklusjon

Nettskraping er en utmerket måte å trekke ut ustrukturerte data fra nettsteder, lagre dataene på en strukturert måte og behandle dataene for å trekke ut meningsfull informasjon. Det er imidlertid viktig å utvise forsiktighet ved nettskraping, siden enkelte nettsteder ikke tillater nettskraping.

For å være på den sikre siden, bruk nettsteder som tilbyr sandkasser for å øve på skroting. Ellers må du alltid inspisere robots.txt for hvert nettsted du vil skrape for å finne ut om nettstedet tillater skraping.

Når du skriver webscrapper, er Java et utmerket språk, da det gir biblioteker som gjør nettskraping enklere og mer effektivt. Som Java-utvikler vil det å bygge en nettskraper hjelpe deg med å utvikle programmeringsferdighetene dine ytterligere. Så fortsett og skriv din egen nettskraper eller modifiser den som brukes i artikkelen for å trekke ut forskjellige typer informasjon. Lykke til med koding!

Du kan også utforske noen populære skybaserte nettskrapingløsninger.