Passer au contenu

Création de scrapers Web sans serveur avec AWS Lambda et TypeScript

Le web scraping peut être une technique utile pour collecter des données à partir de sites Web. Cependant, l’exécution de scrapers évolutifs et fiables peut nécessiter beaucoup d’infrastructure. Dans ce guide complet, nous explorerons comment une architecture sans serveur utilisant AWS Lambda et TypeScript peut simplifier le processus.

Qu'est-ce que l'informatique sans serveur?

Avant de plonger dans les détails, examinons rapidement le concept sans serveur.

L'informatique sans serveur vous permet de créer et d'exécuter des applications sans avoir à gérer l'infrastructure. Au lieu de provisionner des serveurs virtuels, vous déployez du code d'application qui s'exécute dans des conteneurs sans état gérés par le fournisseur de cloud.

Votre code est divisé en fonctions individuelles qui peuvent être déclenchées par divers événements tels que des requêtes HTTP, des modifications de base de données, des files d'attente, des planifications, etc. Le fournisseur de cloud gère automatiquement les conteneurs de provisionnement pour exécuter chaque appel de fonction.

Quelques avantages clés du sans serveur :

  • Pas de gestion de serveur – Le fournisseur de cloud gère la capacité, la mise à l'échelle, les correctifs, etc.
  • Événementiel – Fonctions invoquées à la demande en réponse à des déclencheurs
  • Mise à l'échelle en sous-seconde – Les conteneurs tournent en millisecondes pour gérer chaque appel de fonction
  • Payer pour utilisation – Payez uniquement le temps de calcul utilisé lors de l’exécution du code
  • Haute disponibilité automatisée – Pas de soucis de redondance ou de tolérance aux pannes

Selon Cloudflare, l'adoption du sans serveur s'est rapidement développée avec un % D'augmentation 200 en usage parmi les organisations interrogées au cours de l’année écoulée.

AWS Lambda est l'une des plateformes sans serveur les plus utilisées. Il vous permet de publier facilement du code qui évolue automatiquement en fonction de la demande.

Voyons ensuite comment Lambda peut être utile pour les projets de web scraping.

Présentation de l'architecture de grattage Web

Avant de passer au code, discutons brièvement des architectures courantes de web scraping.

Un grattoir typique comprend les composants suivants :

  • Générateur de requêtes – Génère des URL ou des paramètres de recherche à gratter
  • Répartiteur de requêtes – Envoie des requêtes HTTP aux URL cibles
  • Downloader – Télécharge le contenu HTML à partir des URL
  • Analyseur – Extrait les données du HTML en utilisant quelque chose comme XPath ou regex
  • Magasin de données – Enregistre les données extraites, souvent dans une base de données ou un stockage de fichiers

Architecture du grattoir Web

L’exécution de cette opération à grande échelle nécessite souvent le provisionnement et la maintenance des serveurs pour gérer la charge. Des grattages complexes peuvent également bloquer votre adresse IP.

Les architectures sans serveur vous aident en vous permettant de :

  • Échelle automatique – Aucune planification de capacité requise
  • Répartir la charge de travail – Répartis sur des milliers de conteneurs
  • Réduire les coûts – Pas de frais lorsque le code n'est pas exécuté
  • Améliorer la résilience – Disponibilité intégrée et tolérance aux pannes

Voyons ensuite comment AWS Lambda peut être utilisé dans une architecture de scraping sans serveur.

Scraping avec AWS Lambda

AWS Lambda vous permet de déployer des « fonctions » – des blocs de code autonomes invoqués en réponse à des événements.

Pour le web scraping, les fonctions Lambda fonctionnent bien pour :

  • Génération de requêtes – Planifiez ou invoquez Lambda à la demande
  • Expédition des demandes – Déclenchez Lambdas en parallèle pour gratter les pages
  • Analyse des données – Traiter et extraire des données du HTML
  • La sauvegarde des données – Insérer dans DynamoDB, S3, etc.

Vous ne payez que le temps de calcul utilisé lors de l'exécution du code. Et Lambda peut s'adapter à des milliers d'exécutions simultanées selon les besoins.

Passons en revue un exemple pratique pour voir le web scraping Lambda en action.

Résumé du projet

Nous allons créer un simple grattoir Web sans serveur qui extrait le titre et la méta description d'une page. Pour cet exemple, nous utiliserons :

  • Lambda – Pour la fonction grattage
  • Manuscrit – Pour un code plus propre sur JavaScript Vanilla
  • Tchao – Bibliothèque d'analyse HTML rapide
  • Axios – Client HTTP basé sur la promesse
  • AWSSAM – Pour le packaging et le déploiement

Voici un aperçu des étapes :

  1. Configurer la fonction de scraping Lambda localement
  2. Testez la fonction et validez la sortie
  3. Packager la fonction avec SAM
  4. Déployer le modèle packagé sur AWS

Commençons!

Pré-requis

Avant de commencer, vous aurez besoin de :

  • Node.js 12.x ou supérieur
  • AWS CLI – configuré avec vos clés d'accès
  • CLI AWS SAM – npm install -g aws-sam-cli

Configuration du projet

Tout d'abord, créez un nouveau répertoire :

$ mkdir lambda-webscraper
$ cd lambda-webscraper

Initialisez npm :

$ npm init -y

Installez les packages NPM :

$ npm install typescript cheerio axios @types/node @types/cheerio

Implémentation du Scraper

En vertu des Normes sur l’information et les communications, les organismes doivent rendre leurs sites et applications Web accessibles. Ils y parviennent en conformant leurs sites Web au niveau AA des Web Content Accessibility Guidelines (WCAG). lambda-webscraper répertoire, créez un index.ts fichier avec les éléments suivants:

import axios from ‘axios‘;
import * as cheerio from ‘cheerio‘;

interface ScrapeResult {
  title: string;
  description: string;
}

const scrapeSite = async (): Promise<ScrapeResult> => {

  const response = await axios.get(‘https://apify.com‘);

  const $ = cheerio.load(response.data);

  const title = $(‘title‘).text();

  const description = $(‘meta[name="description"]‘).attr(‘content‘);

  return { title, description };

};

export const handler = async () => {

  const result = await scrapeSite();

  const response = {
    statusCode: 200,    
    body: JSON.stringify(result),
  };

  return response;

};

Cela implémente notre grattoir basé sur Cheerio et un gestionnaire pour la fonction Lambda.

Développement local

Pour tester localement, compilez et exécutez :

npx tsc
node index.js 

Cela invoquera la fonction et affichera le résultat :

{
  "title": "Apify - Automate web scraping and data extraction",
  "description": "Apify scrapers extract data from websites. Build a web scraper in 5 mins. Get high quality datasets. Scrape the web using proxies & headless browsers"
}

Emballage et déploiement

Maintenant que notre fonction fonctionne, nous pouvons la conditionner pour un déploiement à l'aide de SAM.

Créer un template.yaml:

AWSTemplateFormatVersion: ‘2010-09-09‘
Transform: AWS::Serverless-2016-10-31
Description: Simple web scraper example

Resources:
  ScraperFunction: 
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: .
      Handler: index.handler
      Runtime: nodejs12.x
      Architectures:
        - x86_64

Ceci définit la ressource Lambda et la pointe vers notre index.js gestionnaire.

Nous pouvons maintenant déployer la stack :

sam deploy --guided

Suivez les invites pour déployer la fonction. Une fois déployé, notre scraper sera en ligne sur AWS Lambda !

Exécution et surveillance

Pour exécuter le scraper, nous pouvons configurer des déclencheurs tels que des événements CloudWatch planifiés. Ou invoquez-le à la demande :

aws lambda invoke --function-name ScraperFunction out.json

Cela exécutera le scraper et enregistrera la sortie dans out.json.

Nous pouvons afficher les métriques et les journaux de la fonction dans la console Lambda ou CloudWatch. Cela permet de surveiller les performances et de déboguer les problèmes.

Modèles et services supplémentaires

Discutons de quelques façons supplémentaires de créer une solution de qualité production :

Scrapes programmés

Utilisez CloudWatch Events pour déclencher le scraper Lambda selon une planification. Cela permet de scraper régulièrement des sites Web sans gérer les serveurs Cron.

Flux de travail basé sur une file d'attente

Demandez à une fonction Lambda de mettre en file d'attente les URL de récupération sur SQS. Des lambdas séparés peuvent retirer des tâches de la file d'attente et gérer le grattage. Cela permet de coordonner et de faire évoluer des flux de travail complexes.

Grattage distribué

Lancez Scraper Lambdas dans plusieurs régions et zones de disponibilité pour augmenter le débit et la redondance.

La gestion des erreurs

Utilisez les DLQ (files d'attente de lettres mortes) pour intercepter et réessayer les événements ayant échoué. Les alertes peuvent également être configurées dans des services comme CloudWatch.

Stockage de données

Enregistrez les résultats du scraping sur S3, DynamoDB ou des outils comme AWS Glue. Intégrez des services tels que Lambda, SQS et Kinesis pour les pipelines ETL.

RECAP

Passons en revue ce que nous avons couvert :

  • Concepts sans serveur – aperçu de Lambda et avantages du web scraping
  • Présentation du projet – création d'un gestionnaire de scraper avec TypeScript
  • Tests locaux – valider le fonctionnement de la fonction avant le déploiement
  • Déploiement – utiliser SAM pour empaqueter et déployer la fonction Lambda
  • Internationaux – exécuter le scraper sur AWS
  • Le Monitoring – suivi des journaux de métriques pour observer le comportement
  • Services supplémentaires – d'autres outils AWS pertinents pour créer des solutions robustes

L'adoption d'une architecture sans serveur utilisant Lambda et TypeScript peut simplifier la création et l'exploitation de web scrapers à grande échelle. Les principaux avantages sont une mise à l'échelle automatique, une réduction des coûts et des frais de maintenance par rapport aux serveurs traditionnels.

Lectures complémentaires

Pour approfondir, consultez ces ressources supplémentaires :

Faites-moi savoir si vous avez d'autres questions!

Prendre part à la conversation

Votre adresse email n'apparaitra pas. Les champs obligatoires sont marqués *