Scraping liste d'événement site web ?

Hello tout le monde, je recherche un moyen de récupérer les données de listes d’événements sur des agendas en ligne. Pour le moment je le fais à la main et comme vous pouvez vous en douter, c’est très long et fastidieux. Pouvez-vous m’aider s’il vous plait, à extraire ces données, en format CSV ? :pray:

Un exemple ?

https://www.savoie-mont-blanc.com/offre/recherche/evenements/15/~sport/(page)/1

Merci pour ta reactivite

Sur le site web isere tourisme, vous pouvez examiner les requêtes XHR avec la console de votre navigateur.

On remarque qu’une requête XHR est envoyée à une API lorsque l’on demande la page d’accueil. Vous pouvez copier/coller l’URL de l’API et la coller sur ce site pour convertir le JSON en CSV.

Vous aurez des données pour tous les évènements mais pas toutes les données pour chaque évènement, pour ça il faut utiliser un webscraper (souvent payant ou alors rapidement limité) ou alors utiliser un peu de code (Python maître course).

1 « J'aime »

Hello @TitanX,
tu sais comment je peux le faire avec toutes les requêtes du site d’un coup ?
Scraper par XHR marche mais je dois reproduire la démarche pour chaque action
(je n’ai pas/code pas python)

merci beaucoup

Si vous touchez un peu à Python vous pouvez exécuter ce script :

import csv
import os
from datetime import datetime
from pprint import pprint
from typing import Dict, List

from bs4 import BeautifulSoup
from requests import Session
from requests.structures import CaseInsensitiveDict

DEFAULT_VALUE = "NA"
FILENAME = "evenements_sportifs_isere"

BASE_URL = "https://www.isere-tourisme.com"
API_URL = "https://www.isere-tourisme.com/ajax/map/searchallbyrequest/solr:request:t2KSjnEsqsF5K6lDsMUjSRUDlNG3gXX62w30bj5OdkA/198"

# Create Headers
headers = CaseInsensitiveDict()
headers["User-Agent"] = "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:94.0) Gecko/20100101 Firefox/94.0"
headers["Accept"] = "application/json, text/javascript, */*; q=0.01"
headers["Accept-Language"] = "fr,fr-FR;q=0.8,en-US;q=0.5,en;q=0.3"
headers["X-Requested-With"] = "XMLHttpRequest"
headers["Connection"] = "keep-alive"
headers["Referer"] = "https://www.isere-tourisme.com/selection/evenements-sportifs"
headers["Cookie"] = "has_js=1"
headers["Sec-Fetch-Dest"] = "empty"
headers["Sec-Fetch-Mode"] = "cors"
headers["Sec-Fetch-Site"] = "same-origin"
headers["Cache-Control"] = "max-age=0"

session = Session()

def generate_csv_filename() -> str:
    timestamp = datetime.now().strftime("%Y%m%d_%H%M")
    return f"{timestamp}_{FILENAME}.csv"

def get_json_datas(url: str) -> List[Dict]:
    response = session.get(url, headers=headers)
    return response.json()

def scrape_one_page(url: str) -> Dict:
    response = session.get(url, headers=headers)
    soup = BeautifulSoup(response.text, "html.parser")

    try:
        title = soup.select_one("section#title div.section-title h1").text.strip()
    except AttributeError:
        title = DEFAULT_VALUE

    try:
        content = soup.select_one("div.content").text.strip()
    except AttributeError:
        content = DEFAULT_VALUE

    try:
        address = soup.select_one("div.info ul.list-info li.map span").text.strip()
    except AttributeError:
        address = DEFAULT_VALUE

    try:
        telephone = soup.select_one("div.info ul.list-info li.telephone span").text.strip()
    except AttributeError:
        telephone = DEFAULT_VALUE

    try:
        mail = soup.select_one("div.info ul.list-info li.mail span").text.strip()
    except AttributeError:
        mail = DEFAULT_VALUE

    try:
        website = soup.select_one("div.info ul.list-info li.website span").text.strip()
    except AttributeError:
        website = DEFAULT_VALUE

    datas_dict = {}
    datas_dict["url"] = url
    datas_dict["title"] = title
    datas_dict["content"] = content
    datas_dict["address"] = address
    datas_dict["telephone"] = telephone
    datas_dict["mail"] = mail
    datas_dict["website"] = website

    return datas_dict


if __name__ == "__main__":
    filename = generate_csv_filename()

    with open(filename, mode="w", encoding="utf-8") as csvfile:
        print(f"[+] Création du fichier csv à : {os.path.abspath(filename)}")
        fieldnames = ["nid", "url", "title", "content", "address", "telephone", "mail", "website", "lat", "lng", "picto"]
        csv_writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        csv_writer.writeheader()

        events = get_json_datas(API_URL)

        for event in events:
            nid = event["nid"]
            lat = event["lat"]
            lng = event["lng"]
            picto = event["picto"]
            html = BeautifulSoup(event["html"], "html.parser")
            url = BASE_URL + html.select_one("h3 > a").attrs["href"]
            datas: Dict = scrape_one_page(url)
            datas["nid"] = nid
            datas["lat"] = lat
            datas["lng"] = lng
            datas["picto"] = picto
            csv_writer.writerow(datas)
            pprint(f"[+] Writing datas: {datas}")

Le script va créer un fichier csv et y enregistrer les données. Le script est un peu immonde mais j’ai écrit ça vite fait avant de dîner. Si j’ai le courage je le passerai en POO.

Avant de l’exécuter il faut juste installer les bibliothèques requests et bs4 :

pip install requests bs4

Vous copier/coller le script dans un fichier, main.py par exemple et pour l’exécuter :

python3 main.py

Avec ça vous allez scraper without vergogne les randonnées du Mont-Blanc.

1 « J'aime »

Merci pour vos retours, par contre, je ne touche pas du tout à Python.
Je voulais également savoir, si ce script, cette méthode, est duplicable sur les autres sites ?

Bonjour,
Tu as Hexomatic sur appsumo en ce moment. Il te permettra de faire ça. J’utilise un autre de leur produit et c’est bien (no code).

1 « J'aime »

Let’s go pour faire chauffer la carte !

Salut, https://clay.com te permet de faire ça très rapidement grâce à leur extension chrome.

N’hésite pas à me contacter si tu as besoin d’aide pour le prendre en main.

Hello,
J’utilise l’extension Chrome Web Scraper.
Elle est facile à configurer, même pour les non développeurs, en suivant les tutoriels !

1 « J'aime »

image
Sur Excel tu peux scraper à partir du web si t’as de la chance c’est pas degeu

1 « J'aime »

Merci, je vais aller jeter un coup d’oeil :wink:

1 « J'aime »

Je te conseille, c’est vraiment impressionnant d’efficacité ! Mais pas évident à utiliser au départ. Écris-moi si tu as besoin d’aide.