At scrape en hjemmeside, der bruger AJAX er mere kompliceret end traditionel webscraping. Indholdet findes ikke i HTML oprindelig: den kommer bagefter, via JavaScript. En simpel scraper kan altså ikke se noget, og man skal derfor anvende en passende metode for at hente disse dynamiske data.

AJAX og webscraping: hvorfor er det anderledes?
det web scraping består i at analysere koden HTML fra en webside for automatisk at udtrække de relevante data. Det fungerer rigtig godt på en statisk hjemmeside. Problemet opstår med AJAX (til Asynchronous JavaScript and XML), en teknologi, der gør det muligt at indlæse eller opdatere indhold uden at genindlæse hele siden.
Hvordan fungerer AJAX?
Browseren (eller browser) sender små asynkrone forespørgsler til serveren i baggrunden. Serveren returnerer dataene, ofte i formatet JSON. Siden viser derefter disse oplysninger på farten, uden at genindlæse resten. Det er netop det, der gør internettet hurtigere og mere interaktivt.

Hvorfor er AJAX-scraping mere kompliceret?
Når et websted bruger AJAX, vises det indlæste indhold ikke i oprindelig HTML-kildekode. Det tilføres efterfølgende af JavaScript, når siden er åbnet. En klassisk scraper henter kun statisk indhold : han ser altså ikke de dynamiske data tilføjes derefter.
For at hente dem skal du bruge et værktøj, der kan køre JavaScript. I praksis er der tre fremgangsmåder, der dominerer:
- Gengiv direkte AJAX-forespørgsler, det vil sige opkaldene XHR der indlæser dataene.
- At styre en hovedløs browser som Selenium Hvor Playwright, som sørger for gengivelsen (eller rendering) på siden ligesom i en rigtig browser.
- Gå gennem en Skrabning af API alt-i-én.
Hvad er metoderne og værktøjerne til AJAX-scraping?
Metode 1: Gengivelse af AJAX-forespørgsler
Det er den mest effektive metode til at hente dynamiske data. I stedet for at indlæse hele siden, skal du aflytter AJAX-anmodninger sendes til serveren, hvorefter du gengiver dem direkte for at få rådataene, ofte i formatet JSON.
For at finde disse opkald skal du åbne udviklerværktøjerne i din browser og derefter fanen Netværk med filteret XHR. Her kan du se den nøjagtige URL til endpointet, de overskrifter og svarets format.
Denne tekniks styrker:
- Meget hurtig og let, da den ikke kræver en fuldstændig gengivelse af siden.
- Hun omgår problemerne relateret til JavaScript-rendering.
Dens begrænsninger:
- Mere kompliceret at gennemføre end en headless-browser.
- Hun beder om en grundig analyse forespørgsler, headere og parametre. Nogle websteder kræver et token eller bestemte headere.
Hvad angår biblioteker, kan du vælge alt efter sproget:
- Webscraping med Python : biblioteket
requests. - Webscraping med JavaScript : biblioteket
axios.

Metode 2: Brug af en headless-browser
Det er den nemmeste metode til at skrabe dynamiske sider. Du automatiserer en rigtig webbrowser uden grafisk brugergrænseflade. Den gengiver siden præcis, som en bruger ville gøre, og udfører JavaScript, udløser AJAX-kald og viser det endelige indhold.
Fordele:
- Du skraber præcis det, brugeren ser, inklusive indholdet.
- Dette er nem at implementere, selv på et meget dynamisk websted.
Uhensigtsmæssigheder:
- Dette er langsommere end en direkte anmodning.
- Dette er ressourcekrævende, fordi du starter en fuldgyldig browser.
De mest anvendte værktøjer til denne tilgang:
- Selenium : det alsidige, traditionsrige og velunderbyggede værktøj.
- Playwright : moderne, hurtig og kompatibel med flere browsere.
- Puppeteer : specialiseret i Chrome og Chromium.

Du kan kombinere en headless-browser med BeautifulSoup (modul bs4) : browseren indlæser siden og sørger for rendering JavaScript, og så skal du parses den HTML, der genereres med biblioteket.
Metode 3: Alt-i-én-API’er til scraping
Nogle platforme tilbyder komplette scraping-tjenesterblandt gratis værktøjer eller de betalingsbaserede tjenester på markedet. Man kan nævne Bright Data, ZenRows, ScrapingBee Hvor Crawlbase. De styrer automatisk JavaScript-rendering, dem fuldmagter og dendataudtræk : Du sender en URL, og de sender det færdige indhold tilbage til dig.
Fordele:
- Enkle og pålidelige, selv i stor skala.
- Du behøver ikke at administrere infrastruktur eller proxyservere.
Uhensigtsmæssigheder:
- det omkostningerne kan være høje afhængigt af mængden.
- Du har mindre kontrol om processen.

Hvordan scraper man en hjemmeside med AJAX?
Her er en konkret vejledning i, hvordan man scraper en hjemmeside, der indlæser sine artikler via AJAX, med to kodeeksempler i Python : en med requests, en med en hovedløs browser.
1. Identificere AJAX-anmodninger i udviklerværktøjerne
Det indhold, der indlæses via AJAX, findes ikke i Oprindelig HTML. Man skal derfor finde det netværksanrop, der henter dataene.
- Åbn dem udviklingsværktøjer i din browser (tasten F12 eller højreklik og vælg “Inspicer”).
- Gå til fanen Netværk (Network) og genindlæs siden.
- Se på dem forespørgsler udløst af webstedet, herunder dem, der læsser varerne.
- Filtrer efter forespørgsler af typen XHR Hvor fetch : Det er dem, der henter dataene i baggrunden.
Klik på den rigtige forespørgsel for at se dens URL, hans overskrifter og svaret. Oftest er svaret i formatet JSON, undertiden i HTML.
2. Vælg scraping-metode
Når du har fundet AJAX-anmodningen, har du to muligheder.
- Gengiv forespørgslen : Du afspiller opkaldet direkte i Python ved hjælp af biblioteket requests. Du henter rådataene ved at JSON eller i HTML, uden browser. Det er den hurtigste metode.
- Headless-browser : hvis hjemmesiden kræver, at JavaScript kører, eller at der foretages komplekse handlinger (klik, rulning), skal du bruge Selenium Hvor Playwright. Værktøjet indlæser siden på samme måde som en rigtig bruger ville gøre.
3. Gengiv AJAX-anmodningen med requests
Her er grundkoden til at afspille det opkald, der er identificeret i fanen »Netværk«.
import af anmodninger
# URL for AJAX-anmodningen, som er identificeret i udviklerværktøjerne
url = 'https://example.com/ajax-endpoint'
# Parametre for anmodningen (skal tilpasses til de observerede data)
params = {
'page': 1,
'category': 'technology'
}
# Headers, der skal kopieres fra fanen Network (User-Agent, Referer, token...)
headers = {
'User-Agent': 'Mozilla/5.0',
'X-Requested-With': 'XMLHttpRequest'
}
# Afsendelse af GET-anmodningen
response = requests.get(url, params=params, headers=headers)
# Kontrol af svarets status
if response.status_code == 200:
data = response.json()
print(data)
else:
print(f"Fejl {response.status_code}")
Detaljer linje for linje:
- import requests : indlæser biblioteket, der sender HTTP-anmodninger.
- url : Erstat denne adresse med det AJAX-endpoint, der er angivet i fanen »Netværk«.
- headers : kopierer de overskrifter, der vises under fanen »Network«. Nogle websteder kræver en User-Agent, a Referer eller et token CSRF for at godkende anmodningen.
- EN status 200 betyder, at forespørgslen lykkedes.
- response.json() konverterer JSON-svaret til en Python-ordbog.
- print(data) : viser de hentede data (vareoversigt, priser osv.).
- else : viser fejlkoden, hvis opkaldet mislykkes (f.eks. 403 Hvor 404).
4. Webscraping med en headless-browser (Selenium + BeautifulSoup)
Når det ikke er nok at gentage forespørgslen, skal man bruge en browser headless kører JavaScriptet for dig. Derefter henter du den renderede HTML og parses med BeautifulSoup (modul bs4).
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from bs4 import BeautifulSoup
import time
# Start Chrome i headless-tilstand (uden brugergrænseflade)
options = Options()
options.add_argument("--headless")
driver = webdriver.Chrome(options=options)
# Åbn siden, der indlæser sit indhold via AJAX
driver.get("https://example.com")
# Lad JavaScript indlæse dataene
time.sleep(3)
# Parser den renderede HTML med BeautifulSoup
soup = BeautifulSoup(driver.page_source, "html.parser")
articles = soup.find_all("div", class_="article")
for article in articles:
print(article.get_text())
driver.quit()
Her, Selenium en rigtig pilot Chrome der sørger for rendering på siden, og driver.page_source returnerer HTML-koden, når AJAX-indholdet er indlæst. Playwright og Puppeteer fungerer efter det samme princip, men med en anden syntaks.
5. Udtræk data fra JSON eller den renderede HTML
Når du har hentet svaret, udtrækker du de relevante oplysninger afhængigt af formatet.
- Svar i JSON : bruger response.json() for at hente en Python-ordbog og derefter få adgang til værdierne via deres nøgler.
- Svar i HTML : går gennem BeautifulSoup (modul
bs4) med find Hvor select for at henvise til elementer via deres klasse eller id.
Hvilken AJAX-scrapingmetode skal man vælge?
Hver metode har sine styrker, afhængigt af dit niveau og dit projekt. Her er en kort sammenligning.
| Metode | Hastighed | Kompleksitet | Koste | Bedst til… |
|---|---|---|---|---|
| Reproduktion af forespørgsel | Meget hurtig | Høj | Svag | Storskala-scraping, strukturerede data |
| Headless-browser | Langsom | Betyde | Svag | Komplekse websteder, hurtige projekter, begyndere |
| Skrabning af API | Hurtig | Meget lav | Høj | Kritiske projekter uden vedligeholdelse af infrastrukturen |
I praksis: Start med gengivelse af forespørgsel hvis AJAX-endpointet returnerer korrekt JSON. Gå videre til hovedløs browser så snart JavaScript bliver uundværligt.
Hvad er udfordringerne ved AJAX-scraping, og hvordan kan de løses?
At scrape en hjemmeside i AJAX medfører problemer, som man ikke støder på ved traditionel scraping. Her er de største udfordringer, og ikke mindst hvordan man kan omgå dem.
Udfordring 1: Indhold, der ikke er synligt ved første øjekast
Når du indlæser en AJAX-side, bliver Den oprindelige HTML-kode er ofte tom : Dataene kommer først, når JavaScript er blevet udført. Løsningen er at bruge en headless-browser som Selenium, Playwright Hvor Puppeteer, som varetager rendering hele siden, før man læser indholdet.
Udfordring 2: Enkle forespørgsler, der mislykkes
Det er ikke altid nok blot at gentage AJAX-kaldet. Mange hjemmesider beskytter deres API, og din forespørgsel kan returnere en Fejl 403 mens browseren selv får svaret. Der mangler oplysninger i din forespørgsel. I praksis er det ofte nødvendigt at:
- Kopier headers obligatoriske som kan ses under fanen »Network« (som User-Agent Hvor Referer).
- Tilføj den symbol CSRF eller sessionscookies, når serveren kræver det.
- Kontroller statuskode svaret, så man hurtigt kan finde ud af, hvad der er problemet.
Udfordring 3: styring af lastetider
Data, der indlæses via AJAX, kan tage tid at dukke op. Hvis scraperen læser siden for tidligt, finder den intet. Der er to fremgangsmåder, afhængigt af behovet:
- EN fast pause (en sleep (i sekunder), før siden indlæses. Enkelt, men ikke særlig pålideligt.
- EN betinget ventetid, som er langt renere, via venter af Selenium : den’implicit forventning venter automatisk på, at elementerne bliver tilgængelige, mens den’udtrykkelig forventning venter netop på et bestemt element eller en bestemt betingelse, før den fortsætter.
Udfordring 4: Scraping i stor skala uden at blive blokeret
På et par sider er der ingen problemer. Men hvis du scraper tusinder af sider, så opdager hjemmesiden til sidst, hvem du er, og blokerer dig. For at holde ud i det lange løb:
- Gør omdirigere dine forespørgsler via proxyservere for at variere IP-adresserne.
- Overhold en tidsinterval mellem opkaldene i stedet for at sende det hele på én gang.
- Administrerer sidesummering og uendelig rulning gradvist, som en rigtig besøgende.
Det vigtigste er at opføre sig diskret. Jo mere din opførsel ligner en menneskes, desto mindre er risikoen for, at du bliver afbrudt.
Ofte stillede spørgsmål
Kan man bruge BeautifulSoup til at scrape en hjemmeside med AJAX?
Ikke direkte. BeautifulSoup er et bibliotek med statisk parsning : Den læser kun den HTML, der indlæses ved opstart. Da AJAX indsætter indholdet via JavaScript, skal du supplere den med et værktøj, der kan udføre dette JavaScript, såsom Selenium Hvor Playwright. Den headless browser henter den renderede HTML, og derefter sender du dette indhold videre til BeautifulSoup for parsing.
En anden mulighed: at opfange AJAX-forespørgsler og hente JSON-svaret, som ofte er nemmere at behandle end HTML.
Hvordan håndteres autentificeringsfejl eller sessionsheadere på et AJAX-websted?
Et beskyttet websted kan returnere en fejl 401 (ikke tilladt) eller 403 (forbudt), når dine forespørgsler ikke indeholder de rigtige Cookies eller HTTP-headere. Løsningen: aflytte disse oplysninger under den indledende navigation og derefter genbruge dem i dine simulerede AJAX-forespørgsler. Mange hjemmesider kræver også en CSRF-token eller en overskrift X-Requested-With, uden hvilket serveren afviser anmodningen. Det er netop derfor, at en simpel anmodning requests strander der, hvor skibet sejler forbi.
Hvordan scraper man en hjemmeside med uendelig rulning eller en “Indlæs mere”-knap?
Infinit indlæsning er en form for AJAX-indlæsning. For at automatisere den har du to muligheder:
- Identificere AJAX-anmodningen der indlæser det ekstra indhold og derefter viser det direkte (ofte en URL med en pagineringsparameter).
- Eller simulere klik på knappen “Indlæs mere” via en headless-browser som f.eks. Selenium Hvor Puppeteer, indtil alle data er hentet.
Findes der Chrome-udvidelser til AJAX-scraping?
Ja. Flere Chrome-udvidelser gør det nemmere at udføre AJAX-scraping til enkle formål, uden at man behøver at skrive en eneste linje kode. De mest kendte er:
- Web Scraper
- Data Miner
- Instant Data Scraper

Hvad er forskellen mellem et eksplicit og et implicit “wait” i Selenium eller Playwright?
- EN implicit ventetid er en generel forventning, der gælder for alle elementer. Dit script venter et bestemt tidsrum, før der genereres en fejl, hvis et element ikke vises.
- EN eksplicit ventetid er en betinget ventning, der er rettet mod et bestemt element. Den venter kun, indtil en betingelse er opfyldt.
I praksis er eksplicit ventetid er at foretrække: Det undgår unødvendige forsinkelser og mindsker fejl, når AJAX-indholdet tager lang tid at indlæse.
Kort sagt kræver scraping med AJAX lidt mere snilde, men med de rigtige metoder går intet forbi dig. Og hvad med dig? Hvilken metode bruger du til at scrape AJAX-hjemmesider? Del dine tips i kommentarfeltet.





