Lær at scrape Amazon-produkter med Python

Sidst opdateret den April 16, 2026

Hvis du har fulgt en Amazon-scrapingguide og alligevel rammer en mur af CAPTCHA’er, 503-fejl eller helt tomme resultater — så velkommen i klubben. De fleste Python-guides til Amazon scraping, som flyder rundt på nettet, er skrevet i 2022 eller 2023, og de bruger selectors og metoder, som Amazon for længst har lukket ned for.

Jeg har brugt år på at bygge dataudtræksværktøjer hos Thunderbit, og én ting kan jeg sige fra frontlinjen: Amazon er et af de sværeste sites at scrape stabilt. Platformen ændrer konstant sin HTML-struktur, bruger et seks-lags anti-bot-forsvar og viser endda forskellige sidelayouter til forskellige brugere via A/B-test. I denne guide viser jeg dig en Python Amazon-scraper, der faktisk virker i 2025 — med verificerede CSS selectors, en flerlaget anti-blokeringsstrategi og vejledning i planlægning og eksport, som de fleste guides helt springer over. Og hvis du bare skal bruge dataene uden at bøvle med Python, viser jeg også, hvordan kan klare samme opgave på omkring to klik.

Hvad er Amazon-produkt scraping?

Amazon-produkt scraping er processen, hvor man programmatisk udtrækker offentligt tilgængelige data — produktnavne, priser, ratings, antal anmeldelser, billeder, tilgængelighed og meget mere — fra Amazons produktsider og søgeresultater. I stedet for manuelt at kopiere oplysninger fra hundredvis af produkter, besøger en scraper hver side, læser HTML’en og henter de data, du har angivet, ind i et struktureret format som CSV, Excel eller en database.

Tænk på det som at hyre en udmattelsesfri praktikant, der kan besøge tusind produktsider, mens du når at drikke din morgenkaffe. Forskellen er bare, at denne praktikant aldrig staver forkert og ikke har brug for frokostpause.

Hvorfor scrape Amazon-produkter med Python?

Amazon har cirka på tværs af 30+ kategorier, drevet af omkring . Tredjepartssælgere står nu for 69% af den samlede GMV. At overvåge bare en brøkdel af det katalog manuelt er umuligt. Her er, hvorfor teams scraper Amazon:

Use CaseWho BenefitsWhat They Extract
Prisovervågning og reprissætningE-commerce teams, marketplace-sælgerePriser, tilgængelighed, sælgerinfo
KonkurrentanalyseProduktteams, brandteamsProduktfunktioner, ratings, antal anmeldelser
MarkedsresearchAnalytikere, teams for nye produkterKategoritrends, prisfordelinger
LeadgenereringSalgsteamsSælgernavne, brandinfo, kontaktdata
Affiliate marketingContent creators, dealsitesPriser, tilbud, produktdetaljer
LageropfølgningSupply chain, indkøbLagerstatus, leveringsestimeringer

Amazons prisskala alene gør automatisering nødvendig: Amazon ændrer priser , og gennemsnitsproduktets pris opdateres cirka hvert 10. minut. Til sammenligning ændrer konkurrenter som Best Buy og Walmart priser kun omkring 50.000 gange om måneden. Intet menneskeligt team kan følge med.

amazon-product-price-monitor-dashboard.webp

Python giver dig fuld kontrol over scrapingprocessen — du bestemmer, hvad der skal trækkes ud, hvordan fejl håndteres, og hvor dataene skal gemmes. Men det betyder også, at du selv står for vedligeholdelse, anti-blokering og at følge med i Amazons hyppige HTML-ændringer.

Hvad kan du scrape fra Amazon — og hvad kan du ikke?

Fra offentligt tilgængelige produktsider kan du typisk udtrække:

  • Produkttitel (navn, brand)
  • Pris (aktuel pris, førpris, tilbudspris)
  • Rating (stjerne-gennemsnit)
  • Antal anmeldelser
  • Produktbilleder (hovedbilledets URL)
  • Tilgængelighed / lagerstatus
  • ASIN (Amazon Standard Identification Number)
  • Produktbeskrivelse og bullet points
  • Sælgeroplysninger
  • Produktvarianter (størrelse, farve osv.)

Det bør du undgå:

  • Data bag login: Udvidede anmeldelsessider, personlige kontodata, ordrehistorik
  • Personlige oplysninger: Købernavne, adresser, betalingsinfo
  • Ophavsretligt indhold til genudgivelse: Produktbeskrivelser og billeder er fine til analyse, men genudgiv dem ikke som dine egne

Amazons blokerer 50+ navngivne bots (inklusive GPTBot, Scrapy og ClaudeBot) og forbyder stier som brugerkonti, indkøbskurve og ønskelister. Produktsider er ikke eksplicit forbudt, men Amazons vilkår forbyder automatiseret adgang. Domstole har generelt skelnet mellem brud på ToS (et civilretligt spørgsmål) og strafbare overtrædelser under CFAA — mere om lovlighed til sidst i guiden.

De værktøjer og biblioteker du skal bruge

Her er Python-stakken til denne guide:

BibliotekFormålHvorfor vi bruger det
requestsHTTP-forespørgslerSimpelt, bredt understøttet
beautifulsoup4HTML-parsingNem udtrækning via CSS selectors
lxmlHurtig HTML-parserBruges som parser-backend til BeautifulSoup
curl_cffiTLS-fingerprint impersonationKritisk for at omgå Amazons detektion
pandasDatastrukturering og eksportDataFrames, CSV/Excel-eksport

Valgfrit (til JavaScript-renderet indhold):

  • selenium eller playwright — headless browser-automatisering

Sådan sætter du dit Python-miljø op

Åbn terminalen og kør:

1mkdir amazon-scraper && cd amazon-scraper
2python -m venv venv
3source venv/bin/activate  # På Windows: venv\Scripts\activate
4pip install requests beautifulsoup4 lxml curl_cffi pandas

Tjek at alt er installeret korrekt:

1import requests, bs4, curl_cffi, pandas
2print("Alt er godt!")

Hvis du ser "Alt er godt!" uden fejl, er du klar.

laptop-coding-workspace.webp

Hvorfor de fleste Amazon-scrapingguides går i stykker (og hvorfor denne er anderledes)

Det her er den del, de fleste guides springer over — og det er nok også grunden til, at du læser denne artikel.

Amazon opdaterer ofte sin HTML-struktur, class-navne og element-ID’er. Scrapingmiljøet rapporterer, at på grund af ændringer i DOM’en og fingerprinting. Det mest berømte offer? Selector’en #priceblock_ourprice, som optrådte i hundredvis af guides fra 2018–2023. Det ID findes ikke længere på Amazons produktsider.

Her er en hurtig sammenligning af, hvad der er ødelagt, og hvad der virker nu:

Data PointBroken Selector (Pre-2024)Working 2025 Selector
Pris#priceblock_ourpricediv#corePriceDisplay_desktop_feature_div span.a-price .a-offscreen
Titel#productTitlespan#productTitle (virker stadig)
Ratingspan.a-icon-alt (nogle gange forkert kontekst)#acrPopover span.a-icon-alt
Antal anmeldelser#acrCustomerReviewCountspan#acrCustomerReviewText
Tilgængelighed#availability spandiv#availability span.a-size-medium

Alle kodeeksempler i denne guide er testet på live Amazon-sider i 2025. Jeg viser de faktiske CSS selectors sammen med forventet output — ikke copy-paste fra 2022.

Før du går i gang

  • Sværhedsgrad: Mellem (grundlæggende Python-kendskab antages)
  • Tidsforbrug: Ca. 30–45 minutter for hele guiden; ca. 10 minutter for den basale scraper
  • Det skal du bruge: Python 3.9+, Chrome-browser (til at inspicere Amazon-sider), en terminal og eventuelt , hvis du vil sammenligne den no-code tilgang

Trin 1: Send din første forespørgsel til Amazon

Gå til en hvilken som helst Amazon-produktside i din browser, og kopiér URL’en. Vi starter med en simpel requests.get():

1import requests
2url = "https://www.amazon.com/dp/B0DGNFM9YJ"
3response = requests.get(url)
4print(response.status_code)
5print(response.text[:500])

Når du kører dette, får du næsten helt sikkert en 503 statuskode eller en side, der siger "To discuss automated access to Amazon data please contact…". Det er Amazons WAF (Web Application Firewall), der opdager dit Python-script. En ren requests.get() uden korrekte headers giver kun omkring mod Amazon.

Du bør se noget i stil med: 503 og en blokside i HTML’en. Det er forventet — vi retter det i næste trin.

Trin 2: Sæt brugerdefinerede headers og TLS impersonation op

Det er ikke længere nok bare at tilføje en User-Agent-header. Amazon sammenligner dine HTTP-headers med dit TLS-fingerprint. Hvis du påstår at være Chrome 120, men TLS-handshaken afslører Python’s requests-bibliotek, bliver du .

Den mest pålidelige tilgang i 2025 er at bruge curl_cffi med browser-impersonation:

1from curl_cffi import requests as cfreq
2headers = {
3    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8",
4    "Accept-Language": "en-US,en;q=0.9",
5    "Accept-Encoding": "gzip, deflate, br",
6    "Referer": "https://www.google.com/",
7    "DNT": "1",
8    "Connection": "keep-alive",
9    "Upgrade-Insecure-Requests": "1",
10}
11url = "https://www.amazon.com/dp/B0DGNFM9YJ"
12response = cfreq.get(url, headers=headers, impersonate="chrome124")
13print(response.status_code)
14print(len(response.text))

Med curl_cffi, der impersonerer Chrome 124, stiger succesraten til cirka — en 47x forbedring i forhold til ren requests. Nu bør du se en 200 statuskode og et langt længere HTML-svar (100.000+ tegn).

Hvis du stadig får 503, så prøv en anden impersonate-værdi (f.eks. "chrome131") eller vent kort og prøv igen.

Trin 3: Parse HTML’en og udtræk produktdata

Nu hvor vi har hele HTML’en, lad os udtrække dataene med BeautifulSoup og verificerede 2025 selectors:

1from bs4 import BeautifulSoup
2soup = BeautifulSoup(response.text, "lxml")
3# Produkttitel
4title_el = soup.select_one("span#productTitle")
5title = title_el.get_text(strip=True) if title_el else None
6# Pris
7price_el = soup.select_one(
8    "div#corePriceDisplay_desktop_feature_div span.a-price .a-offscreen"
9)
10if not price_el:
11    price_el = soup.select_one("span.priceToPay .a-offscreen")
12if not price_el:
13    price_el = soup.select_one(".apexPriceToPay .a-offscreen")
14price = price_el.get_text(strip=True) if price_el else None
15# Rating
16rating_el = soup.select_one("#acrPopover span.a-icon-alt")
17rating = rating_el.get_text(strip=True) if rating_el else None
18# Antal anmeldelser
19reviews_el = soup.select_one("span#acrCustomerReviewText")
20reviews = reviews_el.get_text(strip=True) if reviews_el else None
21# Tilgængelighed
22avail_el = soup.select_one("div#availability span")
23availability = avail_el.get_text(strip=True) if avail_el else None
24# Hovedbilledets URL
25img_el = soup.select_one("#landingImage")
26image_url = img_el.get("src") if img_el else None
27print(f"Titel: {title}")
28print(f"Pris: {price}")
29print(f"Rating: {rating}")
30print(f"Anmeldelser: {reviews}")
31print(f"Tilgængelighed: {availability}")
32print(f"Billede: {image_url}")

Forventet output (eksempel):

1Titel: Apple AirPods Pro (2. generation) med USB-C
2Pris: $189.99
3Rating: 4.7 ud af 5 stjerner
4Anmeldelser: 98,432 ratings
5Tilgængelighed: På lager
6Billede: https://m.media-amazon.com/images/I/61SUj2...

Bemærk de flere fallback-selectors til prisen — Amazon bruger forskellige containere afhængigt af produkttype, tilbudsstatus og A/B-testvariant. Ved at omslutte hvert udtræk i en betinget kontrol undgår du, at din scraper crasher, når en selector ikke matcher.

Trin 4: Scrape flere produkter fra søgeresultater

For at bygge et rigtigt datasæt skal du starte fra en Amazon-søgeresultatside, hente ASIN’er og derefter scrape hver produktside.

1import time
2import random
3def get_search_asins(keyword, max_pages=1):
4    """Hent ASIN'er fra Amazons søgeresultater."""
5    asins = []
6    for page in range(1, max_pages + 1):
7        search_url = f"https://www.amazon.com/s?k={keyword}&page={page}"
8        resp = cfreq.get(search_url, headers=headers, impersonate="chrome124")
9        if resp.status_code != 200:
10            print(f"Søgeside {page} returnerede {resp.status_code}")
11            break
12        search_soup = BeautifulSoup(resp.text, "lxml")
13        results = search_soup.select('div[data-component-type="s-search-result"]')
14        for r in results:
15            asin = r.get("data-asin")
16            if asin:
17                asins.append(asin)
18        print(f"Side {page}: fandt {len(results)} produkter")
19        time.sleep(random.uniform(2, 5))  # Hensynsfuld pause
20    return asins
21asins = get_search_asins("wireless+earbuds", max_pages=2)
22print(f"Indsamlede {len(asins)} ASIN'er")

Hver ASIN kan omsættes til en ren produkt-URL: https://www.amazon.com/dp/{ASIN}. Det er mere pålideligt end at bruge de fulde søgeresultat-URL’er, som kan indeholde sessionsspecifikke parametre.

Trin 5: Håndter pagination og scrape i stor skala

Lad os nu kombinere søgeindsamling og scraping af produktsider i en fuld pipeline:

1import pandas as pd
2def scrape_product(asin):
3    """Scrape en enkelt Amazon-produktside."""
4    url = f"https://www.amazon.com/dp/{asin}"
5    try:
6        resp = cfreq.get(url, headers=headers, impersonate="chrome124")
7        if resp.status_code != 200:
8            return None
9        soup = BeautifulSoup(resp.text, "lxml")
10        title_el = soup.select_one("span#productTitle")
11        price_el = (
12            soup.select_one("div#corePriceDisplay_desktop_feature_div span.a-price .a-offscreen")
13            or soup.select_one("span.priceToPay .a-offscreen")
14            or soup.select_one(".apexPriceToPay .a-offscreen")
15        )
16        rating_el = soup.select_one("#acrPopover span.a-icon-alt")
17        reviews_el = soup.select_one("span#acrCustomerReviewText")
18        avail_el = soup.select_one("div#availability span")
19        img_el = soup.select_one("#landingImage")
20        return {
21            "asin": asin,
22            "title": title_el.get_text(strip=True) if title_el else None,
23            "price": price_el.get_text(strip=True) if price_el else None,
24            "rating": rating_el.get_text(strip=True) if rating_el else None,
25            "reviews": reviews_el.get_text(strip=True) if reviews_el else None,
26            "availability": avail_el.get_text(strip=True) if avail_el else None,
27            "image_url": img_el.get("src") if img_el else None,
28            "url": url,
29        }
30    except Exception as e:
31        print(f"Fejl ved scraping af {asin}: {e}")
32        return None
33# Scrape alle indsamlede ASIN'er
34products = []
35for i, asin in enumerate(asins):
36    print(f"Scraper {i+1}/{len(asins)}: {asin}")
37    product = scrape_product(asin)
38    if product:
39        products.append(product)
40    time.sleep(random.uniform(2, 5))  # Tilfældig pause mellem forespørgsler
41df = pd.DataFrame(products)
42print(f"\nScrapede {len(df)} produkter med succes")
43print(df.head())

Den tilfældige pause mellem 2–5 sekunder er afgørende. Perfekt regelmæssig timing (f.eks. præcis 3 sekunder hver gang) ser mistænkelig ud for Amazons adfærdsanalyse. Tilfældige intervaller efterligner menneskelig browsing.

Trin 6: Gem scrape-data fra Amazon som CSV

1df.to_csv("amazon_products.csv", index=False, encoding="utf-8-sig")
2print("Gemt i amazon_products.csv")

Du burde nu have en ren CSV med kolonner for ASIN, titel, pris, rating, anmeldelser, tilgængelighed, billed-URL og produkt-URL. Det er her, de fleste guides stopper — men hvis du bygger en reel arbejdsgang, er CSV kun begyndelsen.

Anti-blokering i dybden: Sådan holder du din scraper kørende

At blive blokeret er for alle, der prøver at scrape Amazon-produkter med Python. Amazons sekslagsforsvar inkluderer IP-reputation, TLS fingerprinting, miljøtjek i browseren, adfærdsbiometri, CAPTCHA’er og ML-drevet anomalidetektion. Nedenfor er en flerlaget strategi til at håndtere hver del.

Rotér User-Agents og komplette headers

Én statisk User-Agent bliver hurtigt flagget. Rotér gennem en liste over aktuelle browserstrenge:

1import random
2USER_AGENTS = [
3    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36",
4    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36",
5    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0",
6    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/26.0 Safari/605.1.15",
7]
8def get_headers():
9    return {
10        "User-Agent": random.choice(USER_AGENTS),
11        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
12        "Accept-Language": "en-US,en;q=0.9",
13        "Accept-Encoding": "gzip, deflate, br",
14        "Referer": "https://www.google.com/",
15        "DNT": "1",
16        "Connection": "keep-alive",
17    }

En detalje, der ofte driller: din Accept-Language skal matche den geografiske placering, som din IP antyder. Hvis du sender Accept-Language: en-US fra en tysk IP, er det et rødt flag.

TLS fingerprint impersonation med curl_cffi

Vi dækkede det i trin 2, men det er værd at understrege: denne ene teknik giver den største forbedring i succesrate. Standard Python requests rammer omkring 2% succes mod Amazon. Med curl_cffi-impersonation ligger du omkring 94%. Det er forskellen på en fungerende scraper og en ødelagt.

1from curl_cffi import requests as cfreq
2# Rotér også impersonation-targets
3BROWSERS = ["chrome120", "chrome124", "chrome131"]
4response = cfreq.get(
5    url,
6    headers=get_headers(),
7    impersonate=random.choice(BROWSERS),
8)

Proxy-rotation

Hvis du scraper mere end nogle få sider, har du brug for proxy-rotation. Amazon følger IP-adresser og blokerer enhver enkelt IP, der sender for mange forespørgsler.

1PROXIES = [
2    "http://user:pass@proxy1.example.com:8080",
3    "http://user:pass@proxy2.example.com:8080",
4    "http://user:pass@proxy3.example.com:8080",
5]
6proxy = random.choice(PROXIES)
7response = cfreq.get(
8    url,
9    headers=get_headers(),
10    impersonate="chrome124",
11    proxies={"http": proxy, "https": proxy},
12)

Residential proxies er mere effektive end datacenter-proxies (Amazon blokerer proaktivt datacenter-IP-ranges), men de er også dyrere. Til et mindre projekt kan du starte med en og skalere op efter behov.

Rate limiting og exponential backoff

Ingen konkurrentartikel, jeg fandt, dækker dette, men det er vigtigt. Når du får en 503 eller CAPTCHA-respons, skal du ikke bare prøve igen med det samme — det er den hurtigste vej til et permanent forbud.

1import time
2import random
3def fetch_with_backoff(url, max_retries=3):
4    """Hent en URL med exponential backoff ved fejl."""
5    for attempt in range(max_retries):
6        response = cfreq.get(
7            url,
8            headers=get_headers(),
9            impersonate=random.choice(BROWSERS),
10        )
11        if response.status_code == 200:
12            return response
13        # Exponential backoff med jitter
14        wait = min(2 ** attempt + random.uniform(0, 1), 30)
15        print(f"Forsøg {attempt+1} mislykkedes ({response.status_code}). Venter {wait:.1f}s...")
16        time.sleep(wait)
17    return None  # Alle forsøg opbrugt

Formlen wait = min(2^attempt + jitter, max_delay) sikrer, at dine pauser vokser (2s, 4s, 8s...) uden nogensinde at blive urimeligt lange. Den tilfældige jitter gør også, at dit retry-mønster ikke kan fingerprintes.

Selenium- eller Playwright-fallback til JS-renderet indhold

Nogle Amazon-sider (især dem med dynamiske priswidgets eller variantvælgere) kræver JavaScript for at blive renderet helt. Når curl_cffi returnerer ufuldstændig HTML, er en headless browser din fallback:

1from playwright.sync_api import sync_playwright
2def scrape_with_browser(url):
3    with sync_playwright() as p:
4        browser = p.chromium.launch(headless=True)
5        page = browser.new_page()
6        page.goto(url, wait_until="domcontentloaded")
7        page.wait_for_timeout(3000)  # Lad JS blive renderet
8        html = page.content()
9        browser.close()
10        return html

Det er langsommere — 3–5 sekunder pr. side mod under 1 sekund med curl_cffi. Brug det kun, når det er nødvendigt.

Efter min erfaring håndterer curl_cffi 90%+ af Amazons produktsider uden en browser.

Anti-blokeringsoversigt

TeknikSværhedsgradEffektivitetDækket af de fleste guides?
Brugerdefineret User-AgentLetLav (Amazon spotter mønstre)Ja
Fuld header-rotationLetMellemSjældent
TLS impersonation (curl_cffi)MellemHøj (~94% succes)Næsten aldrig
Proxy-rotationMellemHøjKort nævnt, hvis overhovedet
Rate limiting + exponential backoffLetMellemNej
Selenium/Playwright-fallbackMellemHøj (til JS-indhold)Nævnt, ikke demonstreret

Mere end CSV: Eksportér scrape-data fra Amazon til Google Sheets, Airtable og mere

Hver guide, jeg har gennemgået, stopper ved CSV-eksport. Men rigtige forretningsprocesser har brug for data i Google Sheets, databaser eller værktøjer som Airtable og Notion.

Eksportér til Google Sheets med gspread

Først skal du oprette en Google service account (engangsopsætning):

  1. Gå til → APIs & Services → Credentials
  2. Opret en service account og hent JSON-nøglefilen
  3. Gem den i ~/.config/gspread/service_account.json
  4. Del dit mål-regneark med client_email fra JSON-filen

Derefter:

1import gspread
2from gspread_dataframe import set_with_dataframe
3gc = gspread.service_account()
4sh = gc.open("Amazon Scrape Data")
5worksheet = sh.sheet1
6set_with_dataframe(worksheet, df)
7print("Data eksporteret til Google Sheets!")

Det skriver hele din DataFrame direkte ind i et Google Sheet — live, delbart og klar til dashboards.

Gem i SQLite til lokal analyse

Til større datasæt eller historik er SQLite perfekt — ingen serveropsætning, bare én fil:

1import sqlite3
2conn = sqlite3.connect("amazon_products.db")
3df.to_sql("products", conn, if_exists="append", index=False)
4print(f"Gemte {len(df)} produkter i SQLite")
5# Senere forespørgsel:
6historical = pd.read_sql_query(
7    "SELECT * FROM products WHERE price IS NOT NULL ORDER BY rowid DESC LIMIT 100",
8    conn,
9)

Det no-code alternativ

Hvis du ikke vil vedligeholde Python-scripts til eksport, tilbyder gratis eksport til Google Sheets, Airtable, Notion, Excel, CSV og JSON — inklusive billedfelter, der vises direkte i Airtable og Notion. Ingen gspread-opsætning, ingen API-legitimationsoplysninger, ingen kode overhovedet. For teams, der vil have data ind i de værktøjer, de allerede bruger, sparer det masser af tid.

Planlæg automatiserede Amazon-scrapes — det manglende kapitel

Prisovervågning og lagertracking kræver gentagne scrapes, ikke engangskørsler. Alligevel fandt jeg ikke én eneste konkurrentartikel, der dækker planlægning. Her er, hvordan du automatiserer din Python-scraper.

Cron-jobs (Linux/macOS)

Åbn dit crontab:

1crontab -e

Tilføj en linje, der kører din scraper dagligt kl. 6 om morgenen:

10 6 * * * cd /path/to/amazon-scraper && /path/to/venv/bin/python scraper.py >> ~/scraper.log 2>&1

Eller hver 6. time:

10 */6 * * * cd /path/to/amazon-scraper && /path/to/venv/bin/python scraper.py >> ~/scraper.log 2>&1

Windows Task Scheduler

Opret en batch-fil run_scraper.bat:

1@echo off
2cd /d "C:\path\to\amazon-scraper"
3call venv\Scripts\activate
4python scraper.py
5deactivate

Åbn derefter Task Scheduler → Create Basic Task → sæt din trigger (Daily, Hourly) → Action: "Start a program" → vælg run_scraper.bat.

GitHub Actions (gratis niveau)

Til en cloud-baseret tidsplan uden egen infrastruktur:

1name: Amazon Scraper
2on:
3  schedule:
4    - cron: "0 6 * * *"  # Dagligt kl. 6 UTC
5  workflow_dispatch:       # Manuel trigger
6jobs:
7  scrape:
8    runs-on: ubuntu-latest
9    steps:
10      - uses: actions/checkout@v3
11      - name: Set up Python
12        uses: actions/setup-python@v4
13        with:
14          python-version: "3.11"
15      - name: Install dependencies
16        run: pip install -r requirements.txt
17      - name: Run scraper
18        run: python scraper.py
19      - name: Commit results
20        run: |
21          git config user.name 'GitHub Actions'
22          git config user.email 'actions@github.com'
23          git add data/
24          git diff --staged --quiet || git commit -m "Opdater scrape-data"
25          git push

Gem proxy-legitimationsoplysninger i GitHub Secrets, og så har du en gratis, automatiseret scraping-pipeline.

No-code alternativ: Thunderbits Scheduled Scraper

For teams, der ikke vil rode med cron-syntaks eller cloud-infrastruktur, tilbyder Thunderbit en indbygget . Du beskriver tidsplanen i almindeligt sprog (f.eks. "hver dag kl. 8" eller "hver mandag"), tilføjer dine Amazon-URL’er og klikker på "Schedule." Ingen terminal, ingen YAML-filer, ingen deploy-pipeline. Det er især nyttigt for e-commerce-teams, der kører løbende pris- eller lagerovervågning.

Python DIY vs. Scraper API vs. No-Code: Hvilken tilgang skal du vælge?

Det er et spørgsmål, jeg ser konstant på fora, og ingen topplaceret artikel giver et struktureret svar. Så her er min ærlige vurdering:

KriteriumPython + BS4/curl_cffiScraper API (ScraperAPI, Oxylabs)No-Code (Thunderbit)
Opsætningstid30–60 min10–20 min~2 minutter
Kræver kodeJa (Python)Ja (API-kald)Nej
Anti-blokering indbyggetNej (DIY)JaJa
Håndterer JS-renderingKun med Selenium/PlaywrightVarierer efter udbyderJa (Browser- eller Cloud-mode)
PlanlægningDIY (cron/cloud)Nogle tilbyder detIndbygget
PrisGratis (+ proxyomkostninger)$30–100+/md.Gratis niveau tilgængeligt
VedligeholdelseHøj (selectors går i stykker)LavIngen (AI tilpasser sig)
Bedst tilUdviklere, der vil have fuld kontrolSkala og stabilitet i volumenHurtighed, ikke-udviklere, forretningsbrugere

Python er det rigtige valg, hvis du vil lære, tilpasse alle detaljer og ikke har noget imod løbende vedligeholdelse. Scraper APIs håndterer anti-blokering for dig, men kræver stadig kode. Og Thunderbit er den hurtigste vej for salg, e-commerce-ops eller alle, der bare skal bruge dataene — ingen selectors, ingen kode, ingen vedligeholdelse, når Amazon ændrer sin HTML.

Sådan scraper Thunderbit Amazon-produkter på 2 klik

Jeg er selvfølgelig farvet — mit team byggede det her. Men workflowet er virkelig så enkelt:

  1. Installer
  2. Gå til en Amazon-søgeresultatside eller produktside
  3. Klik "AI Suggest Fields" (eller brug den indbyggede Amazon-scraper-skabelon)
  4. Klik "Scrape"

Thunderbits AI læser siden, identificerer datastrukturen og udtrækker alt i en ren tabel. Du kan eksportere til Excel, Google Sheets, Airtable eller Notion gratis. Den store gevinst: når Amazon ændrer sin HTML næste uge (og det gør den), tilpasser Thunderbits AI sig automatisk. Ingen ødelagte scripts, ingen selector-opdateringer.

Til berigelse af produktlister med data fra undersider bruger Thunderbits Subpage Scraping-funktion automatisk links til produktsider og henter ekstra felter som billeder, beskrivelser og varianter — noget der kræver en del ekstra kode i Python.

Tips til at holde din Python Amazon-scraper kørende på lang sigt

Hvis du går Python-vejen, sådan minimerer du vedligeholdelsesbesvær:

  • Tjek selectors regelmæssigt. Amazon ændrer dem ofte. Bogmærk denne artikel — jeg opdaterer selector-tabellen, når tingene ændrer sig.
  • Overvåg din succesrate. Følg forholdet mellem 200-svar og 503/CAPTCHA’er. Sæt en alarm op (bare en simpel e-mail), når din succesrate falder under 80%.
  • Gem rå HTML. Gem hele HTML-responsen sammen med de parse-de data. Hvis selectors ændrer sig, kan du genparse historiske data uden at scrape igen.
  • Rotér proxies og User-Agents ofte. Statiske fingerprints bliver flagget inden for få timer i stor skala.
  • Brug exponential backoff. Prøv aldrig igen med det samme efter en blokering.
  • Kør i Docker. Pak din scraper i en Docker-container for nem deployment og portabilitet.
  • Tilføj datavalidering. Tjek at priser er numeriske, ratings ligger mellem 1–5, og titler ikke er tomme. Ét team rapporterede en efter at have tilføjet valideringslag.

Eller hvis alt det lyder som mere arbejde, end du havde tænkt dig, så overvej om et no-code-værktøj som Thunderbit passer bedre til dit behov. Der er ingen skam i at vælge den hurtigste vej — jeg har brugt nok år på at debugge scrapers til at vide, at det bedste kodeeksempel nogle gange er det, du ikke behøver skrive.

Juridiske og etiske overvejelser ved scraping af Amazon

Da det altid dukker op i enhver samtale om Amazon scraping, er her en hurtig note om det juridiske landskab:

  • Scraping af offentligt tilgængelige data er generelt lovligt i USA. Den skelsættende dom (2022) fastslog, at adgang til offentlige data ikke bryder CFAA. Senere understregede (2024) og (2024) samme princip.
  • Amazons ToS forbyder automatiseret adgang. Det er et civilretligt spørgsmål (kontraktbrud), ikke et strafretligt. Domstole har generelt skelnet mellem de to.
  • Amazon v. Perplexity (2025) er en aktiv sag om AI-scraping af Amazon-sider. Der blev udstedt et foreløbigt forbud i marts 2026. Det er værd at følge.
  • Hold dig til offentlige sider. Scrape ikke loginbeskyttet indhold, persondata eller noget bag autentificering.
  • Respekter rate limits. Overbelast ikke Amazons servere. En pause på 2–5 sekunder mellem forespørgsler er rimelig.
  • Brug data ansvarligt. Scrape til analyse, ikke til genudgivelse af ophavsretligt indhold.
  • Konsulter juridisk rådgivning ved storstilet kommerciel brug, især hvis du er i EU (GDPR gælder for persondata).

For et dybere dyk, se vores guide om .

Afrunding

Nu har du en fungerende Python Amazon-scraper med verificerede 2025-selectors, en flerlaget anti-blokeringsstrategi, der går langt videre end bare at "tilføje en User-Agent", praktiske planlægningsmuligheder til løbende overvågning og eksportmetoder, der får dine data ind i Google Sheets, databaser eller hvilket som helst værktøj dit team bruger.

Kort opsummering:

  • Python + curl_cffi + BeautifulSoup giver dig fuld kontrol og omkring 94% succesrate, når det kombineres med TLS impersonation
  • Anti-blokering kræver flere lag: header-rotation, TLS impersonation, proxy-rotation, rate limiting og exponential backoff
  • Planlægning gør et engangsscript til en kontinuerlig overvågningspipeline (cron, GitHub Actions eller Thunderbits indbyggede scheduler)
  • Eksport ud over CSV — Google Sheets, SQLite, Airtable, Notion — er dér, den reelle forretningsværdi ligger
  • Thunderbit tilbyder et 2-kliks alternativ til ikke-udviklere eller alle, der hellere vil bruge tiden på at analysere data end at debugge selectors

Hvis du vil prøve koden, er alt i denne guide klar til at kopiere og køre. Og hvis du hellere vil springe kodning helt over, kan du med teste no-code-tilgangen på Amazon med det samme.

For mere, se vores guides om , og . Du kan også se trin-for-trin walkthroughs på .

God scraping — og må dine selectors overleve indtil næste Amazon-opdatering.

Ofte stillede spørgsmål

1. Hvorfor bliver min Python Amazon-scraper blokeret efter få forespørgsler?

Amazon bruger et sekslags forsvarssystem: IP-reputation, TLS fingerprinting (JA3/JA4), browsermiljø-detektion, adfærdsbiometri, CAPTCHA-udfordringer og ML-drevet anomalidetektion. Et simpelt requests-script med kun en User-Agent-header opnår kun omkring succes. Du har brug for TLS impersonation (curl_cffi), fuld header-rotation, proxy-rotation og rate limiting med tilfældig jitter for at bevare stabil adgang.

2. Hvilke Python-biblioteker er bedst til at scrape Amazon-produkter i 2025?

curl_cffi til TLS-impersoneret HTTP-forespørgsler (den største enkeltforbedring), BeautifulSoup4 med lxml til HTML-parsing, pandas til datastrukturering og eksport, samt Selenium eller Playwright som fallback til JavaScript-renderet indhold. Python bruges af af scraping-udviklere.

3. Er det lovligt at scrape Amazon-produktdata?

Scraping af offentligt tilgængelige data er generelt lovligt i USA, understøttet af afgørelser som hiQ v. LinkedIn og Meta v. Bright Data. Amazons vilkår forbyder automatiseret adgang, men domstole skelner mellem brud på vilkår (civilretligt) og strafbare overtrædelser. Undgå altid loginbeskyttet indhold, respekter rate limits, og søg juridisk rådgivning ved storstilet kommerciel brug.

4. Kan jeg scrape Amazon uden at skrive kode?

Ja. Værktøjer som lader dig scrape Amazon-produkter på 2 klik med en Chrome-extension. Dets AI-drevne feltgenkendelse strukturerer automatisk dataene, og du kan eksportere til Excel, Google Sheets, Airtable eller Notion gratis. Når Amazon ændrer sin HTML, tilpasser Thunderbits AI sig uden manuelle opdateringer.

5. Hvor ofte ændrer Amazon sine HTML-selectors, og hvordan holder jeg min scraper opdateret?

Ofte og uden varsel. Scrapingmiljøet rapporterer, at af crawlers har brug for ugentlige rettelser på grund af DOM-ændringer. For at være på forkant bør du overvåge din scrapers succesrate, gemme rå HTML til senere parsing og jævnligt teste selectors på live sider. Alternativt tilpasser AI-drevne værktøjer som Thunderbit sig automatisk og fjerner den vedligeholdelsesbyrde.

Læs mere

Indholdsfortegnelse

Prøv Thunderbit

Hent leads og andre data med kun 2 klik. Drevet af AI.

Hent Thunderbit Det er gratis
Udtræk data med AI
Overfør nemt data til Google Sheets, Airtable eller Notion
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week