1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
| #!/usr/bin/env python3
# coding: utf-8
import requests
from bs4 import BeautifulSoup
import datetime
import time
#permet de savoir combien de temps dure l'execution
date = datetime.date.today()
start = time.time()
#met les titres de colonne dans le fichier csv qui est variable avec fstring sur la date
#encodage en utf-8-sig qui marche bien, pourquoi ?
dico = "§".join(
(
"Date",
"Marque",
"Descritpion",
"Prix",
"frais de port",
"Pays",
)
)
with open(f"{date}-donnéeschrono24.csv", "w") as fichier_extract:
print(dico, file=fichier_extract)
#je boucle sur l'ensemble des pages. Attention, comment savoir en automatique combien il y a de pages ???
#aujourd'hui obligé d'aller voir le nombre de pages qu'il y a sur le site internet
page=1
while True:
print("page={}".format(page))
url = "https://www.chrono24.fr/search/index.htm?accessoryTypes=&dosearch=true&query=montre&searchexplain=true&showpage={}&sortorder=11&watchTypes=U".format(page)
html = requests.get(url, headers={'User-Agent': 'Mozilla Firefox'})
soup = BeautifulSoup(html.content, 'html.parser')
#différentes annonces car toutes les infos ne se trouvent pas dans la même "div class"
annonces_texte = soup.find_all("div", {"class":"d-flex justify-content-between align-items-end m-b-1"})
# Fin de site ou limite
if not annonces_texte or page > 5: break
annonces_marque = soup.find_all("div", {"class":"p-x-2 p-x-sm-0"})
annonces_vrai_marque = soup.find_all("div", {"class":"article-item-container wt-search-result carousel-test"})
for (i, j, k) in zip(annonces_texte, annonces_marque, annonces_vrai_marque):
try:
prix = i.find("div", {"class":"text-bold"}).get_text()
except AttributeError:
prix = "no price"
try:
frais_port = i.find("div", {"class":"text-muted text-sm"}).get_text()
except AttributeError:
frais_port = "Pas de frais de port"
#marque generique ne marche pas, je n'arrive pas à la chopper dans data-manufacturer, exemple "Patek Philippe"
marque_generique = k.find("a", {"data-manufacturer="})
marque = j.find("div", {"class":"text-bold text-ellipsis"}).get_text()
description = j.find("div", {"class":"text-ellipsis m-b-2"}).get_text()
pays = i.find("span", {"class":"text-sm text-uppercase"}).get_text()
#mets toutes les variables dans la liste. Obligé de mettre date et marque_generique en string ...
dico = "§".join(
(
str(date),
str(marque_generique),
marque.strip(),
description.strip(),
prix.strip(),
frais_port.strip(),
pays.strip(),
)
)
#toujours encoding utf-8-sig, pourquoi ?
# \n pour passage à la ligne
with open(f"{date}-donnéeschrono24.csv", "a") as fichier_extract:
print(dico, file=fichier_extract)
# for
page+=1
# while
# indique fin du temps pour durée d'execution
end = time.time()
print("Temps d'exécution : {}s".format(end - start)) |