Hvordan laver man webscraping på Python med BeautifulSoup?

Forfatter :

Reagerer:

Kommentar

At lave web scraping i Python med BeautifulSoup, du skal bruge to biblioteker: requests for at downloade websiden, og beautifulsoup4 for at udtrække dataene fra HTML-koden.

Installer dem med kommandoen pip install requests beautifulsoup4, og følg derefter vejledningen nedenfor for at scrape en hjemmeside trin for trin.

Python-script til webscraping med BeautifulSoup til at udtrække data fra en webside
Webscraping på Python med BeautifulSoup. Cristina til Alucare.fr

Forudsætninger for scraping på Python med BeautifulSoup

Før du går i gang, behøver du ikke at være ekspert. Du skal blot kunne læse og udføre et script Python er rigeligt til at komme i gang.

Her er, hvad du skal installere for at komme i gang:

  • Installere Python samt et udviklingsmiljø.
  • Installere pip, værktøjet, der gør det muligt at tilføje Python-biblioteker med en enkelt kommando.
  • Installere BeautifulSoup :
pip installer beautifulsoup4

Vær opmærksom på pakkens navn: på PyPI, det er rigtigt beautifulsoup4 som skal skrives. Det modul, du skal importere i din kode, hedder bs4.

  • Installere Requests for at downloade websiderne:
pip installer anmodninger
  • Installere lxml (valgfrit), en hurtigere parser, som BeautifulSoup bruger til at analysere HTML:
pip install lxml

Hvordan laver man webscraping med Python og BeautifulSoup?

Her er en komplet vejledning til at genvinde titel på en webside og alle Links som den indeholder.

Python-script til webscraping med BeautifulSoup-biblioteket til udtrækning af HTML-data
Webscraping i Python med BeautifulSoup. ©Christina for Alucare.fr

Trin 1: Hent sideindhold med forespørgsler

For at downloade en webside skal du sende en HTTP GET-anmodning til en URL. Det er bibliotekets opgave Requests.

Ved hver forespørgsel returnerer serveren en statuskode der fortæller dig, om alt er gået godt. De vigtigste, du bør kende:

  • 200 succes.
  • 301 / 302 omdirigering.
  • 404 Siden blev ikke fundet.
  • 500 intern serverfejl.

Med Requests, du kontrollerer dette resultat ved hjælp af attributten .status_code. Her er et konkret eksempel: Denne kode sender en forespørgsel til et websted, kontrollerer statuskoden og viser derefter et uddrag af HTML-indholdet, hvis alt går godt.

importanmodninger

# Mål-URL
url = "https://bonjour.com"

# Send en GET-anmodning
svar = requests.get(url)

# Tjek statuskode
hvis response.status_code == 200:
    print("Succes: siden er blevet hentet!")
    html = response.text # HTML-indhold på siden
    print("Uddrag af HTML-indhold:")
    print(html[:500]) # viser kun de første 500 tegn
else:
    print(f "Fejl: statuskode {response.status_code}")

Trin 2: Analyser HTML-koden med BeautifulSoup

Når du henter indholdet fra en side med svar.tekst, får du en simpel tegnstreng: hele HTML-kode på siden, men den kan ikke bruges i sin nuværende form. For at kunne arbejde med den nemt skal du oprette et objekt BeautifulSoup, som omdanner denne rå HTML til en struktur, som du kan gennemse og analysere.

Angiver altid en parser, for eksempel "html.parser. BeautifulSoup fortolker derefter HTML-koden korrekt uden at vise nogen advarsel. Du kan også bruge lxml, der er hurtigere og skal installeres separat.

fra bs4 import BeautifulSoup
import anmodninger

url = "https://bonjour.com"
svar = requests.get(url)
html = svar.tekst

# Det anbefales at angive parseren
soup = BeautifulSoup(html, "html.parser")

Trin 3: Find og udtræk elementer

HTML’en er nu et BeautifulSoup-objekt. Du kan søge efter og hente data der interesserer dig, tag for tag. Tre metoder dækker de fleste behov.

Brug af find() og find_all()

find() henviser til første element fundet. find_all() henviser til fuld liste de tilhørende elementer.

# Hent titel <h1>
h1 = soup.find("h1")
print(h1.get_text())

# Hent alle links <a>
liens = soup.find_all("a")
for lien i liens:
    print(lien.get_text(), lien.get("href"))

Målretning af elementer efter attribut

Du kan indsnævre søgningen efter et HTML-attribut, f.eks. klasse, id eller en hvilken som helst anden. At notere : I Python skriver man Klasse og ikke klasse, for at undgå konflikt med det reserverede ord i sproget.

# Hente et div-element med et bestemt id
container = soup.find("div",)

# Hente alle links med en bestemt klasse
nav_links = soup.find_all("a", class_="nav-link")

Brug af CSS-selektorer med select()

For at foretage mere præcise søgninger kan man bruge følgende metode vælg() accepterer CSS-selektorer. Du kan målrette præcist mod bestemte dele af en side, uden at skulle gennemgå hele HTML-koden manuelt.

# Alle links i artikeltitler
article_links = soup.select("article h2 a")

# Alle <a> hvis href-attribut begynder med "http".
links_http = soup.select('a[href^="http"]')

Hvordan udtrækker man data fra en HTML-tabel med BeautifulSoup?

Udtrækning af data fra en HTML-tabel med BeautifulSoup i Python
Uddrag data fra en HTML-tabel med BeautifulSoup. ©Christina for Alucare.fr

De reelle anvendelsesscenarier er ofte mere komplekse end blot at hente en titel eller et link. Du bliver nødt til at håndtere’Udtræk af strukturerede data ligesom tabeller og lister, den sidesummering, og de hyppigste fejl ved scraping.

Udtræk af tabeller og lister

Hjemmesider præsenterer ofte deres data i HTML-tabeller (<table>, <tr>, <th>, <td>) eller lister (

    ./
      . med
    1. .). For at omdanne disse strukturer til data, der kan bruges, skal du gennemgå dem linje for linje eller element for element.

      For at udtrække en HTML-tabelPrincippet er enkelt:

      • Hent overskrifterne (<th>) for at identificere kolonneoverskrifter.
      • Gennemgå hver linje (<tr>) og søge efter celler (<td>) som indeholder dataene.
      • Gem oplysningerne i en liste eller en ordbog.

      For en HTML-liste (

        . Hvor
          .) :

          • Marker alle mærker
          • . med find_all.
          • Hent deres indhold (tekst eller link) og tilføj det til en Python-liste.

          Her er et eksempel med en tabel:

          html = """
          <table>
            <tr>
              <th>Efternavn</th>
              <th>Alder</th>
              <th>By</th>
            </tr>
            <tr>
              <td>Alice</td>
              <td>25</td>
              <td>Paris</td>
            </tr>
            <tr>
              <td>Bob</td>
              <td>30</td>
              <td>Lyon</td>
            </tr>
          </table>
          """
          
          # Opret BeautifulSoup-objektet
          soup = BeautifulSoup(html, "html.parser")
          
          # Træk overskrifterne ud af arrayet
          headers = [th.get_text(strip=True) for th in soup.find_all("th")]
          print("Headers:", headers)
          
          # Udtræk rækkerne med data (spring den første række over, da det er overskrifterne)
          rækker = []
          for tr in soup.find_all("tr")[1:]:
              cells = [td.get_text(strip=True) for td in tr.find_all("td")]
              if celler:
                  rækker.tilføj(celler)
          
          print("Linjer :", rækker)
          

          Her, find_all("th") henter overskrifter og find_all("td") henter cellerne i hver række. Du gentager for hver <tr> for at genopbygge tabellen række for række.

          Her er et eksempel baseret på en liste:

          fra bs4 import BeautifulSoup
          
          html_list = """
          
          • Æble
          • Banan
          • Orange
          """ soup = BeautifulSoup(html_list, "html.parser") # Hent elementer fra listen items = [li.get_text(strip=True) for li in soup.find_all("li")] print("Uddraget liste:", items) # ["Apple", "Banana", "Orange"]

          Hver enkelt

        1. . omdannes direkte til Python-listeelement, hvilket giver følgende resultat ["Æble", "Banan", "Appelsin"]..

          Håndtering af paginering og links

          Ofte kan dataene ikke rummes på en enkelt side. De fordeles via links til “næste side” eller a Nummereret paginering (?side=1, ?side=2, osv.). I begge tilfælde skal du krølle for at hente alle siderne og sammenflette dataene.

          Eksempel med en sideparameter:

          Importtidspunkt
          import anmodninger
          fra bs4 import BeautifulSoup
          
          # Eksempel på URL med paginering
          BASE_URL = "https://bonjour.com/articles?page={}"
          HEADERS = {"User-Agent": "Mozilla/5.0"}
          
          alle_artikler = []
          
          # Antag, at der er 5 sider at gennemse
          for page in range(1, 6):
              url = BASE_URL.format(side)
              r = requests.get(url, headers=HEADERS, timeout=20)
              hvis r.status_code == 200:
                  soup = BeautifulSoup(r.text, "html.parser")
                  # Udtræk af artikeltitler
                  articles = [h2.get_text(strip=True) for h2 in soup.find_all("h2", class_="title")]
                  all_articles.extend(artikler)
              else:
                  print(f "Fejl på side {side} (kode: {r.status_code})")
              time.sleep(1.0) # høflighed
          
          print("Artikler hentet:", all_articles)

          En kort trin-for-trin-vejledning:

          • Forbered’URL med en plads {} for at indsætte sidetallet.
          BASE_URL = "https://bonjour.com/articles?page={}
          • Nogle websteder blokerer anmodninger uden browseridentitet. Tilføj en User-Agent undgå at blive taget for en bot.
          headers = {"User-Agent": "Mozilla/5.0"}
          requests.get(url, headers=headers) 
          • Tilbage til toppen af siden 1 til 5.
          for side i interval(1, 6):
          • Henter HTML-koden fra siden med requests.
          requests.get(url)
          • Begrænser ventetiden, hvis hjemmesiden ikke svarer (timeout på 20 sekunder).
          requests.get(url, timeout=20)
          • Analyser siden med BeautifulSoup.
          BeautifulSoup(response.text, "html.parser")
          • Henter alle artikeloverskrifter.
          find_all("h2", class_="title")
          • Føj de fundne artikler til en samlet liste.
          all_articles.extend(artikler)
          • Indsæt en pause mellem hver forespørgsel for ikke at overbelaste serveren og undgå at blive udelukket.
          time.sleep(1.0)

          Efter loopet, alle_artikler indeholder alle 5 sidetitler.

          Almindelige fejl og udfordringer

          Scraping handler ikke bare om at trykke på en knap. Du vil ofte støde på følgende forhindringer:

          • HTTP-fejl : 404 (siden blev ikke fundet), 403 (adgang forbudt) og 500 (fejl på serversiden).

          Eksempel på administration:

          response = requests.get(url)
          if response.status_code == 200:
              print("Siden blev hentet")
          elif response.status_code == 404:
              print("Fejl: siden kan ikke findes")
          else:
              print("Returneret kode:", response.status_code)
          
          • Websteder, der blokerer for scraping : Nogle registrerer automatiske forespørgsler og blokerer adgangen.
          • Dynamiske sider (JavaScript) : BeautifulSoup læser kun Statisk HTML. Hvis siden indlæser sit indhold med JavaScript, vil du ikke kunne se noget. I så fald skal du bruge et værktøj som Selenium Hvor Playwright.

          Her er de bedste fremgangsmåder til at scrape effektivt uden at blive blokeret eller beskadige hjemmesiden:

          • Overhold robots.txt-filen fra den hjemmeside, du vil analysere.
          • Indfør nogle Deadlines mellem forespørgslerne med time.sleep() for ikke at overbelaste serveren.
          • Brug fuldmagter og lad dem dreje rundt.
          • Skift jævnligt din User-Agent.

          Hvordan kan jeg scrape nettet med Selenium og BeautifulSoup?

          Webscraping med Selenium og BeautifulSoup i Chrome ved hjælp af Python.
          Webscraping med Selenium og BeautifulSoup på Chrome. Cristina for Alucare.fr

          Selenium Styr en rigtig browser, kører JavaScript-koden og viser siden, som om et menneske navigerede på den. BeautifulSoup Derefter analyserer du HTML-koden, når siden er fuldt indlæst, og udtrækker alle de data, du ønsker.

          Trin 1: Installer Selenium og BeautifulSoup

          Her, i stedet for requests, du bruger Selenium for at hente sidens indhold. Installer de to biblioteker med denne kommando:

          pip install selenium beautifulsoup4

          Derefter skal du downloade en WebDriver tilpasset til din browserversion. For Google Chrome er det ChromeDriver. Du har to muligheder: enten at placere den i samme mappe som dit Python-script, eller at’tilføj til miljøvariablen PATH i dit system.

          Trin 2: Konfiguration af Selenium

          Start med at importere webdriver ved hjælp af Selenium til at styre browseren.

          fra selenium import webdriver
          fra selenium.webdriver.common.by import By

          Åbn derefter en browser. Det er den, der åbner siden, og udfører JavaScript-koden, her Chrome.

          driver = webdriver.Chrome()

          Angiver over for browseren, hvilken URL at besøge.

          driver.get("https://www.exemple.com")

          Hvis det tager lang tid for siden at vise visse elementer, kan du bede Selenium om at vente i op til 10 sekunder.

          driver.implicitly_wait(10)

          Trin 3: Hentning af sideindhold

          Når siden er indlæst, henter du Fuld DOM : den HTML-kildekode, der fremkommer efter udførelse af JavaScript.

          html_content = driver.page_source

          Trin 4: HTML-analyse med BeautifulSoup

          Overfør nu denne kildekode til SmukSuppe for at udnytte det:

          from bs4 import BeautifulSoup
          
          # Oprette et BeautifulSoup-objekt
          soup = BeautifulSoup(html_content, 'html.parser')
          
          # Eksempel: Hent alle overskrifter på siden
          titres = soup.find_all('h2')
          for titre in titres:
              print(titre.get_text())

          BeautifulSoup tilbyder kraftfulde metoder som find(), find_all() og CSS-selektorerne til at målrette og udtrække bestemte elementer i HTML.

          Trin 5: Lukning af browseren

          Meget vigtigt: Luk altid din browser efter kørselen for at frigøre ressourcer.

          driver.quit()

          På den måde kombinerer du styrken fra Selenium til Simulere menneskelig navigation (klik, rulning) kombineret med BeautifulSoups effektivitet til analyse af HTML. Det er den ideelle metode til at scrape et websted, der indlæser sine data via JavaScript.

          Ofte stillede spørgsmål

          Hvad er det bedste værktøj til webscraping i Python?

          Der er ingen’Skrabeværktøj universelle løsninger, men snarere løsninger, der er tilpasset dit projekt. Her er de tre mest anvendte:

          • BeautifulSoup : Enkel og effektiv til at analysere HTML og hurtigt udtrække indhold. Perfekt, hvis du er nybegynder eller har små projekter.
          • Scrapy : et komplet framework, der er udviklet til at håndtere store mængder data med avancerede funktioner.
          • Playwright : perfekt til komplekse websteder, der genereres af JavaScript. Det simulerer en rigtig browser og interagerer med siden på samme måde som et menneske.

          Hvordan bruger man BeautifulSoup til at udtrække indholdet af en div-tag?

          Med BeautifulSoup, så kan du finde en bestemt tag ved hjælp af en CSS-vælger. Sådan udtrækkes indholdet af et tag <div>, følg disse trin.

          1. Hent websiden med requests, og derefter analysere HTML-koden med BeautifulSoup.

          from bs4 import BeautifulSoup
          import requests
          
          url = "URL_DE_TON_SITE"  # Remplace par l'URL réelle
          reponse = requests.get(url)
          html_content = reponse.text
          
          soup = BeautifulSoup(html_content, "html.parser")

          2. Anvend metoden vælg() ved hjælp af din CSS-selektor til at målrette mod tagget <div>.

          For at hente det første element skal du bruge soup.select_one. For at hente alle elementerne skal du bruge suppe.vælg. Her er et eksempel på HTML-kode:

          <div>
            <h2>Titre de l'article</h2>
            <p>Voici le contenu du paragraphe.</p>
          </div>

          Og her er eksemplet med CSS-selektoren div.artikel :

          # Récupérer le premier div avec la classe "article"
          div_article = soup.select_one("div.article")
          
          # Afficher son contenu texte
          if div_article:
              print(div_article.get_text(strip=True))

          3. Tag elementerne ud af <div>.

          # Récupérer le titre à l'intérieur du div
          titre = soup.select_one("div.article h2").get_text()
          
          # Récupérer le paragraphe à l'intérieur du div
          paragraphe = soup.select_one("div.article p").get_text()
          
          print("Titre :", titre)
          print("Paragraphe :", paragraphe)

          Hvordan kan Requests og BeautifulSoup bruges sammen?

          Disse to biblioteker er yderligere : Den ene henter siden, den anden analyserer den.

          1. requests sender en HTTP-anmodning og henter rå HTML-kode af siden.

          import requests
          
          url = "https://sitecible.com"
          response = requests.get(url)  # requête HTTP
          print(response.text)  # affiche le HTML brut

          På dette tidspunkt har du kun en enorm tekst fuld af tags (<html>, <div>, <p>osv.).

          2. BeautifulSoup analyserer denne rå HTML-kode og omdanner den til en organiseret struktur. Du kan så navigere rundt på siden, finde tagsene og hente dataene.

          from bs4 import BeautifulSoup
          
          soup = BeautifulSoup(response.text, "html.parser")  # analyse le HTML
          titre = soup.find("h1").get_text()  # extrait le contenu d'un <h1>
          print(titre)

          Hvorfor virker min webscraping-kode ikke på nogle sider?

          Det kan ske, at dit script ikke henter noget. Nogle hjemmesider leverer ikke alt deres indhold direkte i HTML: de bruger JavaScript for at indlæse dataene dynamisk. Men, BeautifulSoup kan ikke analysere de data, der returneres af JavaScript. I så fald bør du benytte værktøjer som Playwright Hvor Selenium.

          Hvilken rolle spiller BeautifulSoup i webscraping?

          BeautifulSoup fungerer som’HTML-parser. Den omdanner koden på en side til et struktureret objekt, som du nemt kan gennemse. Kort sagt er det oversætter mellem rå HTML og din Python-kode.

          Webscraping: BeautifulSoup eller Scrapy?

          BeautifulSoup og Scrapy er virkelig forskellige, selvom begge bruges til web scraping.

          BeautifulSoup Scrapy
          Et simpelt bibliotek, der udelukkende bruges til at analysere HTML og udtrække data. Et komplet framework, der håndterer hele scraping-processen: forespørgsler, sporing af links, paginering, eksport af data og fejlhåndtering.

          BeautifulSoup er det perfekte valg til begyndere: det gør’Udtræk af HTML-data i Python enkelt og hurtigt.

          Hvis du helst vil holde kodemængden så lav som muligt, er værktøjet Lyse data tilbyder færdige datasæt, der gør det muligt at reducere mængden af kode.

          👍Din mening
          Artiklen er informativ
          Artiklen er objektiv
          Artiklen besvarer mit spørgsmål
          Indholdet er opdateret
          🔍 Fandt du nogen fejl? Fortæl os hvor!

Kan du lide det? Så del den!

Dette indhold er oprindeligt på fransk (Se redaktøren lige nedenfor). Den er blevet oversat og korrekturlæst på forskellige sprog ved hjælp af Deepl og/eller Google Translate API for at kunne tilbyde hjælp i så mange lande som muligt. Denne oversættelse koster os flere tusinde euro om måneden. Hvis den ikke er 100 % perfekt, så skriv en kommentar, så vi kan rette den. Hvis du er interesseret i at læse korrektur og forbedre kvaliteten af oversatte artikler, så send os en e-mail ved hjælp af kontaktformularen!
Vi sætter pris på din feedback, så vi kan forbedre vores indhold. Hvis du vil foreslå forbedringer, kan du bruge vores kontaktformular eller skrive en kommentar nedenfor. Dine kommentarer hjælper os altid med at forbedre kvaliteten af vores hjemmeside Alucare.fr


Alucare er et uafhængigt medie. Støt os ved at tilføje os til dine Google News-favoritter:

Skriv en kommentar på diskussionsforummet