-
Notifications
You must be signed in to change notification settings - Fork 0
/
mit_Speichermethode.cs
153 lines (133 loc) · 5.77 KB
/
mit_Speichermethode.cs
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
using System;
using System.Collections.Generic;
using System.Globalization;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using Newtonsoft.Json;
class WebsiteConfig
{
public string? Url { get; set; }
public string? Xpath { get; set; }
}
class AppConfig
{
public List<WebsiteConfig>? Websites { get; set; }
}
class PriceComparison
{
static async Task Main()
{
Console.WriteLine("Geben Sie den Namen des Produkts ein, das Sie suchen möchten:");
string? productName = Console.ReadLine();
if (string.IsNullOrWhiteSpace(productName))
{
Console.WriteLine("Der Produktname darf nicht leer sein.");
return;
}
try
{
// Laden der Konfiguration aus der JSON-Datei
var configPath = Path.Combine(Directory.GetCurrentDirectory(), "selenium_config.json");
var config = JsonConvert.DeserializeObject<AppConfig>(File.ReadAllText(configPath));
if (config == null || config.Websites == null || config.Websites.Count == 0)
{
Console.WriteLine("Fehler in der JSON-Konfiguration: Ungültiges Format oder leere Konfiguration.");
return;
}
// Chrome-Optionen konfigurieren
var options = new ChromeOptions();
options.AddArguments("--incognito");
options.AddArguments("--disable-extensions");
options.AddArguments("--disable-popup-blocking");
options.AddArguments("--ignore-certificate-errors");
options.AddArguments("--ignore-ssl-errors");
// Fügen Sie hier weitere Optionen hinzu, die Sie benötigen
Console.WriteLine("Vor dem Öffnen des Browsers");
using var driver = new ChromeDriver(options);
Console.WriteLine("Nach dem Öffnen des Browsers");
List<string> outputLines = new List<string>();
foreach (var website in config.Websites)
{
if (string.IsNullOrWhiteSpace(website.Url) || string.IsNullOrWhiteSpace(website.Xpath))
{
Console.WriteLine("Url oder XPath ist null oder leer. Bitte überprüfen Sie die Konfigurationsdatei.");
continue;
}
// Fügen Sie den Suchbegriff direkt in die URL ein
string url = website.Url + Uri.EscapeDataString(productName ?? "");
try
{
driver.Navigate().GoToUrl(url);
await Task.Delay(10000); // Anpassen basierend auf der Ladezeit der Webseite
// Preisinformation mit Selenium extrahieren
var priceElement = driver.FindElement(By.XPath(website.Xpath));
string priceStr = priceElement.Text.Trim();
if (TryParsePrice(priceStr, out double price))
{
string outputLine = $"{url} - Preis: {price.ToString("C", CultureInfo.GetCultureInfo("de-CH"))}";
Console.WriteLine(outputLine);
outputLines.Add(outputLine);
}
else
{
Console.WriteLine($"Ein Fehler ist aufgetreten beim Extrahieren des Preises aus {url}: {priceStr}");
}
}
catch (Exception e)
{
Console.WriteLine($"Ein Fehler ist aufgetreten beim Zugriff auf {url} oder beim Finden des Elements: {e.Message}");
}
}
// Schließen Sie den Browser, wenn alle URLs abgearbeitet wurden
driver.Quit();
// Sortieren Sie die Preisinformationen
var sortedOutputLines = outputLines.OrderBy(line => GetPriceFromLine(line)).ToList();
// Ordner "vergleichen" erstellen, falls er nicht existiert
string folderPath = Path.Combine(Directory.GetCurrentDirectory(), "vergleichen");
Directory.CreateDirectory(folderPath);
// Methode zum Speichern der Ausgabe in eine Datei aufrufen
string fileName = $"{productName}_{DateTime.Now:yyyyMMddHHmmss}.txt";
SaveOutputToFile(sortedOutputLines, Path.Combine(folderPath, fileName));
}
catch (Exception ex)
{
Console.WriteLine($"Ein Fehler ist aufgetreten: {ex.Message}");
}
}
static bool TryParsePrice(string priceStr, out double price)
{
// Entfernen Sie das Währungssymbol und das Tausendertrennzeichen, ersetzen Sie das Dezimalkomma durch einen Punkt
priceStr = priceStr.Replace("CHF", "").Replace(".–", "").Trim();
if (double.TryParse(priceStr, NumberStyles.Currency, CultureInfo.GetCultureInfo("de-CH"), out price))
{
return true;
}
return false;
}
private static double GetPriceFromLine(string line)
{
int index = line.IndexOf("Preis:");
if (index >= 0)
{
string priceStr = line.Substring(index + 6).Trim();
if (double.TryParse(priceStr, NumberStyles.Currency, CultureInfo.GetCultureInfo("de-CH"), out double price))
{
return price;
}
}
return double.MaxValue; // Fallback, wenn der Preis nicht gefunden wurde
}
// Methode zum Speichern der Ausgabe in eine Datei
static void SaveOutputToFile(List<string> outputLines, string filePath)
{
try
{
File.WriteAllLines(filePath, outputLines);
Console.WriteLine($"Die Ausgabe wurde in '{filePath}' gespeichert.");
}
catch (Exception e)
{
Console.WriteLine($"Ein Fehler ist beim Speichern der Ausgabe aufgetreten: {e.Message}");
}
}
}