Recherche d'un nom sur un site web
Raph_0 Messages postés 7 Statut Membre -
Bonjour tout le monde, je suis en train de coder un programme pour rechercher un membre de ma famille dans une liste de passagers de bateaux. Voici mon cahier des charges :
- Ouvrir le site : https://hebrewsurnames.com/ships
- Analyser le code source de la page
- Ouvrir le premier lien commençant par '/ships_'
- Attendre aléatoirement entre 3 et 5 secondes
- Analyser le code source de la page
- Ouvrir le premier lien commençant par 'arrival_'
- Pour chaque liens 'arrival_' ouverts prendre l'URL, la mettre dans le fichier "Results.csv" à la colonne 1
- Attendre aléatoirement entre 3 et 5 secondes
- Analyser le code source de la page
- Chercher si "PETTERSEN, TASTEIN" est écrit. Si oui laisser la page ouverte, si non la fermer.
- Si "PETTERSEN, TASTEIN" est écrit, écrire dans le fichier "Results.csv" OUI à la colonne 2 sinon écrire NON
- Attendre aléatoirement entre 3 et 5 secondes
- Analyser le code source de la page
- Chercher le lien 'arrival_' suivant et l'ouvrir
- Répéter ces actions ("7/" et "13/") jusqu'à qu'il n'y ai plus de lien 'arrival_'
- Fermer la page quand il n'y a plus de lien commençant par 'arrival_'
- Analyser le code source de la page
- Ouvrir le prochain lien commençant par '/ships_'
- Répéter les actions "2/" à "18/" jusqu'à ce qu'il n'y ait plus de liens commençant par '/ships_'
J'ai réussi à faire chercher au programme les noms dans tous les liens 'arrival_' du premier bateau, mais quand il a fini, au lieu de faire un retour au lien initial (liste des bateaux), le programme refait le tour du même bateau. Je suppose que c'est un problème de boucle mais je n'arrive pas à régler le problème.
Voici mon programme :
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(3, 5))
# 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 "PETTERSEN, TASTEIN" est présent dans le contenu de la page
def is_name_present(page_content):
soup = BeautifulSoup(page_content, 'html.parser')
return "PETTERSEN, TASTEIN" 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_')
for ship_link in ship_links:
ship_url = 'https://hebrewsurnames.com' + ship_link
# É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_')
# Vérifier s'il y a des liens "arrival_" à explorer
while arrival_links:
# Stocker les liens "arrival_" à explorer pour le lien "/ship_"
arrival_links_to_explore = arrival_links.copy()
# Explorer tous les liens "arrival_" pour le lien "/ship_"
for arrival_link in arrival_links_to_explore:
arrival_url = 'https://hebrewsurnames.com/' + arrival_link
# Étape 8 : Attendre aléatoirement entre 3 et 5 secondes
wait_random()
# Étape 9 et 10 : Chercher si "PETTERSEN, TASTEIN" est écrit
arrival_page_content = get_page(arrival_url)
if is_name_present(arrival_page_content):
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()
# Mettre à jour les liens "arrival_" après l'exploration pour le lien "/ship_"
ship_page_content = get_page(ship_url)
arrival_links = get_links_with_prefix(ship_page_content, 'arrival_')
print("Exploration terminée.")
Merci à vous d'avance.
- Recherche d'un nom sur un site web
- Creer un site web - Guide
- Site de telechargement - Accueil - Outils
- Web office - Guide
- Site comme coco - Accueil - Réseaux sociaux
- Quel site remplace coco - Accueil - Réseaux sociaux
8 réponses
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
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()
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
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 questionBonjour 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.
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
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-->