automation expert
Használja ki a webes adatokban rejlő lehetőségeket haladó programozási ismeretek nélkül! Ez az útmutató bemutatja, hogyan lehet könnyedén adatokat gyűjteni és kinyerni webhelyekről közvetlenül a Google Táblázatokba a Google Apps Script segítségével, ami új távlatokat nyit a vállalkozások számára. Automatizálja a piackutatást, a versenytárselemzést és az adatgyűjtést, számtalan órányi kézi munkát takarítva meg és értékes betekintést nyerve – mindezt mélyreható HTML-ismeretek nélkül.
A webkaparás (web scraping) lényegében az információk automatikus másolása és beillesztése webhelyekről. Képzeljen el egy digitális asszisztenst, amely felkeresi a weboldalakat, és automatikusan összegyűjti a megadott információkat. Ahelyett, hogy manuálisan jelölne ki és másolna szöveget vagy képeket, egy program végzi el ezt a feladatot Ön helyett, olyan adatokat gyűjtve, mint például árak, termékadatok vagy elérhetőségek.
Ezeket a kinyert adatokat aztán különféle célokra lehet felhasználni, beleértve az árak összehasonlítását különböző online kereskedők között, értékesítési leadek (potenciális ügyfelek) gyűjtését, értesítések létrehozását tartalomváltozásokról és még sok mást. Lényegében a webkaparás automatizálja az unalmas kézi munkát, jelentős időt és energiát takarítva meg a nagy mennyiségű webes adat hatékony kinyerésével és rendszerezésével.
Napjaink versenyképes üzleti környezetében a termelékenység és az optimalizált erőforrás-elosztás kulcsfontosságú a sikerhez. A webkaparás értékes eszköz e célok eléréséhez, jelentősen javítva a termelékenységet az időigényes adatgyűjtés és -elemzés automatizálásával.
A webhelyekről történő adatkinyerés automatizálásával a vállalkozások jelentős időt és energiát takarítanak meg a manuális módszerekhez képest. Ez a megnövekedett hatékonyság lehetővé teszi a csapatok számára, hogy ismétlődő feladatok helyett stratégiai kezdeményezésekre összpontosítsanak.
Továbbá a webkaparással gyűjtött adatok nem csupán önmagukban értékesek; kulcsfontosságú bemenetet szolgáltatnak további automatizálási folyamatokhoz. Például a kikapart adatok dinamikus, versenyalapú árképzési stratégiákat működtethetnek az e-kereskedelemben, vagy automatikusan azonosíthatnak értékes befektetési lehetőségeket több portál ingatlanhirdetéseinek összesítésével.
Ez a zökkenőmentes integráció más automatizálási munkafolyamatokkal felerősíti a webkaparás hatását, nélkülözhetetlen eszközzé téve azt minden előremutató vállalkozás számára.
Google Apps Script egy felhőalapú, JavaScriptre épülő szkriptnyelv, amely lehetővé teszi a feladatok automatizálását és hatékony integrációk létrehozását a Google Workspace-en (korábban G Suite) belül. Egyedülálló előnye abban rejlik, hogy zökkenőmentesen képes összekapcsolni a különböző Google-szolgáltatásokat, beleértve a Gmailt, a Dokumentumokat, a Drive-ot, a Naptárat és – ami fontos – a Táblázatokat, így kivételesen alkalmas átfogó automatizálások létrehozására. Ez az összekapcsoltság lehetővé teszi több alkalmazáson átívelő munkafolyamatok létrehozását, egyszerűsítve a folyamatokat és növelve a termelékenységet.
Kifejezetten a webkaparáshoz az Apps Script UrlFetchApp
szolgáltatása lehetővé teszi, hogy közvetlenül weboldalakról kérjen le tartalmat, lehetővé téve az automatizált adatkinyerést és az integrációt a többi Google Workspace alkalmazással. HTTP-kérések küldésével webhelyekre lekérhet HTML, XML vagy JSON adatokat. Ezeket a kinyert adatokat aztán a szkripten belül JavaScript segítségével lehet feldolgozni és strukturálni.
Ennek a megközelítésnek az igazi ereje akkor mutatkozik meg, ha a Google Táblázatokkal kombináljuk: a kikapart adatok közvetlenül táblázatokba írhatók, kényelmes és ismerős környezetet biztosítva az adattároláshoz, rendszerezéshez, elemzéshez, vizualizációhoz és további automatizáláshoz.
Létrehozunk egy rendszert, amely a következőket teszi:
Először is szüksége van egy Google Táblázatra. A Google Táblázatnak legalább két oszlopot kell tartalmaznia:
Most nézzük meg a kódot, amely a varázslatot végzi. Nyissa meg a szkriptszerkesztőt a Google Táblázatban az „Eszközök” > „Szkriptszerkesztő” menüpontban. Másolja be az alább megadott kódot a szkriptszerkesztőbe.
/**
* Fetches product prices from URLs in a Google Sheet and updates the sheet with the prices.
*/
// Configuration (Update these with your actual values)
const SHEET_ID = `YOUR_SHEET_ID`; // Replace with your actual Sheet ID
const SHEET_NAME = `YOUR_SHEET_NAME`; // Replace with your actual Sheet Name
const URLS_COLUMN_ID = 1; // Column containing URLs (A = 1)
const CSS_SELECTOR_COLUMN = 2; // Column containing CSS selectors (B = 2)
const PRICE_COLUMN = 3; // Column to write prices (C = 3)
const REQUEST_DELAY = 1000; // Delay between requests in milliseconds (1 second)
/**
* Main function to run the script.
*/
function main() {
const urlData = getUrlsFromSheet();
if (urlData.length === 0) {
Logger.log("No URLs to process.");
return;
}
const prices = [];
for (let i = 0; i < urlData.length; i++) {
const url = urlData[i].url;
const selector = urlData[i].selector;
const html = fetchHtml(url);
const price = extractPrice(html, selector);
prices.push(price);
Utilities.sleep(REQUEST_DELAY); // Delay between requests
Logger.log(`Processed URL ${i+1}/${urlData.length}: ${url}, Price: ${price}`);
}
updateSheet(prices);
}
/**
* Opens the spreadsheet and gets the URLs and selectors.
* @return {Array<{url: string, selector: string}>} An array of objects containing URLs and selectors.
*/
function getUrlsFromSheet() {
const ss = SpreadsheetApp.openById(SHEET_ID);
const sheet = ss.getSheetByName(SHEET_NAME);
const lastRow = sheet.getLastRow();
if (lastRow < 2) return []; // Handle empty sheet
const urls = sheet.getRange(2, URLS_COLUMN_ID, lastRow - 1)
.getValues()
.flat(); // Get values as a 1D array.
const selectors = sheet.getRange(2, CSS_SELECTOR_COLUMN, lastRow - 1)
.getValues()
.flat(); // Get values as a 1D array.
const urlData = [];
for (let i = 0; i < urls.length; i++) {
urlData.push({
url: urls[i],
selector: selectors[i]
});
}
return urlData;
}
/**
* Fetches the HTML content of a URL.
* @param {string} url The URL to fetch.
* @return {string|null} The HTML content, or null if there's an error.
*/
function fetchHtml(url) {
try {
const options = {
method: 'get',
muteHttpExceptions: true,
headers: { // Added some common headers
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36',
'Accept-Language': 'en-US,en;q=0.9',
'Cache-Control': 'no-cache'
}
};
const response = UrlFetchApp.fetch(url, options);
if (response.getResponseCode() === 200) {
return response.getContentText();
} else {
Logger.log(`Error fetching ${url}: ${response.getResponseCode()} - ${response.getContentText()}`);
return null;
}
} catch (error) {
Logger.log(`Error fetching ${url}: ${error}`);
return null;
}
}
/**
* Extracts the price from the HTML using Cheerio.
* @param {string} html The HTML content.
* @param {string} selector The CSS selector to use.
* @return {number|null} The extracted price as a number, or null if not found.
*/
function extractPrice(html, selector) { // Added selector parameter
if (!html || !selector) return null; // Added check for selector
try {
const $ = Cheerio.load(html);
let priceText = $(selector).text(); // Use provided selector
if (!priceText) {
Logger.log("Price element not found using selector: " + selector);
return null;
}
priceText = priceText.replace(/,/g,'.');
let price = parseFloat(priceText.replace(/[^0-9.]/g, ''));
if (isNaN(price)) {
Logger.log("Could not parse price to a number: " + priceText);
return null;
}
return price;
} catch (error) {
Logger.log("Error extracting price: " + error);
return null;
}
}
/**
* Updates the Google Sheet with the extracted prices.
* @param {Array<number|null>} prices An array of prices to write to the sheet.
*/
function updateSheet(prices) {
if (prices.length === 0) return;
const ss = SpreadsheetApp.openById(SHEET_ID);
const sheet = ss.getSheetByName(SHEET_NAME);
const lastRow = sheet.getLastRow();
const urlsCount = sheet.getRange(2, URLS_COLUMN_ID, lastRow - 1).getValues().flat().length;
if (prices.length !== urlsCount) {
Logger.log(`Number of prices (${prices.length}) does not match the number of URLs (${urlsCount}).`);
return;
}
sheet.getRange(2, PRICE_COLUMN, prices.length, 1).setValues(prices.map(price => [price]));
}
Mielőtt elkezdené használni ezt a kódot, ne felejtse el hozzáadni a Cheerio könyvtárat. Ez a külső könyvtár segít nekünk könnyebben feldolgozni a HTML-t, és manuálisan kell hozzáadni a projektünkhöz. Ennek módja:
1ReeQ6WO8kKNxoaA_O0XEQ589cIrRvEBA9qcWpNqdOP17i47u6N9M5Xh0
A könyvtárnak most meg kell jelennie a „Könyvtárak” (Libraries) párbeszédpanelen.
A termékárak követésére szolgáló Google Apps Scriptünk több kulcsfontosságú, együttműködő függvényből épül fel. Nézzük meg részletesen, hogy melyik mit csinál:
1. main()
main
függvény az elsődleges belépési pont, amely az árak lekérésének és frissítésének teljes folyamatát irányítja. Meghívja a többi függvényt a megfelelő sorrendben a feladat elvégzéséhez.getUrlsFromSheet()
meghívásával kezdődik, hogy lekérje az URL-ek listáját és a hozzájuk tartozó CSS szelektorokat a táblázatból.fetchHtml()
függvényt a weboldal tartalmának letöltéséhez.extractPrice()
függvénynek az ár megtalálásához.Utilities.sleep()
), hogy elkerülje a webhelyek túlterhelését.updateSheet()
függvényt, hogy az összes összegyűjtött árat visszaírja a táblázatba.main()
függvényre úgy, mint egy Projektmenedzserre. Nem maga végzi a speciális feladatokat, de ismeri a végső célt, és a megfelelő sorrendben irányítja a szakembereket (getUrlsFromSheet
, fetchHtml
, extractPrice
, updateSheet
), biztosítva, hogy a projekt (az árkövetés) lépésről lépésre befejeződjön.2. getUrlsFromSheet()
SHEET_ID
) alapján.SHEET_NAME
) alapján.URLS_COLUMN_ID
).CSS_SELECTOR_COLUMN
).3. fetchHtml()
url
-t kap bemenetként.UrlFetchApp.fetch()
szolgáltatását használja a kérés elküldéséhez az adott URL-re.options
(opciókat) tartalmaz (például User-Agent
fejléceket), hogy a kérés inkább egy szabványos webböngészőtől érkezőnek tűnjön, ami segíthet megelőzni egyes webhelyek általi blokkolást.null
értéket ad vissza.fetchHtml()
függvényt úgy, mint egy Webes Felderítőt. Ad neki egy címet (URL), ő pedig elmegy erre a helyre az interneten, másolatot készít az oldal mögöttes tervrajzáról (a HTML-ről), és visszahozza Önnek ezt a tervrajzot. Még arra is törekszik, hogy átlagos látogatónak tűnjön a gyanú elkerülése érdekében.4. extractPrice()
html
tartalmat és a selector
-t.Cheerio
könyvtárat használja (amelyet hozzá kell adni az Apps Script projekthez) a HTML feldolgozásához, megkönnyítve a keresést.selector
segítségével pontosan meghatározza az árat tartalmazó HTML elemet.null
értéket ad vissza. Ellenkező esetben visszaadja a numerikus árat.extractPrice()
függvényre úgy, mint egy Adatdetektívre. Kap egy nagy dokumentumot (HTML) és egy konkrét nyomot (a CSS szelektort). A nyom segítségével megtalálja a pontos adatot (az ár szövegét), gondosan letisztítja róla az elfedő jeleket (pénznem szimbólumok, vesszők), és jelenti a talált végső numerikus értéket.5. updateSheet()
prices
tömböt (amelyet a main
függvény gyűjtött össze).getUrlsFromSheet
-hez).PRICE_COLUMN
), a második sortól kezdve és a szükséges számú sort átfogva.[[ár1], [ár2], ...]
).setValues()
segítségével beírja a kiválasztott tartományba a táblázatban.Miután beillesztette a kódot a szkriptszerkesztőbe:
main()
függvényt. Engedélyeznie kell a szkript számára a Google Táblázathoz való hozzáférést.extractPrice(html, selector)
függvény a leginkább webhelyspecifikus rész. Az árak HTML-ben való megjelenítése webhelyenként eltérő. Ezért előfordulhat, hogy módosítania kell a kódot ebben a függvényben, hogy megfeleljen a követett webhelyek szerkezetének. Valószínűleg meg kell vizsgálnia a webhely HTML forráskódját, hogy megfelelő CSS szelektort találjon.Ez az automatizált rendszer időt és energiát takarít meg Önnek azáltal, hogy automatikusan követi a termékárakat. Működésének alapjainak megértésével tovább testreszabhatja azt sajátos igényeinek megfelelően.
Az utolsó lépés a szkript ütemezése, hogy minden nap automatikusan lefusson a kívánt időpontban.
main()
függvényt.Bár a Google Apps Script UrlFetchApp
szolgáltatása sok webhely esetében hatékony, előfordulhat, hogy nem alkalmas erősen védett oldalakhoz, amelyek kaparás elleni intézkedéseket alkalmaznak, például CAPTCHA-kat és IP-blokkolást. Ezen védelmek megkerülésének kísérlete kizárólag Apps Script segítségével gyakran megbízhatatlan.
Az ilyen portálok kaparása vagy „black hat” (etikátlan) gyakorlatok folytatása dedikált, külső szolgáltatók megoldásait igényli, amelyek olyan technikákat alkalmaznak, mint a rotáló proxyk és a CAPTCHA-megoldók. Ilyen szolgáltatások például az Apify, a Bright Data, a ParseHub és a Scraper API.
Fontos, hogy ezek a szolgáltatások gyakran integrálhatók a Google Workspace automatizálási folyamataiba. Ez azt jelenti, hogy továbbra is létrehozhat egy teljes, automatizált munkafolyamatot a Workspace infrastruktúráján belül, még akkor is, ha külső kaparási megoldásra van szükség. Az ezen szolgáltatások által kinyert adatok zökkenőmentesen betáplálhatók a Google Táblázatokba, Dokumentumokba vagy más Workspace alkalmazásokba API-jaik vagy webhookjaik segítségével. Erősen ajánlott tiszteletben tartani a webhelyek szolgáltatási feltételeit és a `robots.txt` fájlt, valamint felelősségteljesen és etikusan végezni a kaparást.
A Google Workspace kvótákat és korlátozásokat ír elő az `UrlFetchApp`-ra a visszaélések megelőzése, a szolgáltatás stabilitásának fenntartása és a méltányos használat biztosítása érdekében minden felhasználó számára. Ezeket a korlátozásokat kulcsfontosságú megérteni webkaparó szkriptek tervezésekor:
UrlFetchApp
hívás vagy összetett feldolgozás miatt, elérheti ezt a korlátot és leállhat. Azonban gyakran újraindíthatja a szkriptet, miután a végrehajtási időkorlát elérése miatt leállt, lehetővé téve nagyobb adathalmazok feldolgozását vagy összetettebb feladatok szakaszos elvégzését.UrlFetchApp
kérést indíthat meghatározott időkereteken belül. Ezek a korlátok arra szolgálnak, hogy megakadályozzák a célwebhelyek túlterhelését kérésekkel. E cikk írásakor az ingyenes Google-fiókok napi korlátja általában körülbelül 20 000 `UrlFetchApp` hívás, míg a Google Workspace fiókok általában sokkal magasabb, napi körülbelül 100 000 hívásos korláttal rendelkeznek.UrlFetchApp.fetchAll()
használata lehetővé teszi több URL optimalizált lekérését. Ez a módszer jelentősen csökkenti a többletterhelést a szekvenciális lekéréshez képest azáltal, hogy hatékonyabban kezeli a hálózati kommunikációt, annak ellenére, hogy a kérések nem párhuzamosan futnak.Összefoglalva, a webkaparás Google Apps Script és Google Táblázatok segítségével hatékony, hozzáférhető és – ami fontos – ingyenes módot kínál a vállalkozások számára az adatgyűjtés automatizálására és értékes betekintések megszerzésére. A Google Apps Script mind az ingyenes Google-fiókokkal, mind a Google Workspace előfizetésekkel használható, így költséghatékony megoldást jelent minden méretű vállalkozás számára.
Továbbá, ha Google Workspace-t használ, az Apps Scriptre támaszkodva webkaparási igényeihez páratlan rugalmasságot és integrációt kap meglévő üzleti munkafolyamataiba. Ellentétben a merev, külső megoldásokkal, amelyek gyakran bonyolult integrációkat és adatátviteli folyamatokat igényelnek, az Apps Script zökkenőmentesen kapcsolódik más Workspace alkalmazásokhoz.
Bátorítjuk Önt, hogy fedezze fel a webkaparás lehetőségeit a Google Apps Script és a Táblázatok segítségével saját üzleti igényeihez, és aknázza ki az automatizált adatgyűjtésben rejlő potenciált a jobb hatékonyság és stratégiai előny érdekében. Az esetek száma, ahol ez a hatékony kombináció alkalmazható, gyakorlatilag végtelen; a piackutatás és versenytárselemzés automatizálásától a leadgenerálás és tartalomaggregálás egyszerűsítéséig csak a képzelete szab határt a lehetséges felhasználási módoknak.
automation expert
1118 Budapest, Ménesi út 24. Hungary
© 2024 bestflow. All rights reserved.