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
| import requests
from bs4 import BeautifulSoup
import pandas as pd
import datetime
import time
import os
#permet de savoir combien de temps dure l'execution
date = datetime.date.today()
start = time.time()
#efface le fichier portant le même nom pour en faire un nouveau
if os.path.exists(f"{date}-donnéeschrono24.csv"):
os.remove(f"{date}-donnéeschrono24.csv")
#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 ?
dico1 = "§".join(["Date", "Marque","Descritpion","Prix","frais de port","Pays"])
with open(f"{date}-donnéeschrono24.csv","a",encoding="utf-8-sig") as fichier_extract:
fichier_extract.write(f"{str(dico1)}\n")
#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
for i in range(1,5):
url = f"https://www.chrono24.fr/search/index.htm?accessoryTypes=&dosearch=true&query=montre&searchexplain=true&showpage={i}&sortorder=11&watchTypes=U"
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"})
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"})
dico = {}
j=""
k=""
for i,j,k in zip(annonces_texte, annonces_marque,annonces_vrai_marque):
try:
prix = i.find("div", {"class":"text-bold"}).get_text()
except:
prix = "no price"
try:
frais_port = i.find("div", {"class":"text-muted text-sm"}).get_text()
except:
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", encoding="utf-8-sig") as fichier_extract:
fichier_extract.write(f"{str(dico)}\n")
# indique fin du temps pour durée d'execution
end = time.time()
elapsed = end - start
print(f'Temps d\'exécution : {int(elapsed)} s') |
Partager