SAÉ 105 - Traiter des données
Retour aux SAE
By / Troncati Théo & Auduberteau Emilien
Contexte :
L'objectif de cette SAE était de développer un script en langage Python capable d'analyser un fichier log d'un serveur Apache et de présenter les informations extraites sous une forme visuelle plus intuitive et compréhensible pour l'utilisateur (par exemple sous la forme d'un graphique).
Déroulement :

Pour la première partie de cette SAE, nous avions à notre disposition un fichier log d'un serveur qui héberge un site de Disques Vinyles. Dans ce fichier log se situent toutes les informations qu'un serveur peut avoir d'un client comme l'adresse IP, l'OS et le navigateur utilisé. L'objectif était de traiter ces données afin d'extraire les adresses IP, éviter les doublons et de les afficher sur une carte. Cela permet d'obtenir une visualisation claire des utilisateurs ayant visité le site. De plus, à partir de la structure de ce fichier .log, il nous était demandé de le reformater en .Json ou .XML

La deuxième partie de cette SAE reposait sur notre capacité à pouvoir créer une interface graphique. Nous devions donc recréer le célèbre jeu du Casse-Brique en langage Python avec l'aide de la librairie Tkinter.

Conclusion :
Cette SAE m’a permis d’approfondir mes connaissances en Python, notamment dans la lecture et le traitement de fichiers, l’utilisation des expressions régulières, et le reformatage de données en JSON ou XML. J’ai également découvert de nouvelles bibliothèques comme folium pour la visualisation sur carte et tkinter pour créer une interface graphique. Ces outils m’ont permis de mieux comprendre comment rendre un programme plus interactif et accessible pour l’utilisateur.
Documents :
Partie 1 - Ip2Map
Fichiers à télécharger :
Programme Python :
                        
                        
                            from time import sleep
                            import requests
                            import folium
                            json_table2 = []

                            def get_ip():
                                ip_table = []
                                with open("log.log", 'r') as fichier:
                                    print("Traitement du fichier log...")
                                    for line in fichier:
                                        line_table = line.split(" ")
                                        if line_table[0] not in ip_table:
                                            ip_table.append(line_table[0])
                                return ip_table

                            def get_json(trame):
                                global json_table
                                url = "http://ip-api.com/batch"
                                headers = {"Content-Type": "application/json"}
                                response = requests.post(url, json=trame, headers=headers)
                                
                                if response.status_code == 200:
                                    #Enlever les crochets
                                    return response.json()   # Résultats de localisation

                                else:
                                    print(f"Erreur HTTP {response.status_code}: {response.text}")
                                    return []  # Retourner une liste vide en cas d'erreur

                            def send_ip2api():
                                global json_table2
                                #Envoie d'une liste de 100 @IP : 15 x par minute
                                compteur = 0
                                ip_table = get_ip()
                                len_iptable = len(ip_table)
                                print("Envoie de 15 requètes")
                                while len(ip_table) > 0:
                                    if compteur < 15:
                                        trame = ip_table[:100]
                                        #Envoie de la trame
                                        json_table = (get_json(trame))
                                        #Mettre mieux la liste
                                        for i in json_table:
                                            json_table2.append(i)
                                        ip_table = ip_table[100:]
                                        compteur += 1
                                    else:
                                        print("Attente de 60s")
                                        sleep(60)
                                        compteur = 0
                                return json_table
                                
                            def create_map():
                                final = []
                                m = folium.Map(location=[48.8566, 2.3522], zoom_start=2)
                                #Obtenir une liste simple
                                for loc in json_table2:
                                    final.append(loc)
                                print(len(final))
                                print(final)
                                for i in final:
                                    if 'lat' in i and 'lon' in i:
                                        
                                        lat = i['lat']
                                        lon = i['lon']
                                    
                                    folium.Marker([lat, lon]).add_to(m)
                                m.save('carte.html')
                                print("Carte créée avec succès")      

                            send_ip2api()
                            create_map()
                        
Partie 2 - Brick-Breaker
Fichiers à télécharger :