Under development - TRIAL version
Η συγκεκριμένη πλατφόρμα apify.com είναι μια PaaS (Platform as a Service) serverless υπηρεσία, που επιτρέπει την εκτέλεση εργασιών χωρίς να χρειάζεται να διαχειρίζεται κάποιος υποδομές. Η λογική του container βασίζεται στην ιδέα της απομόνωσης και της κατάτμησης σε containers και όχι σε εικονικές μηχανές. Η δημιουργία containers, δημιουργεί ελαφριά (light) και απομονωμένα υπολογιστικά περιβάλλοντα, τα οποία μοιράζονται τον πυρήνα ενός λειτουργικού συστήματος ενός φυσικού εξυπηρετητή (host). Κάθε container περιέχει μόνο τις εφαρμογές και τις βιβλιοθήκες που χρειάζονται για να εκτελεστεί, χωρίς να απαιτείται ξεχωριστό λειτουργικό σύστημα, όπως συμβαίνει στις λύσεις εικονικοποίησης (vritualisation), και για αυτό το λόγο χαρακτηρίζεται ελαφρύτερο και απαιτεί λιγότερους πόρους για τη λειτουργία του. To πλεονέκτημα χρήσης containers είναι αυτή η μικρότερη κατανάλωση υπολογιστικών πόρων αλλά με τίμημα τη μικρότερη απομόνωση συγκριτικά με τη χρήση VM. Κάθε πρόγραμμα (actor) στην apify πλατφόρμα εκτελείται σε ένα ξεχωριστό container, το οποίο περιέχει όλες τις απαραίτητες εξαρτήσεις και ρυθμίσεις για την εκτέλεση της εργασίας. Αυτό επιτρέπει την εύκολη μεταφορά και εκτέλεση του actor σε οποιοδήποτε περιβάλλον υποστηρίζει containers.
Τα πλεονεκτήματα της χρήσης τέτοιων πλατφορμών περιλαμβάνουν την αποδοτική χρήση πόρων, καθώς πολλά containers μπορούν να εκτελούνται ταυτόχρονα στον ίδιο φυσικό εξοπλισμό, μειώνοντας το κόστος και αυξάνοντας την κλιμακωσιμότητα.
Η apify λύση υποστηρίζει διάφορες γλώσσες (node.js, java, .net,) και δεν περιορίζεται σε scraping - είναι μια πλατφόρμα χωρίς εξυπηρετητές (serverless μπορεί να γίνει με σκέτη Python, Python με βιβλιοθήκη scrapy, Python με selenium ή αντίστοιχα javascript ή / και typescript). Ειδικά σε ότι αφορά scraping τις δυναμικές XHR, FetchAPI σελίδες (σε αυτές τροποποιείται το DOM στην πορεία του χρόνου μετά το φόρτωμα της σελίδας on load event για παράδειγμα η ιστοσελίδα f2g.gr[1]). H δυσκολία με αυτές τις δυναμικές σελίδες είναι ότι οι ανάγκες αυτοματοποιημένης ανάγνωσης δεν καλύπτονται από τους απλούς HTML scrapers, όπως beautifulsoup python, scrapy +python cheerio κλπ. Για αυτές τις περιπτώσεις χρειαζόμαστε οπωσδήποτε μια από τις βιβλιοθήκες selenium, puppeteer ή playright. Nα τονίσουμε ότι όλες αυτές οι δυνατές επιλογές python, python με beautiful soup κ.λ.π. ή nodejs με playwright κ.α. μπορούν να εκτελεστούν και χωρίς το περιβάλλον apify. Το τελευταίο παρέχει υπολογιστική ισχύ, φιλοξενία, επεκτασιμότητα για σάρωση χιλιάδων σελίδων με παραλληλισμό αλλά και επιπλέον δυνατότητες residential ip proxies (εναλλαγή διευθύνσεων ip από τα οποία εξέρχονται τα αιτήματα, ώστε να υπάρχουν δυνατότητες για αποφυγή μπλοκαρίσματος από antibot μηχανισμούς προστασίας των ιστοσελίδων). Εννοείται ότι όλες αυτές οι επιλογές παρέχονται με το ανάλογο τίμημα στη λογική «πληρώνεις ότι χρησιμοποιείς».
Εικόνα 1 αρχιτεκτονικό διάγραμμα διαλειτουργικότητας apify actors με webhooks / integrations
Παρότι κάποιες ιστοσελίδες παρόχων μπορούσαν να περιηγηθούν και χωρίς playwright επιλέχθηκε playwright για ομοιομορφία. Η βιβλιοθήκη Playwright συγκριτικά με Puppeteer ή Selenium είναι νεότερη βιβλιοθήκη παρέχεται ανοικτά πλέον από την Microsoft, είναι πιο φιλική στο χρήστη και δυσκολότερο να μπλοκαριστεί από μηχανισμούς antibot γιατί έχει μεγαλύτερη ικανότητα απομίμησης πολλών φυλλομετρητών (multibrowser support - όχι μόνο chrome αλλά και firefox και safari edge), παράλληλης εκτέλεσης κλπ Δοκιμές με Selenium με δυσκόλεψαν καθώς είναι η παλαιότερη βιβλιοθήκη και η πιο δύσχρηστη, συνεπώς επιλέχθηκε η playwright.
Δεδομένου ότι αντιμετωπίζουμε και XHR/FetchAPI περιεχόμενο αποφασίσα να χρησιμοποιήσω παντού javascript με playwright για ομοιομορφία αλλά και ευκολία ενσωμάτωσης σε apify actor, ώστε να είμαστε έτοιμοι για πιθανή μετάβαση σε νεφουπολογιστικά συστήματα χωρίς εξάρτηση από τοπικούς εξυπηρετητές (χωρίς υψηλά CAPEX εμπροσθοβαρή δαπάνες) έχοντας πάντα κατά νου ότι η ενδεχόμενη μελλοντική χρήση scraping τεχνολογιών για τις ανάγκες σε εμπορικά marketplaces θα αντιμετωπίσει μηχανισμούς antibot τα οποία μόνο πλατφόρμες μπορούν να αντιμετωπίσουν με residential proxies κλπ. Εξοικείωση με τα ίδια εργαλεία που χρησιμοποιεί η commission μας φέρνει στην πρώτη γραμμή αμύνης και μπορούμε να βοηθήσουμε τις κοινές Ευρωπαϊκές προσπάθειες.
Η πλατφόρμα APIFY έχει διπλή φύση λειτουργεί και αποκλειστικά στο σύννεφο στην πλατφόρμα apify.com με IDE μέσω browser σε μια λογική SaaS (η τιμολογιακή πολιτική ακολουθεί μοντέλο OPEX όπου πληρώνουμε για την επεξεργαστική ισχύ που χρησιμοποιούμε / καταναλώνουμε ανά μήνα – κάθε μήνα 5$ δωρεάν πόρων για χρήση στο δωρεάν πακέτο). Επαναλαμβάνω ότι δεν να χρειάζεται τοπικά καμία υποδομή.
Κάθε πρόγραμμα / αυτοματισμός αποκαλείται actor. Ένας actor είναι στην ουσία ένα serverless microservice που έχει ως είσοδο κάποιες ιστοσελίδες ή δεδομένα ή ακόμα και την έξοδο από κάποιο άλλο actor. Ο αctor επενεργεί σε αυτά τα δεδομένα και παράγει ένα αποτέλεσμα (scraped data, υπολογισμό, την αποστολή email, αποθήκευση σε βάση κάποιων δεδομένων κλπ). Τα actors που εκτελούνται στο σύννεφο της apify.com εκτελούνται σε docker containers. Στην περίπτωσή μας ήταν προτιμητέο (για εξοικονόμηση των δωρεάν 5$USD) να αναπτύξουμε πρώτα τοπικά και η τελική παραγωγική έκδοση να ανεβαίνει στο σύννεφο. Αυτό δεν αποκλείει το σενάριο όπου όλος ο κύκλος ζωής πραγματοποιείται εξολοκλήρου στο σύννεφο της apify. Πιο σύνθετες διεργασίες μπορούν να κατακερματιστούν σε επιμέρους βήματα actors και να διευκολύνουν την ανάπτυξη και την επαναχρησιμοποίησή τους. H υβριδική λειτουργία επιτρέπει ένα actor που αναπτύχθηκε στο σύννεφο να κατέβει τοπικά και να εκτελείται τοπικά με όποιες βέβαια αλλαγές απαιτούνται ώστε να έχει πρόσβαση στα ίδια δεδομένα (κλειδιά api, βιβλιοθήκες κλπ). Ομοίως και το αντίστροφο ένας actor μπορεί αρχικά να αναπτυχθεί τοπικά και μόλις ολοκληρωθεί να ανέβει στο σύννεφο της apify ώστε να εκμεταλλευτεί είτε επεξεργαστική ισχύ είτε επιπλέον δυνατότητες για ip residential proxies κλπ. Εννοείται ότι η τοπική εκτέλεση apify actor μέσω του apify cli δεν καταναλώνει πόρους από το σύννεφο της apify και είναι δωρεάν. Χρειάζεται τοπική επεξεργαστική ισχύς. Τα αιτήματα scraping θα γίνουν από την τοπική ip και το τοπικό δίκτυο. Για να το εργαστείς τοπικά με apify actors χρειάζεται να εγκαταστήσεις το apify cli:
Ø npm install -g apify-cli@latest ή και npm install apify
Οι διάφορες εντολές που μπορείς να χρησιμοποιήσεις:
Ø Cd c:\PLAYWRIGHT FOLDER
Ø Apify login μπορείς είτε με τοκεν είτε να ανοίξει browser και να ανοίξεις το προφιλ στο σύννεφο της apify.com, ώστε να μπορείς να εκτελέσεις την pull (για να κατεβάσεις από το προφιλ σου τον actor που μόλις έφτιαξες)
Ø apify pull [actorid]
κατεβάζει τον κώδικα που έχεις κατασκευάσει στο σύννεφο τοπικά
Ø apify push [actorid]
ανεβάζει τον κώδικα που έχεις κατασκευάσει τοπικά προς το σύννεφο
Ø apify push .gitignore
ΔΕΝ ανεβάζει storage και node modules που δεν χρειάζονται γιατί παράγονται από την πλατφόρμα
Ø apify run (για την τοπική εκτέλεση)
Ø apify run - - purge (για να καθαρίζεις τα προσωρινά αρχεία datasets που παράγονται )
Ø apify --version
Ø apify info
Ανάπτυξη μπορεί να ξεκινήσει τοπικά ως εξής:
Ø apify create (θα κατασκευάσει φάκελο με το όνομα του actor που θα ορίσεις)
οι επιλογές για javascript είναι
crawlee+ cheerio
crawlee+puppeteer + Chrome
crawlee + playwright + Chrome
bootstrap cheerio crawler
cypress
empty javascript project
standby javascript project
Η νέα έκδοση του apify cli χρησιμοποιεί τη δομή αρχείων με .actor\actor.json αντί για το παλαιότερο actor.json
Ο κώδικας playwright χωρίς τη βιβλιοθήκη apify δίνει τη δυνατότητα χρήσης εργαλείου παρόμοιου με το selenium για παραγωγή του σκελετού ή για την παραγωγή δύσκολων αλληλουχιών κουμπιών σε δυναμική σελίδα με φόρμα και επιλογές στο UI. Η σχετική εντολή είναι npx playwright codegen που θα δεις παρακάτω. Διαφορετικά η ανάπτυξη γίνεται με το κλασσικό web development inspection στα css, curl, request / response για cookies, network analysis για τα XHR κλπ.
Σημαντικό είναι να γίνει κατανοητό ότι ο playwright κώδικας (Script) εκτελούνται στο playwright scope (περιβάλλον), ενώ τα page parse scripts για τις δυναμικές σελίδες εκτελούνται στο browser page environment. Αυτά δημιουργούν δυο διαφορετικά πεδία ορισμού (Scope) εκτελούνται σε διαφορετικές διεργασίες ίσως και σε διαφορετικά VMs ή και συσκευές. Η συνάρτηση page.evaluate() μπορεί να εκτελέσει μια javascript συνάρτηση σε περιβάλλον ιστοσελίδας και να επιστρέψει τα αποτελέσματα στο περιβάλλον του Playwright. Eαν η συνάρτηση είναι ασύχρονη η evaluate θα περιμένει μέχρι να ετοιμαστεί το αποτέλεσμα:
Const data;
Const result = await page.evaluate (data =>{ = > Window.myapp.use(data); },data);
και η ανταλλαγή μεταβλητών γίνεται μόνο μέσα από την κλήση τη συνάρτησης.
[1] το bundles.json αρχείο με τις τιμές των προϊόντων που θα αποικίσουν τη σελίδα δεν είναι προσβάσιμο παρά μετά το φόρτωσή της
Δεν εκθέτουν όλοι οι ιστότοποι τα δεδομένα τους μέσω APIs, αλλά οποιοσδήποτε ιστότοπος εκθέτει δημόσια δεδομένα μπορεί τεχνικά να γίνει scrape, εφόσον τηρούνται οι όροι παροχής υπηρεσιών, οι πολιτικές απορρήτου και το αρχείο robots.txt μπορούμε να αυτοματοποιήσουμε τη λήψη δεδομένων. Παρατηρείται σύγκλιση των εποπτικών αρχών και ειδικά στους Κανονισμούς: GENERAL PRODUCT SAFETY REGULATION GPSR (EU 2023/988) και Ψηφιακών Αγορών DIGITAL SERICES ACT - ΕU 2022/2065). Τρεις ομάδες εργασίας του DSA, οι DSA WG1, DSA WG3 (Transparency DB) και DSA WG5 (Consumers and online Marketplaces ) μνημονεύουν τον Κανονισμό GPSR General Product Safety Regulation ενώ τονίστηκε η σημασία του άρθρου 22 του EU 2023/988. Στο άρθρο 22 παράγραφος 12 σημείο (i) υπάρχει ειδική μνεία για το scraping[2] . Σε αυτό το σημείο πρέπει να σημειώσουμε ότι δεν υπάρχει σε άλλη νομοθεσία σχετική αναφορά ούτε έγινε κάποια διερεύνηση για το εάν οι υπάρχοντες κανονισμοί και νομοθεσία θέτουν διαφορετικές υποχρεώσεις. Το εν λόγω PoC έγινε για ανίχνευση των τεχνικών δυνατότητων που υπάρχουν σε αυτή την τεχνολογία.
Σημείωση: Μια διαδικασία scraping δεν μπορεί να εγγυηθεί 100% αξιοπιστία, επειδή εξαρτάται άμεσα από τον στοχευόμενο ιστότοπο, ο οποίος δεν είναι υπό τον έλεγχό μας. Εάν οι στοχευόμενοι διακομιστές υποστούν επιβράδυνση ή είναι εκτός σύνδεσης, δεν θα λάβουμε δεδομένα. Τα scrapers υπόκεινται επίσης σε αποτυχία λόγω αλλαγών στον ιστότοπο. Ορισμένοι ιστότοποι προστατεύουν τα δεδομένα τους με τεχνολογίες anti-scraping. Αυτές μπορεί να κυμαίνονται από απλή ανάλυση κεφαλίδας HTTP έως προηγμένα συστήματα που βασίζονται σε fingerprinting, CAPTCHAS, rate limiting και εξουσιοδότηση IP.
[1]: “DG JUST presented the General Product Safety Regulation (“GPSR”) with a special focus on the obligations applicable to providers of online marketplaces, which are the main interlink with the DSA. The obligations under this Chapter include i.a. an obligation to register in the Safety Gate Portal, to indicate the point of single contact, to follow up on orders within two working days at the latest, to cooperate on recalls, or to inform relevant authorities and traders about unsafe products. DG JUST explained that the enforcement regime of the GPSR and the DSA are complementary. As a main rule, the enforcement of the GPSR lies with the national Market Surveillance Authorities („MSAs”). ”
[2] 12.Providers of online marketplaces shall cooperate with the market surveillance authorities, with traders and with relevant economic operators to facilitate any action taken to eliminate or, if that is not possible, to mitigate the risks presented by a product that is or was offered online through their services.
In particular, providers of online marketplaces shall:.… (i)upon a reasoned request of the market surveillance authorities, when providers of online marketplaces or online sellers have put in place technical obstacles to the extraction of data from their online interfaces (data scraping), allow the scraping of such data only for product safety purposes based on the identification parameters provided by the requesting market surveillance authorities