Recherche d'un nom sur un site web
FerméRaph_0 Messages postés 7 Date d'inscription vendredi 28 juillet 2023 Statut Membre Dernière intervention 29 juillet 2023 - 29 juil. 2023 à 15:36
- Recherche d'un nom sur un site web
- Site de telechargement - Accueil - Outils
- Site comme coco - Accueil - Réseaux sociaux
- Creer un site web - Guide
- Quel site remplace coco - Accueil - Réseaux sociaux
- C'est quoi l'url d'un site ? - Guide
8 réponses
28 juil. 2023 à 16:25
Bonjour,
Le problème vient tout simplement du fait de "while arrival_links", pour vérifier la présence de arrival_links, ça marche, sauf que vous faites rentrer le programme dans une boucle infinie, le programme refait donc le tour du même bateau indéfiniment.
Solution :
Il suffit de remplacer while par if.
Merci pour votre retour
28 juil. 2023 à 16:38
Bonjour expertsinformatique,
Je vous remercie de votre réponse. J'ai changé le "while" par "if" mais malheureusement j'obtient toujours le même problème (les liens du même bateaux sont fouillés).
if arrival_links:
# Stocker les liens "arrival_" à explorer pour le lien "/ship_"
arrival_links_to_explore = arrival_links.copy()
28 juil. 2023 à 17:15
Pourtant, moi j'obtiens
https://hebrewsurnames.com/arrival_A.R. DE GENOUILLY_1910-10-29 NON
https://hebrewsurnames.com/arrival_A.R. DE GENOUILLY_1911-04-01 NON
https://hebrewsurnames.com/arrival_A.R. DE GENOUILLY_1911-04-08 NON
https://hebrewsurnames.com/arrival_A.R. DE GENOUILLY_1911-08-02 NON
https://hebrewsurnames.com/arrival_A.R. DE GENOUILLY_1911-12-16 NON
https://hebrewsurnames.com/arrival_A.R. DE GENOUILLY_1912-04-01 NON
https://hebrewsurnames.com/arrival_A.R. DE GENOUILLY_1913-08-02 NON
https://hebrewsurnames.com/arrival_A.R. DE GENOUILLY_1915-06-01 NON
https://hebrewsurnames.com/arrival_A.R. DE GENOUILLY_1915-10-02 NON
https://hebrewsurnames.com/arrival_A.R. DE GENOUILLY_1920-06-01 NON
https://hebrewsurnames.com/arrival_A.R. DE GENOUILLY_1921-06-02 NON
https://hebrewsurnames.com/arrival_A.R. DE GENOUILLY_1929-12-03 NON
https://hebrewsurnames.com/arrival_A.S. DE LAMORNAIX_1906-03-02 NON
https://hebrewsurnames.com/arrival_A.S. DE LAMORNAIX_1906-07-01 NON
https://hebrewsurnames.com/arrival_A.S. DE LAMORNAIX_1907-02-02 NON
https://hebrewsurnames.com/arrival_A.S. DE LAMORNAIX_1907-06-02 NON
https://hebrewsurnames.com/arrival_A.S. DE LAMORNAIX_1907-10-01 NON
https://hebrewsurnames.com/arrival_A.S. DE LAMORNAIX_1908-06-02 NON
https://hebrewsurnames.com/arrival_A.S. DE LAMORNAIX_1908-10-12 NON
https://hebrewsurnames.com/arrival_A.S. DE LAMORNAIX_1909-05-03 NON
https://hebrewsurnames.com/arrival_A.S. DE LAMORNAIX_1909-09-01 NON
https://hebrewsurnames.com/arrival_A.S. DE LAMORNAIX_1910-05-09 NON
https://hebrewsurnames.com/arrival_A.S. DE LAMORNAIX_1910-08-02 NON
https://hebrewsurnames.com/arrival_A.S. DE LAMORNAIX_1911-05-01 NON
Modifié le 28 juil. 2023 à 21:29
Effectivement, vous avez raison. J'ai mis à jour mon éditeur et cela fonctionne.
Merci beaucoup !
Modifié le 28 juil. 2023 à 20:48
Bonjour,
Dans ton code je ne comprends pas pourquoi tu dupliques ta liste des arrivées, tu peux la traiter directement dans la boucle for, comme les bateaux.
Le soucis d'une arrivée traitée plusieurs fois, il faut regarder le source html, la liste à la fois des bateaux et des arrivées est à chaque fois présente 2 fois, pour un ecran pc et pour un ecran mobile.
Il faudrait peut être avec bs indiquer le bloc source à traiter si c'est possible. Pour tester je ne traite que la moitié de chaque liste :
import random import time import csv import requests from bs4 import BeautifulSoup import webbrowser # Fonction pour ouvrir une page et retourner son contenu HTML def get_page(url): response = requests.get(url) return response.content # Fonction pour attendre un délai aléatoire entre 3 et 5 secondes def wait_random(): time.sleep(random.randint(0, 0)) # Fonction pour extraire les liens d'une page commençant par un certain préfixe def get_links_with_prefix(page_content, prefix): soup = BeautifulSoup(page_content, 'html.parser') links = soup.find_all('a', href=True) return [link['href'] for link in links if link['href'].startswith(prefix)] # Fonction pour vérifier si person est présent dans le contenu de la page def is_name_present(page_content, person): soup = BeautifulSoup(page_content, 'html.parser') return person in soup.get_text() # Fonction pour écrire dans le fichier "Results.csv" et ouvrir le lien dans le navigateur def write_to_csv(url, result): with open('Results.csv', 'a', newline='') as csvfile: writer = csv.writer(csvfile) writer.writerow([url, result]) # Ouvrir le lien dans le navigateur # webbrowser.open(url) # URL de départ base_url = 'https://hebrewsurnames.com/ships' # Étape 1 : Ouvrir le site et analyser le code source de la page page_content = get_page(base_url) # Étape 2 à 18 : (à l'intérieur d'une boucle pour les liens commençant par '/ships_') ship_links = get_links_with_prefix(page_content, '/ships_') print(ship_links[0:2], len(ship_links)) for ship_link in ship_links[0:int(len(ship_links)/2)]: ship_url = 'https://hebrewsurnames.com' + ship_link print(ship_url) # Étape 4 : Attendre aléatoirement entre 3 et 5 secondes wait_random() # Étape 5 : Analyser le code source de la page ship_page_content = get_page(ship_url) # Étape 6 : Ouvrir les liens commençant par 'arrival_' arrival_links = get_links_with_prefix(ship_page_content, 'arrival_') print(arrival_links, len(arrival_links)) for arrival_link in arrival_links[0:int(len(arrival_links)/2)]: arrival_url = 'https://hebrewsurnames.com/' + arrival_link print(arrival_url) # Étape 9 et 10 : Chercher si xxx est présent arrival_page_content = get_page(arrival_url) if is_name_present(arrival_page_content,'AFA, ANTON'): write_to_csv(arrival_url, 'OUI') else: write_to_csv(arrival_url, 'NON') # Étape 12 : Attendre aléatoirement entre 3 et 5 secondes wait_random() print("Exploration terminée.")
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionModifié le 28 juil. 2023 à 21:29
Bonjour effectivement vous avez raison.
Si je comprends bien pour que le programme fouille tous les liens il suffit juste de supprimer "[0:int(len(arrival_links)/2)]" à la ligne 55 ?
Merci de votre aide.
28 juil. 2023 à 22:10
et en 45 aussi
mais en faisant cela chaque bateau est analysé 2 fois et chaque arrivée 2 fois, ce qui multiplie les analyses et le temps par 4
29 juil. 2023 à 12:25
Bonjour jee pee,
Effectivement chaque bateau est analysé 2 fois. Comment dois je faire pour régler ce problème ? Je ne suis pas très expérimenté en python.
J'ai pensé à faire une liste en stockant chaque liens fouillés et à chaque fois qu'il va pour fouiller un lien, il vérifie si il est dans la liste. Si il y est il passe au suivant et si il n'y est pas il le fouille en le rajoutant dans la liste.
Je ne sais pas si cette solution est la plus rapide car j'ai peur que chaque vérification dans la liste prenne de plus en plus de temps au fur et à mesure.
J'aimerai savoir si vous (qui avait surement plus d'expérience que moi) validez ma solution ou si vous me conseillez de faire autrement.
Merci
Modifié le 29 juil. 2023 à 14:59
Mais si je ne traite que la 1ere moitié de la liste, l'autre restera non traité.
29 juil. 2023 à 15:19
Euh, affiches le contenu de la liste.
Si on ne traite que la moitié de la liste, c'est parce que chaque élément est présent 2 fois.
29 juil. 2023 à 15:36
oui vous avez raison je m'en suis aperçut après avoir envoyé mon message.
Merci à vous pour votre aide.
29 juil. 2023 à 13:02
Ne traiter que la 1ere moitié de la liste comme je l'ai fait est une solution.
Tu peux aussi supprimer les doublons des listes bateau et arrivées
print(ship_links[0:2], len(ship_links)) ship_links = list(set(ship_links)) print(ship_links[0:2], len(ship_links))
Après il faudrait se pencher sur BS, et voir comment ne traiter que les lignes entre les 2 commentaires,
<!-- TABLA--> et <!-- MUESTRA DATOS MOBILE-->