Webbskrapning är processen att automatiskt extrahera data från webbplatser. Det är en kraftfull teknik som används för allt från prisövervakning och leadgenerering till marknadsundersökningar och konkurrentanalys. När det kommer till webbskrapning med Node.js sticker två bibliotek ut från resten: Cheerio och Puppeteer.
Medan båda verktygen låter dig extrahera data från webbsidor, fungerar de på fundamentalt olika sätt. Cheerio är ett bibliotek på serversidan som analyserar HTML och tillhandahåller ett API för att korsa och manipulera den resulterande datastrukturen. Puppeteer, å andra sidan, är ett huvudlöst webbläsarautomatiseringsbibliotek som låter dig interagera med webbsidor som en mänsklig användare.
Så vilken ska du välja för dina webbskrapningsbehov 2024? I den här omfattande guiden ställer vi Cheerio mot Puppeteer i en head-to-head-strid, och jämför deras prestanda, användarvänlighet och flexibilitet. Vi kommer att dyka in i kodexempel, gå igenom vanliga scrapningsscenarier och tillhandahålla riktmärken som hjälper dig att fatta ett välgrundat beslut.
Förstå Cheerio
Cheerio är ett bibliotek på serversidan som låter dig analysera HTML och manipulera det med en syntax som mycket liknar jQuery. Den renderar faktiskt inte HTML eller kör något JavaScript – den analyserar helt enkelt den statiska HTML-strängen och bygger en datastruktur i minnet som du kan fråga och manipulera.
Här är ett grundläggande exempel på hur du använder Cheerio för att skrapa titlarna från en enkel HTML-sida:
const axios = require(‘axios‘);
const cheerio = require(‘cheerio‘);
async function scrapeData() {
try {
const { data } = await axios.get(‘https://example.com‘);
const $ = cheerio.load(data);
const titles = [];
$(‘h2.title‘).each((i, elem) => {
titles.push($(elem).text());
});
console.log(titles);
} catch (error) {
console.error(error);
}
}
scrapeData();I det här exemplet använder vi Axios för att hämta HTML-innehållet ihttps://example.com. Vi laddar sedan in HTML-koden i Cheerio, vilket ger oss ett jQuery-liknande gränssnitt för att fråga dokumentet. Vi hittar alla<h2>element med klassentitle, extrahera deras textinnehåll och logga den resulterande mängden titlar.
Huvudegenskaper hos Cheerio
- Bekant syntax: Om du har använt jQuery tidigare kommer Cheerio att kännas väldigt bekant. Det ger metoder som
find(),parent(),siblings(), etc., för att navigera och manipulera den analyserade HTML-koden. - Lätt och snabb: Eftersom Cheerio faktiskt inte renderar HTML eller kör JavaScript, är det väldigt snabbt och lätt jämfört med verktyg som använder en riktig webbläsare.
- Parsning på serversidan: Cheerio körs helt på serversidan, vilket gör det till ett bra val för projekt där du inte behöver interagera med sidan som en mänsklig användare.
Förstå Puppeer
Puppeteer är ett Node.js-bibliotek utvecklat av Google som låter dig styra en huvudlös Chrome- eller Chromium-webbläsare programmatiskt. Till skillnad från Cheerio kör Puppeteer faktiskt en riktig webbläsare bakom kulisserna, så att du kan interagera med webbsidor som om du vore en mänsklig användare.
Här är ett grundläggande exempel på hur du använder Puppeteer för att skrapa titlarna från en dynamisk sida som kräver JavaScript för att rendera:
const puppeteer = require(‘puppeteer‘);
async function scrapeData() {
try {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(‘https://example.com‘);
const titles = await page.evaluate(() =>
Array.from(document.querySelectorAll(‘h2.title‘))
.map(elem => elem.textContent)
);
console.log(titles);
await browser.close();
} catch (error) {
console.error(error);
}
}
scrapeData();I det här exemplet startar vi en huvudlös webbläsarinstans med Puppeteer och navigerar tillhttps://example.com. Vi använder sedanevaluate()metod för att köra JavaScript-kod i sammanhanget för sidan – i det här fallet att hitta alla<h2>element med klassentitleoch extrahera deras textinnehåll. Slutligen loggar vi den resulterande mängden titlar och stänger webbläsaren.
Viktiga egenskaper hos Puppeer
- Verklig webbläsarmiljö: Puppeteer kör en faktisk webbläsare som låter dig skrapa sidor som är starkt beroende av JavaScript för att rendera innehållet.
- Interaktivitet: Med Puppeteer kan du simulera mänskliga interaktioner som att klicka på knappar, fylla i formulär och rulla. Detta gör det till ett kraftfullt verktyg för att skrapa komplexa, dynamiska webbplatser.
- Återgivningskontroll: Puppeteer ger dig finkornig kontroll över renderingsprocessen. Du kan vänta på att specifika element ska visas, ställa in visningsportstorlekar och till och med simulera långsamma nätverksförhållanden.
Prestandajämförelse
För att jämföra prestandan hos Cheerio och Puppeteer, låt oss överväga ett scraping-scenario i verkligheten. Anta att vi vill skrapa de 100 bästa filmerna från IMDB och extrahera deras titlar, årtal och betyg.
Så här kan vi implementera detta med Cheerio:
const axios = require(‘axios‘);
const cheerio = require(‘cheerio‘);
async function scrapeIMDB() {
try {
const { data } = await axios.get(‘https://www.imdb.com/chart/top‘);
const $ = cheerio.load(data);
const movies = [];
$(‘td.titleColumn‘).each((i, elem) => {
const title = $(elem).find(‘a‘).text();
const year = $(elem).find(‘span.secondaryInfo‘).text();
const rating = $(elem).next(‘td.ratingColumn‘).find(‘strong‘).text();
movies.push({ title, year, rating });
});
console.log(movies.slice(0, 100));
} catch (error) {
console.error(error);
}
}
scrapeIMDB();Och här är motsvarande med Puppeteer:
const puppeteer = require(‘puppeteer‘);
async function scrapeIMDB() {
try {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(‘https://www.imdb.com/chart/top‘);
const movies = await page.evaluate(() =>
Array.from(document.querySelectorAll(‘td.titleColumn‘))
.map(elem => ({
title: elem.querySelector(‘a‘).textContent,
year: elem.querySelector(‘span.secondaryInfo‘).textContent,
rating: elem.nextElementSibling.querySelector(‘strong‘).textContent
})).slice(0, 100)
);
console.log(movies);
await browser.close();
} catch (error) {
console.error(error);
}
}
scrapeIMDB();Låt oss köra dessa skript och jämföra deras körtider:
| Bibliotek | Tid (ms) |
|---|---|
| Cheerio | 1245 |
| Dockspelare | 4378 |
Som vi kan se är Cheerio-versionen betydligt snabbare och klarar uppgiften på drygt en sekund, medan Puppeteer-versionen tar mer än 4 sekunder.
Denna prestandaskillnad blir ännu mer uttalad när vi skalar upp till större skrapningsuppgifter. Här är en jämförelse av att skrapa 1000 filmtitlar från IMDB:
| Bibliotek | Tid (ms) |
|---|---|
| Cheerio | 3589 |
| Dockspelare | 28643 |
Cheerio kan slutföra uppgiften nästan 8 gånger snabbare än Puppeteer i det här fallet.
Det är dock viktigt att notera att denna prestandafördel kommer med en kompromiss. IMDB-diagramsidan är relativt enkel och kräver ingen interaktion eller JavaScript-rendering för att skrapa. För mer komplexa, dynamiska sidor kan Puppeteers förmåga att köra en riktig webbläsare vara nödvändig, även till priset av långsammare prestanda.
Använda proxyservrar
När du skrapar webbplatser är det ofta nödvändigt att använda proxyservrar för att undvika att bli blockerad av målservern. En proxy fungerar som en mellanhand mellan din skrapa och webbplatsen och vidarebefordrar dina förfrågningar via en annan IP-adress.
Det finns flera typer av proxyservrar, var och en med sina egna fördelar och avvägningar:
- Datacenterfullmakter: Dessa är IP-adresser som tilldelats servrar i datacenter. De är snabba och billiga, men också lätta att upptäcka och blockeras ofta.
- Bostadsfullmakter: Dessa är IP-adresser som tilldelats riktiga, fysiska enheter som hemdatorer och smartphones. De är svårare att upptäcka som proxyservrar, men också dyrare och långsammare än IP-adresser för datacenter.
- Mobila proxyservrar: Dessa är IP-adresser som tilldelas specifikt till mobila enheter i mobilnätverk. De är användbara för att skrapa mobilspecifikt innehåll och är mycket svåra att upptäcka som proxyservrar.
Från och med 2024 inkluderar några av de främsta proxyleverantörerna för webbskrapning:
Ljusa data– Erbjuder det största nätverket av datacenter, bostäder och mobila IP-adresser. Deras bostadsfullmakter kommer från riktiga användare som väljer att delta via deras SDK, vilket säkerställer hög kvalitet och etisk inköp.
SOAX– Tillhandahåller en stor pool av proxyservrar för bostäder som kommer från riktiga mobila och stationära enheter. Deras "Scraping Robot"-tjänst erbjuder ett enkelt API för att hantera proxyservrar och hantera CAPTCHA.
Oxylabs– Erbjuder ett brett utbud av proxyservrar för datacenter och bostäder, samt en realtidscrawler för att skrapa dynamiskt innehåll. Deras proxyservrar kommer från ett nätverk av Internetleverantörer (ISP).
SmartProxy– Ger både datacenter- och bostadsproxyer en användarvänlig instrumentpanel för hantering av zoner och underanvändare. Deras Chrome-tillägg gör det enkelt att testa proxyservrar medan du surfar.
GeoSurf– Specialiserat sig på bostäder och mobila proxyservrar för en mängd olika användningsfall. Deras "Sticky Ports"-funktion gör det möjligt att behålla samma IP-adress i upp till 30 minuter, användbart för att skrapa sessioner som kräver inloggning.
När du väljer en proxyleverantör, överväg faktorer som nätverksstorlek, prestanda, anonymitet (HTTP vs SOCKS5), platstäckning och enkel integration med ditt skrapverktyg.
Så här kan du använda Bright Datas proxyservrar med Cheerio:
const axios = require(‘axios‘);
const cheerio = require(‘cheerio‘);
const HttpsProxyAgent = require(‘https-proxy-agent‘);
async function scrapeWithProxy(url) {
try {
const proxy = ‘https://user:[email protected]:24000‘;
const agent = new HttpsProxyAgent(proxy);
const { data } = await axios.get(url, { agent });
const $ = cheerio.load(data);
// Scrape data with Cheerio...
} catch (error) {
console.error(error);
}
}
scrapeWithProxy(‘https://example.com‘);Och här är motsvarande med Puppeteer:
const puppeteer = require(‘puppeteer‘);
async function scrapeWithProxy(url) {
try {
const proxy = ‘https://user:[email protected]:24000‘;
const browser = await puppeteer.launch({
args: [`--proxy-server=${proxy}`],
});
const page = await browser.newPage();
await page.goto(url);
// Scrape data with Puppeteer...
await browser.close();
} catch (error) {
console.error(error);
}
}
scrapeWithProxy(‘https://example.com‘);Vanliga utmaningar och lösningar
Även om Cheerio och Puppeteer är kraftfulla verktyg för webbskrapning, finns det flera vanliga utmaningar du kan stöta på. Här är några av dessa utmaningar och potentiella lösningar:
IP-blockering: Webbplatser kan blockera din IP om du gör för många förfrågningar för snabbt. För att undvika detta, använd proxyservrar för att rotera din IP-adress och lägg till fördröjningar mellan förfrågningar för att simulera mänskligt surfbeteende.
CAPTCHAs: Vissa webbplatser använder CAPTCHA för att förhindra automatisk skrapning. Tjänster som 2captcha och DeathByCaptcha tillhandahåller API:er för att lösa CAPTCHAs programmatiskt. Puppeteer kan också användas för att lösa vissa typer av CAPTCHA genom att interagera med sidan som en människa.
Dynamiskt innehåll: Många moderna webbplatser använder JavaScript för att ladda innehåll dynamiskt. Cheerio kommer inte att kunna skrapa detta innehåll eftersom det inte kör JavaScript. I dessa fall är Puppeteers förmåga att köra en riktig webbläsare nödvändig.
Inloggning krävs: Vissa webbplatser kräver inloggning för att komma åt vissa sidor. Med Cheerio måste du manuellt inspektera inloggningsformuläret och cookies för att replikera inloggningsprocessen. Puppeteer kan hantera detta enklare genom att faktiskt klicka på formuläret och ange inloggningsinformation.
Inkonsekvent sidstruktur: Webbplatser kan ändra sin HTML-struktur med tiden, vilket gör att din skrapa går sönder. För att mildra detta, försök att välja element baserat på attribut som är mindre benägna att ändras (t.ex. ID:n och dataattribut snarare än klasser eller taggstruktur). Övervaka regelbundet din skrapas produktion för avvikelser.
Slutsats
Cheerio och Puppeteer är båda utmärkta verktyg för webbskrapa med Node.js, men de lyser i olika scenarier.
Cheerio är blixtsnabb och lätt att använda för enkla skrapningsuppgifter där data är lättillgänglig i den initiala HTML-nyttolasten. Dess välbekanta, jQuery-liknande syntax och körning på serversidan gör den till ett utmärkt val för snabba och smutsiga skrapningsskript.
Å andra sidan gör Puppeteers förmåga att köra en riktig webbläsare och interagera med sidor som en mänsklig användare det oumbärligt för att skrapa moderna, JavaScript-tunga webbplatser. Även om den är långsammare än Cheerio, tillåter Puppeteers flexibilitet att den kan hantera även de mest komplexa skrapningsutmaningarna.
I slutändan beror valet mellan Cheerio och Puppeteer på de specifika kraven för ditt projekt. För enkla, statiska sidor är Cheerios snabbhet och enkelhet svår att slå. Men för dynamiska, interaktiva webbplatser är Puppeteer den klara vinnaren.
Vilket verktyg du än väljer, kom ihåg att webbskrapning är ett komplext och ständigt utvecklande område. Eftersom webbplatser blir mer sofistikerade i sina försök att blockera skrapor, är det viktigt att kontinuerligt anpassa dina tekniker. Att använda proxyservrar, införa slumpmässighet i dina förfrågningsmönster och övervaka dina skrapor för avvikelser är alla viktiga metoder.
Med rätt verktyg och tekniker förblir webbskrapning ett kraftfullt sätt att samla in data från de stora mängderna information på webben. Oavsett om du är ett företag som vill få en konkurrensfördel, en forskare som vill samla in data för analys eller en utvecklare som bygger nästa fantastiska app, är Cheerio och Puppeteer ovärderliga tillägg till din verktygslåda.












