Nettskraping ved hjelp av Python: trinn-for-trinn-veiledning

Nettskraping er ideen om å trekke ut informasjon fra et nettsted og bruke det til et bestemt brukstilfelle.

La oss si at du prøver å trekke ut en tabell fra en nettside, konvertere den til en JSON-fil og bruke JSON-filen til å bygge noen interne verktøy. Ved hjelp av nettskraping kan du trekke ut dataene du ønsker ved å målrette mot de spesifikke elementene på en nettside. Nettskraping ved hjelp av Python er et veldig populært valg ettersom Python tilbyr flere biblioteker som BeautifulSoup eller Scrapy for å trekke ut data effektivt.

Å ha ferdighetene til å trekke ut data effektivt er også veldig viktig som utvikler eller dataforsker. Denne artikkelen vil hjelpe deg å forstå hvordan du skraper et nettsted effektivt og får det nødvendige innholdet for å manipulere det i henhold til ditt behov. For denne opplæringen bruker vi BeautifulSoup-pakken. Det er en trendy pakke for å skrape data i Python.

Hvorfor bruke Python for nettskraping?

Python er førstevalget for mange utviklere når de bygger nettskrapere. Det er mange grunner til at Python er førstevalget, men for denne artikkelen, la oss diskutere tre hovedgrunner til at Python brukes til dataskraping.

Bibliotek og fellesskapsstøtte: Det er flere flotte biblioteker, som BeautifulSoup, Scrapy, Selenium, etc., som gir flotte funksjoner for effektivt å skrape nettsider. Den har bygget et utmerket økosystem for nettskraping, og også fordi mange utviklere verden over allerede bruker Python, kan du raskt få hjelp når du står fast.

Automatisering: Python er kjent for sine automatiseringsmuligheter. Mer enn nettskraping er nødvendig hvis du prøver å lage et komplekst verktøy som er avhengig av skraping. For eksempel, hvis du vil bygge et verktøy som sporer prisen på varer i en nettbutikk, må du legge til noe automatiseringsevne slik at den kan spore prisene daglig og legge dem til i databasen din. Python gir deg muligheten til å automatisere slike prosesser med letthet.

Datavisualisering: Nettskraping er mye brukt av dataforskere. Dataforskere trenger ofte å trekke ut data fra nettsider. Med biblioteker som Pandas gjør Python datavisualisering enklere fra rådata.

Biblioteker for nettskraping i Python

Det er flere biblioteker tilgjengelig i Python for å gjøre nettskraping enklere. La oss diskutere de tre mest populære bibliotekene her.

  Google Disk og bilder deler seg: Hva du trenger å vite

#1. Vakker suppe

Et av de mest populære bibliotekene for nettskraping. BeautifulSoup har hjulpet utviklere med å skrape nettsider siden 2004. Det gir enkle metoder for å navigere, søke og endre analysetreet. Beautifulsoup selv gjør også kodingen for innkommende og utgående data. Det er godt vedlikeholdt og har et flott fellesskap.

#2. Skrapeaktig

Et annet populært rammeverk for datautvinning. Scrapy har mer enn 43000 stjerner på GitHub. Den kan også brukes til å skrape data fra APIer. Den har også noen interessante innebygde støtte, som å sende e-poster.

#3. Selen

Selen er ikke hovedsakelig et nettskrapingsbibliotek. I stedet er det en nettleserautomatiseringspakke. Men vi kan enkelt utvide funksjonaliteten for å skrape nettsider. Den bruker WebDriver-protokollen for å kontrollere forskjellige nettlesere. Selen har vært på markedet i nesten 20 år nå. Men ved å bruke Selenium kan du enkelt automatisere og skrape data fra nettsider.

Utfordringer med Python Web Scraping

Man kan møte mange utfordringer når man prøver å skrape data fra nettsider. Det er problemer som trege nettverk, anti-skrapingverktøy, IP-basert blokkering, captcha-blokkering osv. Disse problemene kan forårsake enorme problemer når du prøver å skrape et nettsted.

Men du kan effektivt omgå utfordringer ved å følge noen måter. For eksempel, i de fleste tilfeller blokkeres en IP-adresse av et nettsted når det er mer enn en viss mengde forespørsler sendt i et bestemt tidsintervall. For å unngå IP-blokkering, må du kode skraperen din slik at den kjøles ned etter å ha sendt forespørsler.

Utviklere har også en tendens til å sette honningpottefeller for skraper. Disse fellene er vanligvis usynlige for bare menneskelige øyne, men kan krypes av en skrape. Hvis du skraper et nettsted som setter en slik honningkrukkefelle, må du kode skrapen deretter.

Captcha er et annet alvorlig problem med skrapere. De fleste nettsteder i dag bruker en captcha for å beskytte bot-tilgang til sidene deres. I et slikt tilfelle må du kanskje bruke en captcha-løser.

Skrape et nettsted med Python

Som vi diskuterte, vil vi bruke BeautifulSoup til å skrote et nettsted. I denne opplæringen vil vi skrape de historiske dataene til Ethereum fra Coingecko og lagre tabelldataene som en JSON-fil. La oss gå videre til å bygge skrapen.

Det første trinnet er å installere BeautifulSoup and Requests. For denne opplæringen skal jeg bruke Pipenv. Pipenv er en virtuelt miljøadministrator for Python. Du kan også bruke Venv om du vil, men jeg foretrekker Pipenv. Å diskutere Pipenv er utenfor omfanget av denne opplæringen. Men hvis du vil lære hvordan Pipenv kan brukes, følg denne veiledningen. Eller, hvis du vil forstå virtuelle Python-miljøer, følg denne veiledningen.

  Fullstendig kontroll per app over enhetens orientering

Start Pipenv-skallet i prosjektkatalogen din ved å kjøre kommandoen pipenv-skall. Det vil lansere et subshell i ditt virtuelle miljø. Nå, for å installere BeautifulSoup, kjør følgende kommando:

pipenv install beautifulsoup4

Og for å installere forespørsler, kjør kommandoen som ligner på ovenfor:

pipenv install requests

Når installasjonen er fullført, importerer du de nødvendige pakkene til hovedfilen. Opprett en fil kalt main.py og importer pakkene som nedenfor:

from bs4 import BeautifulSoup
import requests
import json

Det neste trinnet er å få den historiske datasidens innhold og analysere dem ved hjelp av HTML-parseren som er tilgjengelig i BeautifulSoup.

r = requests.get('https://www.coingecko.com/en/coins/ethereum/historical_data#panel')

soup = BeautifulSoup(r.content, 'html.parser')

I koden ovenfor åpnes siden ved å bruke get-metoden som er tilgjengelig i forespørselsbiblioteket. Det analyserte innholdet lagres deretter i en variabel kalt suppe.

Den originale skrapedelen starter nå. Først må du identifisere tabellen riktig i DOM. Hvis du åpner denne siden og inspiserer den ved hjelp av utviklerverktøyene som er tilgjengelige i nettleseren, vil du se at tabellen har disse klassetabellene tabellstripet tekst-sm text-lg-normal.

Coingecko Ethereum historiske datatabell

For å målrette denne tabellen riktig, kan du bruke finnemetoden.

table = soup.find('table', attrs={'class': 'table table-striped text-sm text-lg-normal'})

table_data = table.find_all('tr')

table_headings = []

for th in table_data[0].find_all('th'):
    table_headings.append(th.text)

I koden ovenfor, først blir tabellen funnet ved å bruke soup.find-metoden, deretter ved å bruke find_all-metoden, søkes alle tr-elementer inne i tabellen. Disse tr-elementene er lagret i en variabel kalt table_data. Tabellen har noen få elementer for tittelen. En ny variabel kalt table_headings initialiseres for å holde titlene i en liste.

En for-løkke kjøres så for den første raden i tabellen. I denne raden søkes alle elementene med th, og tekstverdien deres legges til listen table_headings. Teksten er trukket ut ved hjelp av tekstmetoden. Hvis du skriver ut variabelen table_headings nå, vil du kunne se følgende utdata:

['Date', 'Market Cap', 'Volume', 'Open', 'Close']

Det neste trinnet er å skrape resten av elementene, generere en ordbok for hver rad, og deretter legge til radene i en liste.

for tr in table_data:
    th = tr.find_all('th')
    td = tr.find_all('td')

    data = {}

    for i in range(len(td)):
        data.update({table_headings[0]: th[0].text})
        data.update({table_headings[i+1]: td[i].text.replace('n', '')})

    if data.__len__() > 0:
        table_details.append(data)

Dette er den essensielle delen av koden. For hver tr i table_data-variabelen søkes først de th elementene. De th elementene er datoen vist i tabellen. Disse th elementene er lagret inne i en variabel th. På samme måte er alle td-elementene lagret i td-variabelen.

  Trådløst tastatur Touchpad fungerer ikke (feilsøkingsveiledning)

En tom ordbokdata initialiseres. Etter initialiseringen går vi gjennom utvalget av td-elementer. For hver rad oppdaterer vi først det første feltet i ordboken med det første elementet i th. Koden table_headings[0]: th[0].text tilordner et nøkkelverdi-par av dato og det første elementet.

Etter initialisering av det første elementet, tildeles de andre elementene ved hjelp av data.update({table_headings[i+1]: td[i].text.replace(«n», ”)}). Her blir td elements-tekst først trukket ut ved hjelp av tekstmetoden, og deretter erstattes alle n med erstatningsmetoden. Verdien blir deretter tilordnet i+1.-elementet i table_headings-listen fordi det i-te-elementet allerede er tildelt.

Deretter, hvis dataordboklengden overstiger null, legger vi til ordboken til table_details-listen. Du kan skrive ut listen table_details for å sjekke. Men vi skal skrive verdiene en JSON-fil. La oss ta en titt på koden for dette,

with open('table.json', 'w') as f:
    json.dump(table_details, f, indent=2)
    print('Data saved to json file...')

Vi bruker metoden json.dump her for å skrive verdiene inn i en JSON-fil kalt table.json. Når skrivingen er fullført, skriver vi ut data som er lagret i json-filen … inn i konsollen.

Kjør nå filen ved å bruke følgende kommando,

python run main.py

Etter en stund vil du kunne se dataene som er lagret i JSON-filen … tekst i konsollen. Du vil også se en ny fil kalt table.json i arbeidsfilkatalogen. Filen vil ligne følgende JSON-fil:

[
  {
    "Date": "2022-11-27",
    "Market Cap": "$145,222,050,633",
    "Volume": "$5,271,100,860",
    "Open": "$1,205.66",
    "Close": "N/A"
  },
  {
    "Date": "2022-11-26",
    "Market Cap": "$144,810,246,845",
    "Volume": "$5,823,202,533",
    "Open": "$1,198.98",
    "Close": "$1,205.66"
  },
  {
    "Date": "2022-11-25",
    "Market Cap": "$145,091,739,838",
    "Volume": "$6,955,523,718",
    "Open": "$1,204.21",
    "Close": "$1,198.98"
  },
// ...
// ... 
]

Du har implementert en nettskraper med Python. For å se hele koden, kan du besøke denne GitHub-repoen.

Konklusjon

Denne artikkelen diskuterte hvordan du kan implementere en enkel Python-skrape. Vi diskuterte hvordan BeautifulSoup kan brukes til å skrape data raskt fra nettstedet. Vi diskuterte også andre tilgjengelige biblioteker og hvorfor Python er førstevalget for mange utviklere for å skrape nettsteder.

Du kan også se på disse nettskrapingsrammene.

x