Hur jag skrapar Yelp med Python utan att bli blockerad

Senast uppdaterad April 15, 2026
Hur jag skrapar Yelp med Python utan att bli blockerad

Yelp har 330 miljoner samlade recensioner fördelade över 8,4 miljoner aktiva företagssidor — och att få ut den datan i ett användbart format har aldrig varit svårare. Yelps nedslag mot bottar 2024–2025 har i praktiken slagit sönder de flesta befintliga Python-guider för scraping, utan att säga det rakt ut.

Om du nyligen har försökt köra en Yelp scraper och mötts av en vägg av 403-fel, tomma HTML-svar eller CAPTCHA-rutor som inte fanns där för sex månader sedan, så inbillar du dig inte. Yelp använder nu TLS/JA3-fingeravtryck, roterande obfuskterade CSS-klassnamn och aggressiv poängsättning av IP-rykte — vilket betyder att den gamla requests + BeautifulSoup-metoden som fortfarande rekommenderas i nästan varje guide faller redan vid första anropet. Jag har lagt veckor på att testa olika angreppssätt mot Yelps nuvarande skydd, och i den här guiden går jag igenom allt som faktiskt fungerar 2025: det officiella Fusion API:t (och varför det sannolikt inte räcker), ett komplett Python-arbetsflöde med en flerskiktsstrategi mot blockering, samt ett 2-klicks no-code-alternativ med Thunderbit för dig som bara vill ha datan utan att offra hela helgen på felsökning.

Testa Thunderbit för att skrapa Yelp

Varför skrapa Yelp med Python (och vem har faktiskt nytta av det)

Innan du skriver en enda rad kod: vad är egentligen affärsnyttan med Yelp-data? Plattformen är inte bara en recensionssajt för restauranger — den fungerar i praktiken som en levande databas över lokala företag med strukturerad kontaktinformation, betyg, kategorier, öppettider och hundratals miljoner kundrecensioner.

yelp_stats_bd6a43108e.png

Här är vilka som tjänar mest på det och vad de brukar hämta ut:

AnvändningsområdeViktiga fältVarför det spelar roll
Försäljning & leadgenereringFöretagsnamn, telefon, webbplats, adress, kategori, betygBygg riktade prospektlistor över lokala småföretag — 4 av 5 Yelp-användare är köpredo när de kommer in
KonkurrensbevakningRecensioner, stjärnbetyg, antal recensioner, sentimentFölj konkurrenters rykte, hitta luckor i tjänsten, spåra trender
Marknadsresearch & NLPFull recensions-text, datum, metadata om recensenterSentimentanalys, topic modeling — Yelp-recensioner är ett av de mest använda NLP-korpusen i akademisk forskning
Fastigheter & platsvalFöretagstäthet, kategori-mix, recensionskvalitet per områdeVal av plats för franchise och detaljhandel — Yelp säljer Location Intelligence som en licensierad B2B-produkt just för detta
E-handel & driftPrissignaler, kundklagomål, öppettiderFölj hur konkurrenter bedöms och identifiera driftsmönster

Det gemensamma temat är enkelt: det verkliga målet är strukturerad data, och Python är bara ett sätt att nå dit. Vissa vill ha full programmatisk kontroll. Andra behöver bara ett kalkylblad med kontaktuppgifter till rörmokare i Austin. Båda spåren täcks här.

Yelp Fusion API vs. Python web scraping: vilket ska du välja?

De flesta guider hoppar över den här avgörande frågan och går direkt till kod utan att ens utvärdera om det officiella Yelp Fusion API:t (numera omprofilerat som "Yelp Places API") hade räckt. Enligt min erfarenhet sparar den bedömningen timmar av onödigt arbete — eftersom API:t är perfekt för vissa saker och helt otillräckligt för andra.

Vad Fusion API:t faktiskt ger dig

Fusion API:t ger strukturerad företagssökning, företagsdetaljer, autocomplete och en endpoint för recensioner. Det är auktoriserat, väldokumenterat och kräver inga anti-bot-trick.

Men det är på recensions-endpointen det faller isär. Här är vad Yelps personal själva har bekräftat på GitHub:

"Yelp API returnerar inte fullständig recensions-text. Som standard ges tre utdrag på 160 tecken." — Svar från Yelp-personal, GitHub Issue #163

Det är inte ett fel — det är avsiktligt. API:t är begränsat till 3 recensionsutdrag (7 på Premium), vart och ett avkortat till ungefär 160 tecken. Ingen recensionsmetadata (nyttig/rolig/cool-röster), ingen historik för recensenten, inga svar från ägaren. Och daglig gräns för nya kunder sänktes till 300–500 anrop/dag efter maj 2023 — ner från 5 000. Startpriset ligger på $29/månad.

Beslutsramen

FaktorYelp Fusion APIPython web scrapingThunderbit (no-code)
Fullständiga recensioner❌ Bara 3 utdrag (~160 tecken vardera)✅ Alla recensioner via GraphQL✅ Alla synliga recensioner
Hastighetsgränser300–500/dag (nya); 5 000 (äldre)Hanteras själv (proxybudget)Kreditbaserat
Uppstartstid~15 min (API-nyckel + SDK)Timmar till dagar~2 minuter
Företagsfält~20 strukturerade fältObegränsat (tolka HTML/JSON)AI-föreslagna fält
Hantering av anti-botN/A (auktoriserat)Måste byggas självSköts automatiskt
Juridisk risk✅ Auktoriserat⚠️ Gråzon i villkoren⚠️ Samma som scraping
KostnadMinst $29/månGratis (+ proxykostnader $0,75–$4/GB)Gratis nivå finns
UnderhållLågt (API:t är stabilt)Högt (selectors går sönder, anti-bot skärps)Lågt (AI anpassar sig igen)

Välj Fusion API:t om: du behöver grundläggande företagsinfo, småskalig uppslagning eller en auktoriserad integration — och 3 recensionsutdrag per företag räcker.

Välj Python scraping om: du behöver full recensions-text, alla recensioner för ett företag, recensionsmetadata, fler än 240 resultat per sökning eller om budgeten ligger under $29/månad.

Välj Thunderbit om: du vill ha datan snabbt utan att skriva eller underhålla kod. Mer om det i no-code-delen nedan.

Snabbaste genvägen: skrapa Yelp med Thunderbit (ingen Python behövs)

Innan vi går in på Python-delen, här är snabbaste vägen för dig som egentligen bara vill åt datan — inte öva på kod. Alla konkurrentguider utgår från att du kan Python, men i mitt arbete på Thunderbit har jag sett att en stor del av alla som söker på "scrape Yelp" är säljare, operationschefer och småföretagare som bara vill ha ett kalkylblad med lokala företag — inte en crash course i TLS-fingeravtryck.

Thunderbit levereras redan med färdiga Yelp-mallar:

Så fungerar det i praktiken

  1. Öppna en Yelp-sida med sökresultat eller en företagssida i Chrome
  2. Klicka på AI Suggest Fields i Thunderbit-tillägget — AI:n läser sidan och föreslår kolumner (företagsnamn, betyg, antal recensioner, prisnivå, kategori, adress, telefon, URL)
  3. Klicka på Scrape — klart

Med de färdiga Yelp-mallarna är det ännu enklare: öppna mallen och klicka på Scrape.

Subpage scraping sköter berikningen automatiskt — börja från en Yelp-sida med sökresultat, aktivera subpage scraping, så besöker Thunderbit varje företagssida för att hämta öppettider, fullständiga recensioner, webbplats, bilder och bekvämligheter. Ingen extra konfiguration.

Sidnumrering sker automatiskt — både klickbaserad och scrollbaserad, direkt ur lådan. (Mer om hur det fungerar finns i vår guide om paginering.)

Export ingår gratis i alla nivåer — Excel, Google Sheets, Airtable, Notion, CSV, JSON. Inget pandas, ingen kod för CSV-skrivning.

Tidsjämförelse

TidPython-scraperThunderbit
Första körningenTimmar till dagar (skriva selectors, hantera paginering, proxies, retry-logik)~30 sekunder med den färdiga Yelp-mallen
När Yelp ändrar markupSkriv om selectors manuelltKlicka på AI Suggest Fields igen — anpassar sig automatiskt
När IP blir bannadFelsök, rotera proxy-pooler, testa omCloud mode hanterar IP-rotation
Exportera till Google SheetsSkriv OAuth + pandas-kopplingEtt klick, gratis

Om du testar Thunderbit först och märker att det täcker dina behov, kan du hoppa över resten av artikeln. Om du behöver full programmatisk kontroll, egna fält eller större volym än några tusen poster per månad — fortsätt läsa.

Python-bibliotek för att skrapa Yelp: vilket ska du välja?

"Ska jag använda Scrapy, BS4+requests eller Selenium?" är en av de vanligaste frågorna i r/webscraping-trådar om Yelp. Ändå väljer nästan varje guide bara sitt favoritbibliotek och går vidare utan att förklara varför. Här är den ärliga genomgången.

Läget 2025: requests + BeautifulSoup är trasigt för Yelp

Stacken som varje klassisk Yelp-guide rekommenderar — pip install requests beautifulsoup4 — blir blockerad redan vid första anropet 2025. Inte vid det 50:e. Vid det första.

Orsaken: Pythons requests-bibliotek skickar ett TLS/JA3-fingeravtryck som inte matchar någon verklig webbläsare. Yelps anti-bot-lager flaggar det redan i TLS-handshake, innan din User-Agent-header ens läses. Jag testade detta upprepade gånger — ny IP, realistiska headers, slumpmässiga fördröjningar — och fick ändå 403 Forbidden direkt med vanliga requests.

Beslutsmatris för bibliotek

BibliotekBäst förHanterar JS?Anti-bot?InlärningskurvaHastighet
requests + BeautifulSoupEnkel scraping av en sida (trasigt för Yelp)❌❌Väldigt lågSnabbt (tills det blockeras)
httpx async + parselAsynkron scraping i stor skala❌❌LågMycket snabbt
curl_cffi + parselYelp-specifikt: TLS-imitering❌✅ TLS/JA3/HTTP2LågMycket snabbt
Scrapy 2.14Fulla crawl-pipelines med pagineringDelvis (via scrapy-playwright)AutoThrottle, retry middlewareMedel–högSnabbt
Selenium 4.43 / Playwright 1.58JS-tunga sidor, CAPTCHA-förbiarbete✅DelvisMedelLångsamt (~10–30 sidor/min)
ThunderbitIcke-kodare, snabb extrahering✅ (webbläsare)Inbyggt (Cloud mode)Väldigt lågSnabbt

Genombrottet med curl_cffi

Biblioteket som förändrade mitt Yelp-arbete är curl_cffi — en Python-binding för curl-impersonate. Det skickar exakt samma TLS/JA3- och HTTP/2-fingeravtryck som riktig Chrome, och API:t är en direkt ersättare för requests:

from curl_cffi import requests

r = requests.get(
    "https://www.yelp.com/biz/some-restaurant",
    impersonate="chrome131",
)
print(r.status_code, len(r.text))

Den enda ändringen — from curl_cffi import requests plus impersonate="chrome131" — tar dig förbi Yelps största anti-bot-lager utan att starta en webbläsare. I mina tester är skillnaden mellan direkt 403 och rena 200-svar.

Min rekommenderade stack för Yelp 2025: curl_cffi + parsel + jmespath + residential proxies. Om du behöver en full crawl-pipeline med schemaläggning, bygg in det i Scrapy 2.14 med en downloader-middleware baserad på curl_cffi.

Så sätter du upp din Python-miljö för att skrapa Yelp

  • Svårighetsgrad: Medel
  • Tidsåtgång: ~15 minuter för setup, 1–2 timmar för en fungerande scraper
  • Du behöver: Python 3.10+ (3.12 rekommenderas), en terminal och eventuellt en leverantör av residential proxies

Steg 1: Skapa en virtuell miljö och installera paket

python3.12 -m venv .venv
source .venv/bin/activate  # På Windows: .venv\Scripts\activate
pip install "curl_cffi>=0.11" "parsel>=1.9" "jmespath>=1.0" pandas

Vad varje paket gör:

  • curl_cffi — skickar HTTP-anrop med Chromes TLS-fingeravtryck (anti-bot-förbikopplingen)
  • parsel — CSS/XPath-selectors för att tolka HTML (samma motor som Scrapy använder, men lättare)
  • jmespath — deklarativ JSON-fråga (renare än nästlad dict-access för Yelps inbäddade JSON)
  • pandas — export av data till CSV/Excel

Valfritt men användbart:

pip install fake-useragent  # Obs: repot arkiverades april 2026 men går fortfarande att installera

Steg för steg: så skrapar du Yelp med Python

Det här är huvudguiden. Den viktigaste insikten som gör allt mer robust: hoppa över CSS-selectors, hämta den dolda JSON:en istället. Yelp randomiserar CSS-klassnamn vid byggtid (y-css-14xwok2 en vecka, y-css-hcq7b9 nästa), så varje scraper som låser sig till dem går sönder inom veckor. De inbäddade JSON-payloads — application/ld+json-schema och react-root-props — är stabila.

Steg 2: Skrapa Yelps sökresultat

Yelps sök-URL:er följer ett förutsägbart mönster: https://www.yelp.com/search?find_desc={term}&find_loc={location}. Data från sökresultaten ligger inbäddad i en <script data-id="react-root-props">-tagg som JSON — inte utspridd i CSS-klass-sörjan.

import re, json, jmespath
from curl_cffi import requests
from parsel import Selector

HEADERS = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                  "AppleWebKit/537.36 (KHTML, like Gecko) "
                  "Chrome/124.0.0.0 Safari/537.36",
    "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,"
              "image/avif,image/webp,image/apng,*/*;q=0.8",
    "accept-language": "en-US,en;q=0.9",
    "accept-encoding": "gzip, deflate, br",
    "cookie": "intl_splash=false",
}

def scrape_search(term: str, location: str, max_pages: int = 3):
    results = []
    for page in range(max_pages):
        url = (f"https://www.yelp.com/search?"
               f"find_desc={term}&find_loc={location}&start={page * 10}")
        r = requests.get(url, headers=HEADERS, impersonate="chrome131")
        if r.status_code != 200:
            print(f"Blockerad på sida {page}: {r.status_code}")
            break
        sel = Selector(text=r.text)
        script = sel.xpath(
            "//script[@data-id='react-root-props']/text()"
        ).get() or ""
        m = re.search(r"react_root_props\s*=\s*(\{.*?\});", script, re.S)
        if not m:
            print(f"Inga react-root-props hittades på sida {page} — möjlig mjuk blockering")
            break
        data = json.loads(m.group(1))
        businesses = jmespath.search(
            "legacyProps.searchAppProps.searchPageProps"
            ".mainContentComponentsListProps"
            "[?searchResultBusiness].searchResultBusiness.{"
            "name: name, url: businessUrl, rating: rating, "
            "reviews: reviewCount, phone: phone, "
            "neighborhoods: neighborhoods}",
            data,
        ) or []
        results.extend(businesses)
        import time, random
        time.sleep(random.uniform(3, 7))
    return results

Du bör få tillbaka en lista med dicts som innehåller företagsnamn, URL:er, betyg och antal recensioner. Om react-root-props saknas i svaret har du fått en blockerings-shell — byt IP och försök igen.

Headern Cookie: intl_splash=false är en vanlig lösning för Yelps landssplash-omdirigering. Utan den hamnar icke-amerikanska IP:er på en splash-sida som ser ut som ett soft block men inte är det.

Steg 3: Skrapa Yelp-företagssidor

Varje företags-URL från sökresultaten leder till en detaljsida med rikare data. Det mest stabila målområdet för extrahering är <script type="application/ld+json">-blocket — det innehåller strukturerad schema.org-data som Yelp underhåller för SEO och inte obfuskerar.

def scrape_business(biz_url: str) -> dict:
    url = f"https://www.yelp.com{biz_url}" if biz_url.startswith("/") else biz_url
    r = requests.get(url, headers=HEADERS, impersonate="chrome131")
    if r.status_code != 200:
        return {"url": url, "error": r.status_code}
    sel = Selector(text=r.text)
    biz_id = sel.css('meta[name="yelp-biz-id"]::attr(content)').get()
    for raw in sel.css('script[type="application/ld+json"]::text').getall():
        try:
            data = json.loads(raw)
        except json.JSONDecodeError:
            continue
        for node in (data if isinstance(data, list) else [data]):
            if node.get("@type") in (
                "Restaurant", "LocalBusiness", "FoodEstablishment",
                "HealthAndBeautyBusiness", "HomeAndConstructionBusiness",
            ):
                return {
                    "biz_id": biz_id,
                    "name": node.get("name"),
                    "rating": (node.get("aggregateRating") or {}).get("ratingValue"),
                    "review_count": (node.get("aggregateRating") or {}).get("reviewCount"),
                    "address": node.get("address"),
                    "telephone": node.get("telephone"),
                    "price_range": node.get("priceRange"),
                    "hours": node.get("openingHours"),
                    "url": url,
                }
    return {"biz_id": biz_id, "url": url}

Värdet i meta[name="yelp-biz-id"] är det kodade företags-ID:t du behöver för reviews-endpointen. Hämta det här — du använder det i nästa steg.

Steg 4: Skrapa Yelp-recensioner med paginering

Det är här Fusion API:t kommer till korta och scraping verkligen glänser. Yelps interna GraphQL-batch-endpoint returnerar full recensions-text, information om recensenten, datum, betyg och röstantal — allt som API:t håller tillbaka.

Endpointen är https://www.yelp.com/gql/batch, och den använder ett statiskt documentId för operationen GetBusinessReviewFeed. Paginering sker via en base64-kodad cursor.

import base64

GQL_URL = "https://www.yelp.com/gql/batch"
DOC_ID = "ef51f33d1b0eccc958dddbf6cde15739c48b34637a00ebe316441031d4bf7681"

def fetch_reviews(enc_biz_id: str, num_pages: int = 5):
    all_reviews = []
    for page in range(num_pages):
        offset = page * 10
        cursor = base64.b64encode(
            json.dumps({"version": 1, "offset": offset}).encode()
        ).decode()
        payload = [{
            "operationName": "GetBusinessReviewFeed",
            "variables": {
                "encBizId": enc_biz_id,
                "reviewsPerPage": 10,
                "after": cursor,
                "sortBy": "DATE_DESC",
                "language": "en",
            },
            "extensions": {
                "operationType": "query",
                "documentId": DOC_ID,
            },
        }]
        r = requests.post(
            GQL_URL,
            json=payload,
            headers={
                **HEADERS,
                "content-type": "application/json",
                "x-apollo-operation-name": "GetBusinessReviewFeed",
                "apollographql-client-name": "yelp-main-frontend",
            },
            impersonate="chrome131",
        )
        if r.status_code != 200:
            print(f"Hämtning av recensioner misslyckades vid offset {offset}: {r.status_code}")
            break
        data = r.json()
        # Navigera i svaret för att extrahera recensioner
        try:
            reviews = data[0]["data"]["business"]["reviews"]["edges"]
            for edge in reviews:
                node = edge.get("node", {})
                all_reviews.append({
                    "reviewer": node.get("author", {}).get("displayName"),
                    "rating": node.get("rating"),
                    "date": node.get("localizedDate"),
                    "text": node.get("text", {}).get("full"),
                })
        except (KeyError, IndexError, TypeError):
            break
        import time, random
        time.sleep(random.uniform(3, 7))
    return all_reviews

Varje sida returnerar 10 recensioner. Öka offset i den base64-kodade cursoren för att paginera vidare. Parametern sortBy accepterar DATE_DESC (nyast först), RATING_ASC, RATING_DESC och fler.

Steg 5: Exportera din Yelp-data

import pandas as pd

# Anta att du har samlat in företag och recensioner
df_businesses = pd.DataFrame(businesses)
df_businesses.to_csv("yelp_businesses.csv", index=False)

df_reviews = pd.DataFrame(all_reviews)
df_reviews.to_csv("yelp_reviews.csv", index=False)

# Eller spara som JSON för flexibilitet
import json
with open("yelp_data.json", "w") as f:
    json.dump({"businesses": businesses, "reviews": all_reviews}, f, indent=2)

För dig som kör no-code-vägen exporterar Thunderbit samma data direkt till Excel, Google Sheets, Airtable eller Notion — utan pandas eller kod för filskrivning.

Anti-blockeringsspelplanen: så skrapar du Yelp utan att bli blockerad

Det här avsnittet är hela anledningen till att artikeln finns. Yelps anti-bot-skydd har blivit betydligt tuffare sedan slutet av 2024 — TLS-fingeravtryck, IP-rykteskontroller, CAPTCHA och beteendeanalys är alla i spel. De flesta äldre guider är föråldrade eftersom de skrevs innan nedslaget.

yelp_antiblock_518f0447bb.png

Strategin är lagd i flera nivåer. Varje lager sänker din blockeringsgrad; tillsammans gör de långvarig scraping möjlig.

Lager 1: Realistiska request-headers

Standardheaders i Python requests skickar User-Agent: python-requests/2.x — blockeras direkt. Men även en realistisk User-Agent räcker inte. Yelp kontrollerar hela uppsättningen Client Hints för att se om den är konsekvent.

FULL_HEADERS = {
    "authority": "www.yelp.com",
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
                  "AppleWebKit/537.36 (KHTML, like Gecko) "
                  "Chrome/124.0.0.0 Safari/537.36",
    "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,"
              "image/avif,image/webp,image/apng,*/*;q=0.8",
    "accept-language": "en-US,en;q=0.9",
    "accept-encoding": "gzip, deflate, br",
    "sec-ch-ua": '"Chromium";v="124", "Google Chrome";v="124", "Not-A.Brand";v="99"',
    "sec-ch-ua-mobile": "?0",
    "sec-ch-ua-platform": '"Windows"',
    "sec-fetch-dest": "document",
    "sec-fetch-mode": "navigate",
    "sec-fetch-site": "same-origin",
    "sec-fetch-user": "?1",
    "upgrade-insecure-requests": "1",
    "referer": "https://www.yelp.com/",
    "cookie": "intl_splash=false",
}

Tre misstag som gör att du flaggas:

  1. UA säger Chrome men sec-ch-ua saknas eller motsäger UA-versionen
  2. sec-ch-ua-platform säger "Windows" medan UA-strängen säger macOS
  3. Exakt samma UA över tusentals anrop från en IP — rotera en pool med 10–20 färska Chrome/Firefox/Safari-strängar

Lager 2: Hastighetsbegränsning och slumpade pauser

Förutsägbara tidsmönster är en varningssignal. Lägg till slumpmässiga sömnintervall och exponential backoff vid felstatusar.

import random, time

def polite_get(client_get, url, attempt=0):
    r = client_get(url, headers=FULL_HEADERS, impersonate="chrome131")
    if r.status_code in (403, 429, 503):
        if attempt >= 4:
            raise RuntimeError(f"Blockerad efter {attempt + 1} försök på {url}")
        backoff = 2 ** (attempt + 1) + random.random()
        print(f"  Fick {r.status_code}, backar {backoff:.1f}s (försök {attempt + 1})")
        time.sleep(backoff)
        return polite_get(client_get, url, attempt + 1)
    time.sleep(random.uniform(3, 7))
    return r
ParameterRekommenderat värde
Slumpad paus mellan anroprandom.uniform(3, 7) sekunder
Backoff vid 429/403/5032 → 4 → 8 → 16 sek, max 5 försök
Samtidiga workers per IP1 (serialisera per IP; använd proxies för parallellitet)
Max hållbar takt per residential IP~1 anrop / 5 sek (~12 rpm)

Lager 3: Rotation av User-Agent och session

Roterar genom en pool av riktiga User-Agent-strängar från webbläsare. Spara sessioner och cookies för att efterlikna verkligt surfande — Yelp använder cookie-baserad detektering, så att skapa en helt ny session för varje anrop är i sig misstänkt.

UA_POOL = [
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/124.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_4_1) AppleWebKit/537.36 Chrome/124.0.0.0 Safari/537.36",
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:125.0) Gecko/20100101 Firefox/125.0",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 14.4; rv:125.0) Gecko/20100101 Firefox/125.0",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 14_4_1) AppleWebKit/605.1.15 Safari/17.4.1",
    # Lägg till 5–10 fler färska strängar
]

Lager 4: Proxy-rotation

Vid verklig volym behöver du residential proxies. Datacenter-proxies och gratisproxies fungerar inte på Yelp — Yelps IP-rykteslager ger i förväg 403 till IP-ranges från AWS, GCP och DigitalOcean.

LeverantörStartpris $/GBKommentarer
IPRoyal$1.75/GBBilligast; kör den mest citerade Yelp-guiden
Decodo (fd Smartproxy)$3.20–$3.50Bäst GB/$-förhållande vid volym
Bright Data$4.00 (PAYG)150M+ IP-pool; dedikerad sida för Yelp Proxies
Oxylabs$6.00–$8.00Premium; 10M+ IP:er
Aluvia (mobile SIM)$3.00Riktiga amerikanska mobil-IP:er, positionerat för Yelp

Roterande residential (ny IP per anrop) fungerar bäst för stora sök-crawls. Sticky sessions (håll samma IP i 10 minuter) är bättre när du vill behålla cookies genom flödet företagssida → recensioner → paginering.

Lager 5: Identifiera och hantera blockeringar

Alla block ser inte likadana ut. Yelp levererar ofta ett generiskt "page not available"-skal i stället för en CAPTCHA, vilket gör att naiva scrapers tror att de får data fast de i själva verket får tomma svar.

BLOCK_MARKERS = (
    "captcha", "px-captcha", "page not available",
    "access denied", "unusual traffic",
)

def is_blocked(resp):
    if resp.status_code in (401, 403, 429, 503):
        return True
    body = resp.text.lower()
    if any(m in body for m in BLOCK_MARKERS):
        return True
    # Om detta är en sök-/företagssida men react-root-props saknas,
    # levererade Yelp ett avskalat block-svar
    if "react-root-props" not in body and "/biz/" in str(resp.url):
        return True
    return False
SignalBetydelse
HTTP 403Hårdkrokad blockering — IP/header/TLS är brända
HTTP 429Hastighetsbegränsad — ofta återhämtbar med backoff
HTTP 503Generisk blockering eller lastavlastning
Omdirigering till /error eller body med "page not available"Mjuk blockering
Tom med bara Challenge-sida som väntar på JS
captcha / g-recaptcha / px-captcha i bodyEskalerat — CAPTCHA krävs
Saknad react-root-props på en listsidaAvskalat block-svar

Lager 6: Det robusta parsing-tricket — dold JSON framför CSS-selectors

Det tål att upprepas: Yelp randomiserar CSS-klassnamn vid byggtid. En scraper som är låst till h3.y-css-14xwok2 går sönder inom veckor när Yelp släpper en ny version med h3.y-css-hcq7b9.

De payloads som inte flyttar på sig:

  • <script type="application/ld+json"> — schema.org-strukturerad data (namn, adress, telefon, betyg, öppettider)
  • <script data-id="react-root-props"> — fullständig sökresultatsdata som JSON
  • https://www.yelp.com/gql/batch — GraphQL-endpoint för recensioner med ett stabilt documentId

Om du tolkar CSS-klasser bygger du på sand. Tolka JSON i stället.

Lager 7: Fallback med stealth-browser

Gå bara upp till en headless browser när curl_cffi + residential proxies inte kommer igenom — vanligtvis när Yelp visar en JavaScript-challenge eller CAPTCHA.

För 95 % av scraping av företag/sökresultat/recensioner är curl_cffi + dold JSON + residential proxies snabbare, billigare och mer tillförlitligt än en browser. Men när du verkligen behöver en browser:

VerktygStatus (2025)Kommentarer
rebrowser-playwrightRekommenderad startpunktDrop-in Playwright med patchar som fixar CDP-läckor
nodriverBäst i klassen för Chrome-stealthEfterföljare till undetected-chromedriver; undviker WebDriver-protokollet helt
patchrightAktivt underhållen Playwright-forkKlarar moderna detektionstester
playwright-stealthMogetPatchar navigator.webdriver, tar bort HeadlessChrome från UA

Skippa vanlig Selenium för Yelp. Det är för lätt att fingeravtryckssätta.

Yelp Fusion API vs. Python scraping vs. Thunderbit: full jämförelse

DimensionYelp Fusion APIPython scrapingThunderbit
Fullständig recensions-text❌ 3 utdrag × ~160 tecken✅ Obegränsat (GraphQL)✅ Inbyggd recensionsmall
Recensionsmetadata (röster, svar från ägare)❌✅✅ Via AI-föreslagna fält
Bilder❌ (0 på Base)✅ Obegränsat✅
Maxresultat per sökning240 (var 1 000 före 2024)Obegränsat (med paginering)Obegränsat
Daglig begränsning300–500 (nya) / 5 000 (äldre)Endast proxybudgetKreditbaserat (3 000/mån på Pro)
Uppstartstid~15 minTimmar till dagar~2 minuter
Hantering av anti-botN/ADitt problemSköts (Cloud mode)
Juridisk riskLåg (auktoriserat)Medel (gråzon i villkoren)Medel (samma som scraping)
Kostnad (start)$29/mån~$0,75–$4/GB i proxies + utvecklingstidGratis nivå
Kostnad (tung användning)$643+/mån$50–$500/mån i proxies + utvecklingstid$38–$49/mån
DataexportJSONCSV/JSON (du skriver det själv)Excel / Sheets / Airtable / Notion — gratis
UnderhållLågtHögt (selectors går sönder, anti-bot skärps)Lågt (AI anpassar sig igen)

Juridiska och etiska tips för att skrapa Yelp

Jag är inte jurist, och detta är inte juridisk rådgivning. Men det juridiska läget har förändrats tillräckligt mycket de senaste två åren för att du bör känna till grunderna innan du lägger tid på ett Yelp-scrapingprojekt.

Vad Yelps användarvillkor säger: Uppdateringen av användarvillkoren i oktober 2025 förbjuder uttryckligen användning av "any robot, spider... or other automated device" för att "access, retrieve, copy, scrape, or index any portion of the Service." Den lade också till formuleringar om "AI Technologies and/or other automated tools."

Yelp Support upprepar: "Yelp tillåter inte någon scraping av webbplatsen."

Vad robots.txt säger: Yelps robots.txt har ett wildcard med User-agent: * / Disallow: / och blockerar specifikt GPTBot, ClaudeBot, PerplexityBot, CCBot och Meta-ExternalAgent. Endast Googlebot, Bingbot och några sociala crawlers är vitlistade.

Det rättsfall som spelar roll: I Meta v. Bright Data (N.D. Cal. jan 2024) slog domstolen fast att scraping av offentligt tillgänglig data som man inte var inloggad på inte bröt mot Metas användarvillkor. Den viktiga skillnaden är: offentlig data utan inloggning vs. data bakom inloggning. Fallet hiQ v. LinkedIn slog fast att scraping av offentlig data sannolikt inte bryter mot CFAA, men hiQ förlorade ändå på delstatliga anspråk (trespass to chattels, misappropriation) och fick en dom på $500 000 mot sig.

Praktiska riktlinjer:

  • Skrapa bara offentligt tillgängliga sidor utan inloggning
  • Hastighetsbegränsa dina anrop (fördröjningarna i den här guiden fungerar också som etiska rate limits)
  • Sälj inte vidare rå recensions-text som är kopplad till namngivna användare — respektera recensenters integritet
  • Följ lokala dataskyddslagar (CCPA, GDPR)
  • Logga inte in för att skrapa — då passerar du gränsen för auktorisation
  • Betrakta företagsinfo (namn/adress/telefon/betyg) som offentliga sakuppgifter; behandla recensions-text som känsligare

Rådfråga en jurist för just din situation.

Avslutning

Tre vägar, ett mål.

Yelp Fusion API:t är det auktoriserade alternativet med lågt underhåll — men det toppar på 3 recensionsutdrag och börjar på $29/månad. Python scraping ger dig full kontroll över varje datapunkt på Yelp, men kräver verklig investering: curl_cffi för TLS-imitering, residential proxies, slumpmässiga fördröjningar, parsing av dold JSON och löpande underhåll när Yelps försvar utvecklas. Thunderbit tar dig från "jag behöver Yelp-data" till "här är mitt kalkylblad" på ungefär 30 sekunder, utan kod och utan proxykonfiguration.

De anti-blockeringsmetoder som faktiskt fungerar 2025: realistiska headers med fulla Client Hints, curl_cffi för att imitera TLS-fingeravtryck, slumpade fördröjningar med exponential backoff, rotation av residential proxies och — framför allt — parsing av dold JSON (application/ld+json och react-root-props) i stället för sköra CSS-selectors.

Osäker på vilken väg som passar? Testa Thunderbits gratisnivå först. Om den täcker dina behov har du sparat timmar. Om du behöver mer kontroll — fulla programmerade flöden, egna fält, tät CRM-integration — täcker Python-guiden ovan det. Och för en djupare titt på landskapet av scrapingverktyg, kolla vår sammanställning av de bästa Chrome-tilläggen för web scraping eller vår guide om att skrapa data från webbplatser till Excel.

Testa Thunderbit för att extrahera Yelp-data Get Started Free

Vanliga frågor

Kan jag skrapa Yelp gratis med Python?

Ja — med gratisbibliotek som curl_cffi, parsel och jmespath. Men vid verklig volym (mer än några dussin sidor) behöver du betalda residential proxies, som börjar runt $1.75/GB hos IPRoyal. Thunderbit erbjuder också en gratisnivå med 6 sidor/månad för snabb no-code-extrahering.

Blockerar Yelp scrapers?

Ja, aggressivt. Yelp använder TLS/JA3-fingeravtryck, IP-ryktepoäng, CAPTCHA, beteendeanalys och roterande obfuskterade CSS-klasser. Vanliga requests blockeras vid första träffen. Den flerskiktade anti-blockeringsstrategin i den här guiden — curl_cffi för TLS-imitering, realistiska headers, slumpade pauser och residential proxies — är det som fungerar 2025.

Är Yelp Fusion API bättre än scraping?

Det beror på vad du behöver. API:t är auktoriserat och har låg risk, men det returnerar bara 3 recensionsutdrag på cirka 160 tecken vardera, begränsar sökresultat till 240 och börjar på $29/månad. Om du behöver full recensions-text, metadata eller mer än några hundra poster per dag, är scraping det enda alternativet.

Hur skrapar jag Yelp-recensioner med Python?

Använd curl_cffi med impersonate="chrome131" för att hämta företagssidan, plocka ut det kodade företags-ID:t från <meta name="yelp-biz-id">, och skicka sedan en POST till https://www.yelp.com/gql/batch med operationen GetBusinessReviewFeed och paginera via en base64-kodad after-cursor. Steg-för-steg-koden finns i handledningen ovan. Scrapflys Yelp scraper-repo är också en bra referensimplementation.

Kan jag skrapa Yelp utan att koda?

Ja — Thunderbits AI Web Scraper levereras med färdiga mallar för Yelp-företag och recensioner. Öppna en Yelp-sida, klicka på AI Suggest Fields, klicka på Scrape. Export till Google Sheets, Excel, Airtable och Notion är gratis i alla nivåer, inklusive gratisplanen.

Läs mer

Shuai Guan
Shuai Guan
VD på Thunderbit | Expert på AI-driven dataautomatisering Shuai Guan är VD för Thunderbit och alumn från University of Michigan Engineering. Med nästan tio års erfarenhet inom teknik och SaaS-arkitektur är han specialiserad på att omvandla avancerade AI-modeller till praktiska, kodfria verktyg för datautvinning. På den här bloggen delar han raka, beprövade insikter om webbskrapning och automatiseringsstrategier som hjälper dig att bygga smartare, datadrivna arbetsflöden. När han inte optimerar dataflöden ägnar han samma detaljblick åt sin passion för fotografi.
Innehållsförteckning
Thunderbit · AI-agent för webbdata

Extrahera data från vilken sida som helst på 1 klick

Betrodd av över 250 000 användare
gratis plan tillgänglig
Från webbsida till kalkylark
Beskriv vad du behöver — Thunderbits AI-agent samlar in det och exporterar till Excel, Google Sheets, Airtable eller Notion. Gratis att börja med.
Chrome Store Rating
PRODUCT HUNT#1 Product of the Week