Faire des requêtes POST est une technique cruciale pour l’automatisation du Web et le Web Scraping. Voyons comment réaliser cette fonctionnalité avec le framework Playwright.
L’automatisation du Web est un moyen technique par lequel les actions effectuées sur Internet, via les navigateurs Web, sont réalisées de manière automatisée. Cela inclut la lecture et la réponse, le téléchargement, le remplissage de formulaires, etc.
Playwright est une bibliothèque NodeJS & Python permettant d’automatiser Chromium, Edge, Firefox et WebKit avec une seule API.
Pourquoi avons-nous besoin de requête POST ?
La requête POST est l’un des nombreux types de requête HTTP disponibles. Par conception, cette méthode est utilisée pour envoyer des données à un serveur web pour traitement.
L’utilisation des requêtes POST est l’un des principaux moyens d’envoyer des données de formulaire lors de la connexion ou de l’enregistrement d’informations sur le serveur Web. C’est également l’un des moyens d’envoyer n’importe quelle donnée a un serveur web. En effet, de nombreux sites utilisent les requêtes POST pour la communication client-serveur, ce qui nécessite la possibilité d’envoyer des requêtes POST pendant l’automatisation / le web scraping.
API Playwright APIRequestContext
L’idée de notre approche est assez simple. Nous devons changer le type de demande de requête lors de l’ouverture de la page, afin de pouvoir envoyer des données POST en même temps que l’ouverture d’une page. Pour ce faire, nous utilisons la classe Playwright APIRequestContext avec la méthode fetch().
Cette méthode permettant
- L’envoie d’une requête HTTP(S).
- Le renvoie de la réponse.
- Le remplissage des cookies de la requête à partir du contexte.
- La mise à jour des cookies du contexte à partir de la réponse.
- De passer directement les objets au format json
Il est à noter que cette méthode suivra automatiquement les redirections.
Dans notre exemple ci-dessous, les arguments de cette méthode étant
url_or_request
: URL ou requête cible ou les données seront postées.headers
: Permet de définir les en-têtes (headers) de la requête HTTP(S).method
: Permet de définir la méthode de la requête (par exemple, PUT ou POST). Si elle n’est pas spécifiée, la méthodeGET
est utilisée.data
: Permet de définir les données communiquées dans la requête. Si le paramètre data est un objet, il sera sérialisé en chaîne json et l’en-têtecontent-type
sera défini àapplication/json
s’il n’est pas explicitement défini. Sinon, l’en-têtecontent-type
sera fixé àapplication/octet-stream
s’il n’est pas explicitement défini.
import asyncio from playwright.async_api import async_playwright, Playwright async def run_post(playwright: Playwright, url: str, data: dict): # https://playwright.dev/python/docs/browsers#google-chrome--microsoft-edge browser = await playwright.firefox.launch() # https://playwright.dev/python/docs/api/class-apirequest#api-request-new-context context = await browser.new_context() api_request_context = context.request # https://playwright.dev/python/docs/api/class-apirequestcontext#api-request-context-fetch response = await api_request_context.fetch( url_or_request=url, headers={"Accept": "application/json"}, method='post', data=data ) assert response.ok response_dict = await response.json() assert response_dict['json']['hello'] == data['hello'] async def main(): async with async_playwright() as playwright: await run_post(playwright, 'https://httpbin.org/post', {'hello': 'I like Playwright'}) asyncio.run(main())
L’utilisation de cette fonction est simple avec la possibilité d’utiliser cette API avec n’importe quelle méthode HTTP(S) disponible et des en-têtes personnalisés.
Conclusion
Avec cette Api de Playwright, il est possible d’envoyer tout type de requête permettant d’étendre les capacités de l’automatisation Web / Web Scraping et d’améliorer les performances en simplifiant le remplissage de formulaires.