Durchschnittsberechnung klappt nicht immer

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von xChRoNiKx.

    Durchschnittsberechnung klappt nicht immer

    Hey,

    ich habe mir eine kleine Funktion gebaut, welche von einem Ebay Link alle Preise der Ergebnisse zusammenrechnet und dann den Durchschnitt berechnet.
    Bei einem Link klappt das perfekt.

    Jetzt habe ich eine Textbox mit mehreren Links untereinander. Ich hole nun von jedem Link per Webrequest den Quelltext und versuche das gleiche Prozedere wie oben, nur eben für jeden Link.
    Leider klappt das ganze nicht. Die ersten paar Links berechnet er scheinbar richtig, dann wirds wild und es kommen extrem hohe Zahlen raus, was nicht stimmen kann (geprüft).
    Liegt es an der Menge?

    Hier mal mein Code:




    VB.NET-Quellcode

    1. lvEbay.Items.Clear() 'ListView mit dem Aufbau: Artikelname:Durchschnittspreis
    2. For Each strLine As String In tbLinksEbay.Text.Split(vbNewLine)
    3. TempLB.Items.Clear() 'ListBox wo temporär alle Preise eines Artikels drin stehen
    4. If (strLine.Length < 1) Then
    5. Dim lvi As New ListViewItem("")
    6. lvi.SubItems.Add("")
    7. lvEbay.Items.Add(lvi)
    8. Else
    9. Dim Link = "https://www.ebay.de/sch/i.html?_from=R40&_nkw=" & strLine.Replace(" ", "+") & " &_sacat=0&rt=nc" 'Hier baue ich den Ebay-Suchlink zusammen
    10. If Not strLine.Replace(" ", "+") = "" Then
    11. Try
    12. Dim request As System.Net.HttpWebRequest = System.Net.HttpWebRequest.Create(Link)
    13. Dim response As System.Net.HttpWebResponse = request.GetResponse()
    14. Dim sr As System.IO.StreamReader = New System.IO.StreamReader(response.GetResponseStream())
    15. Dim sourcecode As String = sr.ReadToEnd()
    16. Dim matches As MatchCollection = Regex.Matches(sourcecode, "(?<=<span class=s-item__price><span class=POSITIVE>)(.*?)(?=</span></span>)") 'Regex-Pattern um den Preis zu finden
    17. For Each m As Match In matches
    18. If Not (m.Groups(1).Value.Replace("EUR ", "").Contains("<")) Then
    19. TempLB.Items.Add(m.Groups(1).Value.Replace("EUR ", ""))
    20. End If
    21. Next
    22. Dim Anzahl As Integer = TempLB.Items.Count
    23. Dim Preis As Double
    24. 'Hier addiere ich alle Preise
    25. For x As Integer = 0 To TempLB.Items.Count - 1
    26. Preis = Preis + Double.Parse(TempLB.Items(x).ToString)
    27. Next
    28. Dim lvi As New ListViewItem(strLine)
    29. 'Hier teile ich den Preis durch die Anzahl der Preise
    30. lvi.SubItems.Add(Math.Round(Double.Parse(Preis) / Anzahl, 2))
    31. lvEbay.Items.Add(lvi)
    32. Catch
    33. Dim lvi As New ListViewItem("URL Fehler")
    34. lvi.SubItems.Add("URL Fehler")
    35. lvIDealo.Items.Add(lvi)
    36. End Try
    37. End If
    38. End If
    39. Next




    Was halt leider rauskommt ist das:



    Nur die ersten 3 berechnet er korrekt.
    Habe auch schon ein Sleep probiert, ohne Erfolg.
    Einzelne Artikel berechnen klappt problemlos, aber nicht bei mehreren..

    Habt ihr eine Idee, woran das liegen könnte? Eigentlich sollte er doch brav die Schleifen durchlaufen, auch wenns lange dauert, oder?

    Vielen Dank! :)
    Gruß xored

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „xored“ ()

    Neu

    @xored Was ganz genau klappt denn nicht?
    Die Durchschnittsberechnung? Summe aller Elemente dividiert durch die Anzahl der Elemente?
    Ich denke mal, Du bist nicht in der Lage, aus den Web-Seiten die von Dir benötigte Information zu extrahieren.
    Sieh Dir jeden einzelnen Quelltext an und überlege bei jeder einzelnen Seite, ob Dein Herangehen korrekt ist.
    Und:
    Ändere den Titel dieses Deines Threads!
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Neu

    Hi,

    das Problem ist, dass meine Methode nicht klappt, wenn ich mehr als ~3 Abfragen starte.
    Eine einzelne klappt perfekt


    Der genaue Code dazu (Ich weiß, Option Strict off, ist jetzt quick & dirty):


    VB.NET-Quellcode

    1. VisualStudioListBoxWBuiltInScrollBar1.Items.Clear()
    2. Dim Link = "https://www.ebay.de/sch/i.html?_from=R40&_nkw=" & tbKeyWord.Text.Replace(" ", "+") & " &_sacat=0&rt=nc"
    3. If CheckBox2.Checked = True Then
    4. Link = Link & "&LH_Sold=1&LH_Complete=1"
    5. End If
    6. If rbAuktion2.Checked = True Then
    7. Link = Link & "&LH_Auction=1"
    8. End If
    9. If rbSofortkauf2.Checked = True Then
    10. Link = Link & "&LH_BIN=1"
    11. End If
    12. If cbNeuWare2.Checked = True Then
    13. Link = Link & "&rt=nc&LH_ItemCondition=3"
    14. End If
    15. Dim request As System.Net.HttpWebRequest = System.Net.HttpWebRequest.Create(Link)
    16. Dim response As System.Net.HttpWebResponse = request.GetResponse()
    17. Dim sr As System.IO.StreamReader = New System.IO.StreamReader(response.GetResponseStream())
    18. Dim sourcecode As String = sr.ReadToEnd()
    19. Dim matches As MatchCollection = Regex.Matches(sourcecode, "(?<=<span class=s-item__price><span class=POSITIVE>)(.*?)(?=</span></span>)")
    20. For Each m As Match In matches
    21. If Not (m.Groups(1).Value.Replace("EUR ", "").Contains("<")) Then
    22. VisualStudioListBoxWBuiltInScrollBar1.Items.Add(m.Groups(1).Value.Replace("EUR ", ""))
    23. End If
    24. Next
    25. Dim Anzahl As Integer = VisualStudioListBoxWBuiltInScrollBar1.Items.Count
    26. Dim Preis As Double
    27. For x As Integer = 0 To VisualStudioListBoxWBuiltInScrollBar1.Items.Count - 1
    28. Preis = Preis + Double.Parse(VisualStudioListBoxWBuiltInScrollBar1.Items(x).ToString)
    29. Next
    30. lbDurchschnitt.Text = Math.Round(Double.Parse(Preis) / Anzahl, 2)
    31. lbDurchschnitt.Text = lbDurchschnitt.Text & "€"


    Klappt perfekt. Ich hole mir alle Preise, rechne alle zusammen, teile sie dann durch die Anzahl der Preise.
    Mein Code im Startpost macht das gleiche, nur, dass die URL diesmal variabel ist und dieser Code für jede URL die ich habe, durchlaufen soll. Bei ungefähr 3 Links kackt er aber ab und wirft utopisch hohe Zahlen raus..



    Ich habe mir jetzt mal bei jeder URL den Sourcecode in eine Textdatei speichern lassen. Jeder Quellcode wird richtig ausgelesen, also liegt es woanders dran.. Die Berechnung an sich ist fehlerfrei, aber auf die Menge kommt mein Programm nicht klar (45 Links)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „xored“ ()

    Neu

    @xored Dann solltest Du das aufklären.
    Lerne zu debuggen, das musst Du selbst tun:
    Debuggen, Fehler finden und beseitigen
    Weise den geparsten Wert einer separaten Variable zu und sieh die Dir an.
    Und fang an mit Optrion Strict On!
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    Neu

    Da ist soviel Code zusammengewürfelt. Wie soll man da sinnvoll rausfinden, woran es jetzt liegt? Ich hab von RegEx keine Ahnung, aber mein erster Test scheiterte schon an jener Zeile. Da wurde nix gefunden. Daher habe ich mir den Suchergebnis-Seitencode angeschaut und die Programmzeile in das hier geändert:

    VB.NET-Quellcode

    1. Dim matches As MatchCollection = Regex.Matches(sourcecode, "(?<=<span class=s-item__price>)(.*?)(?=</span>)")
    Das funktioniert soweit, zumindest bei mir. Von daher solltest Du Deinen Fokus darauf legen.
    In Post#3, Zeile#3 ist insofern ein Fehler, weil am Ende der Zeile in " &_sacat=0&rt=nc" zu Beginn ein Leerzeichen drin ist, daher scheitert dieser Teil ebenfalls. Das schrittweise Rantasten an korrekten Code und das Ausfindigmachen des wirklichen Problemcodes sollte immer Priorität haben, sonst wühlen wir uns durch Informationen, die gar nicht relevant sind.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Neu

    Am Pattern liegt es nicht, habe jetzt durch laaaanges Debuggen den Fehler gefunden.
    Zum einen muss ich das & Zeichen in der URL anders kodieren, zum anderen habe ich etwas an meiner Methode den Durchschnitt zu berechnen verändert:

    VB.NET-Quellcode

    1. Dim Total As Double = 0
    2. Dim Count As Double = 0
    3. Dim Average As Double = 0
    4. For I As Integer = 0 To TempLB.Items.Count - 1
    5. Total += Val(TempLB.Items(I))
    6. Count += 1
    7. Next
    8. Average = Total / Count


    Das Ergebnis rundete ich dann noch auf 2 Nachkommastellen ab und siehe da, alles passt.

    Neu

    Das & muss eigentlich nicht anders codiert werden. Bei mir funktioniert es problemlos. Du nutzt ja kein HTML.
    Total += Val(TempLB.Items(I)) :?: Das ist ja Option Strict Off UND VB6 in einem <X
    Naja, wenn's Dich glücklich macht. Der Code mit Double.Parse und .ToString hat diese Minuspunkte wenigstens nicht …
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    Neu

    Kurze Frage: Was machst du wenn Ebay wie jeden Monat/ oder alle paar Monate mal wieder den Quelltext ändert?

    Nutze doch die API von Ebay dafür sind solche dinge doch da. Und dann kannst du direkt anfangen Option Strict On und VB.Net zu nutzen.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen