diff --git a/src/main/java/fr/tetelie/crawler/Crawler.java b/src/main/java/fr/tetelie/crawler/Crawler.java index a122dc8..96bee49 100644 --- a/src/main/java/fr/tetelie/crawler/Crawler.java +++ b/src/main/java/fr/tetelie/crawler/Crawler.java @@ -9,49 +9,21 @@ public class Crawler { public static void main(String[] args) { + // Création des instances new WebScrapper(); - new DatabaseConfig(); + + // Connexion à la base de donnée boolean isConnected = DatabaseConfig.getInstance().connect(); - + // Si pas de connexion à la base de donnée on s'arrête ici if(!isConnected){return;}; + // On ajoute les images pour les nouveaux produits qui en ont pas encore DatabaseConfig.getInstance().updatesAllMissingImages(); - /*String url = "https://www.amazon.fr/Victool-temp%C3%A9rature-professionnel-r%C3%A9paration-%C3%A9lectronique/dp/B0FP2D7TBY/?_encoding=UTF8&pd_rd_w=UWXHj&content-id=amzn1.sym.5633189b-a269-4b24-8a80-52a48568a326%3Aamzn1.symc.752cde0b-d2ce-4cce-9121-769ea438869e&pf_rd_p=5633189b-a269-4b24-8a80-52a48568a326&pf_rd_r=G56TKFERTQ9WS62C7WY4&pd_rd_wg=mtTBQ&pd_rd_r=519dfa29-c58c-41b3-89ca-4d01e27bfc2e&ref_=pd_hp_d_atf_ci_mcx_mr_ca_hp_atf_d"; + // On request les prix de tous les produits et on les inject dans la bdd + DatabaseConfig.getInstance().updateAllPrices(); - try { - // IMPORTANT : Amazon bloque les requêtes sans "User-Agent" - Document doc = Jsoup.connect(url) - .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") - .get(); - - // On cherche la classe .a-price-whole - Element priceElement = doc.selectFirst(".a-price-whole"); - - Element fractionElement = doc.selectFirst(".a-price-fraction"); - - if (priceElement != null) { - String price = priceElement.text(); - } else { - System.out.println("Prix non trouvé"); - } - - if(fractionElement != null) { - String fraction = fractionElement.text(); - }else{ - System.out.println("Fraction non trouvé"); - } - - if(fractionElement != null && priceElement != null) { - - System.out.println("Le prix est de: " + priceElement.text() + fractionElement.text()); - - } - - } catch (Exception e) { - e.printStackTrace(); - }*/ } } diff --git a/src/main/java/fr/tetelie/crawler/DatabaseConfig.java b/src/main/java/fr/tetelie/crawler/DatabaseConfig.java index 021ecd5..1417797 100644 --- a/src/main/java/fr/tetelie/crawler/DatabaseConfig.java +++ b/src/main/java/fr/tetelie/crawler/DatabaseConfig.java @@ -53,15 +53,44 @@ public class DatabaseConfig { } return false; } + public void updateAllPrices() { + String selectQuery = "SELECT id, link FROM products"; - public void requestPrice() - { - // pour toutes les entrée dans le table products - // aller chercher le prix - // l'enregistrer dans la database price_history + String insertQuery = "INSERT INTO price_history (product_id, price, date_check) VALUES (?, ?, CURRENT_TIMESTAMP)"; + try (PreparedStatement selectStmt = connection.prepareStatement(selectQuery); + ResultSet rs = selectStmt.executeQuery()) { + while (rs.next()) { + int id = rs.getInt("id"); + String url = rs.getString("link"); + System.out.println("Analyse du prix pour l'ID : " + id + "..."); + + // 3. Appel de ta fonction de scraping + float currentPrice = WebScrapper.getInstance().requestPrice(url); + + // On vérifie que le prix est valide (pas d'erreur de scraping) + if (currentPrice > 0) { + try (PreparedStatement insertStmt = connection.prepareStatement(insertQuery)) { + insertStmt.setInt(1, id); + insertStmt.setFloat(2, currentPrice); + insertStmt.executeUpdate(); + + System.out.println("✅ Nouveau prix enregistré : " + currentPrice + "€ pour l'ID " + id); + } + } else { + System.err.println("⚠️ Impossible de récupérer le prix pour l'ID " + id); + } + + // Un crawler poli attend toujours un peu entre deux requêtes + Thread.sleep(2000); + } + + } catch (SQLException | InterruptedException e) { + System.err.println("❌ Erreur lors de l'historisation des prix : " + e.getMessage()); + e.printStackTrace(); + } } public void updatesAllMissingImages() { diff --git a/src/main/java/fr/tetelie/crawler/WebScrapper.java b/src/main/java/fr/tetelie/crawler/WebScrapper.java index cf52da9..a4c1d1b 100644 --- a/src/main/java/fr/tetelie/crawler/WebScrapper.java +++ b/src/main/java/fr/tetelie/crawler/WebScrapper.java @@ -16,9 +16,49 @@ public class WebScrapper { instance = this; } - public void requestPrice() + public float requestPrice(String url) { + try { + // IMPORTANT : Amazon bloque les requêtes sans "User-Agent" + Document doc = Jsoup.connect(url) + .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36") + .get(); + + // On cherche la classe .a-price-whole + Element priceElement = doc.selectFirst(".a-price-whole"); + + Element fractionElement = doc.selectFirst(".a-price-fraction"); + + if (priceElement != null) { + String price = priceElement.text(); + } else { + System.out.println("Prix non trouvé"); + } + + if(fractionElement != null) { + String fraction = fractionElement.text(); + }else{ + System.out.println("Fraction non trouvé"); + } + + if(fractionElement != null && priceElement != null) { + + System.out.println("Le prix est de: " + priceElement.text() + fractionElement.text()); + + float price = Float.parseFloat(priceElement.text()); + float fraction = Float.parseFloat(fractionElement.text()); + + return price + (fraction / 100); + + + } + + return 0.0f; + + } catch (Exception e) { + e.printStackTrace(); + } } public String requestImage(String urlPage) { @@ -44,4 +84,6 @@ public class WebScrapper { + + }