Filmdatenbank

  • VB.NET

Es gibt 19 Antworten in diesem Thema. Der letzte Beitrag () ist von Snaptu.

    Filmdatenbank

    Hallo,

    ich hab eigentlich nur eine kleine Frage.
    Da ich Leidenschaftlich Filme sammle im Original und meine Excel Liste zu hässlich ist hatte ich mir gedacht ich schreib mir ein einfaches Tool selbst.
    Das mit der Datenbank dazu kriege ich mit den Tutorials von @EDR schon hin, wo ich nicht genau weiß wie ich es angehen soll ist das ich z.b. auf dieser Seite -> cover-finder.de/
    über den im Programm eingegebenen Filmtitel das Cover suchen kann bzw. es nachher Downloaden und abspeichern. Tante Google gibt mir als Antwort immer Regex, ist das sowieso die bessere Methode?

    Ich hab zwar schon auch hier im Forum das gefunden -> wintoolz.de/Filmdatenbank.php aber das ist für meine Zwecke zu groß bzw. zu Umfangreich.
    Meine Info's beschränken sich auf Name des Films (mit Cover), Erscheinungsjahr, Hauptdarsteller, Bluray oder DVD. Mehr wirds nicht werden.

    Nochmal zurück zu Regex. Geht das, dass ich auf der oben genannten Page dann aus meiner Forms-Anwendung das Suchfeld bediene und dann das Bild dazu rausziehe ggf. Skaliere und mit im DGV anzeige?
    Bin für jeden Tipp dankbar, es würden Links genügen wo ich mit durchwühlen kann :D
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.
    Ja, das sollte kein Problem werden. Du baust einfach die Post-Request nach und sendest diesen String mit:

    Quellcode

    1. POSTDATA=PROD_TITLE=[encodierter Filmtitel]&preview=&PROD_VERSION=de

    Dann per Regex das HTML-Element auslesen, das den Link zum Bild enthält und du kannst das Bild ohne Weiteres herunterladen.
    Normalerweise nutze ich Fiddler2, aber im Geschäft hatte ich nur Tamper Data laufen - mit dem ging es auch ohne Weiteres.
    Ich weiss nicht, wie gut du dich mit Internetprogrammierung auskennst. Ich weiss nur, dass du erfahren bist. Also fasse ich mich kurz und liste mal nur ein paar Punkte auf, die zu beachten sind:
    • Auf den System.Web-Namespace verweisen, weil:
    • Um String zu de-/encodieren werden die statischen Funktionen aus der System.Web.HttpUtility-Klasse benötigt.
    • Weiter sei zu beachten, dass Anfragen(vorzugsweise mit der System.Net.HttpWebrequest-Klasse getätigt) keinen Accept-Encoding-Header enthalten dürfen.
    • Header wie User-Agent, Accept, Expect, Accept-Language, Cache-Control u.Ä. sind nicht notwendig;
    • Auszufüllende Header sind:
      • RequestUri(logischerweise)
      • Method(ebenfalls logisch)(Ich habe nie andere Methoden verwendet als POST oder GET)
      • Host(Kann über das Uri-Objekt der AnfrageURL mittels MyUri.Host abgegriffen werden)
      • Referrer(Schreibfehler wurde nie behoben)(Kann über das Uri-Objekt der AnfrageURL mittels MyUri.Host abgegriffen werden)
      • Cookie(Kann aus dem vorherigen CookieContainer befüllt werden)
      • ContentType(Bei POST-Requests unerlässlich; Zum Beispiel text/json)
      • ContentLength(Bei POST-Requests unerlässlich; Einfach den zu postenden String zu einem Byte-Array konvertieren(Ich nutze immer die Encoding.UTF8.GetBytes()-Funktion) und dessen Länge(LongLength, weil Long) abgreifen)

    • Die aktuell gesetzten Header kann man über die Headers-Eigenschaft abrufen. Dort kannst du auch weitere Header angeben(Bei mir per Standart drin: X-Requested-With: XMLHttpRequest)
    • Den Proxy kann man optional dazwischenschalten.

    Huiii, das waren viele Links. Ich hoffe, sie konnten helfen. ^^

    EDIT: Ich habe da eine fast-fertige Lösung für das Programmieren mit Internetseiten. Dabei gibt es für jede Internetseite eine neue Klasse, die von einer Basisklasse erbt. Wenn du willst, kann ich dir das Projekt schicken.

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

    pfu das ist mal ne ausführliche Beschreibung :D Dankeschön.

    Also mit System.web muss ich mich mal beschäftigen damit habe ich garkeine erfahrung aber du hast es mir ja verlinkt mit dem komme ich einmal klar.
    Ich hab grad gesehen das es ja doch nicht so trivial ist (zumindest wie ich das jetzt sehen kann) so ein Bild aus dem Web zu holen aber da wo ein Wille
    da auch ein Weg und ich weiß ja wo ich hingehen kann wenn ich nicht weiter weiß.

    Vielleicht komme ich auf dein Projekt zurück aber vorerst will ich mich da mal durchlesen und das ausprobieren sonst hab ich Code und versteh vielleicht nur Bahnhof :D
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.
    So,

    ich hab schon mal die erste Frage:
    Nach ein wenig Testen per Hand und bauen des richtigen Request Strings kommt folgendes raus:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim MovieName As String = tbMovieName.Text
    3. Dim ReplaceChar As String = "+"
    4. If MovieName.Contains(" ") Then
    5. MovieName = MovieName.Replace(" ", ReplaceChar)
    6. End If
    7. Dim request As HttpWebRequest = CType(HttpWebRequest.Create("http://www.cover-finder.de/"), HttpWebRequest)
    8. request.Method = "POST"
    9. request.Host = "www.cover-finder.de"
    10. request.ContentType = "application/x-www-form-urlencoded"
    11. Dim Post As String = "PROD_TITLE=" & MovieName & "&preview=&PROD_VERSION=de"
    12. request.ContentLength = Encoding.UTF8.GetBytes(Post).LongLength
    13. End Sub


    Was mir gleich auffällt ist das er mir in Zeile 9 mit CType konvertiert was soweit ich weiß böse ist?
    Ich bin mal soweit gekommen, das ich die Methode usw. eingestellt habe. Mit HttpWebResponse müsste ich mir einmal eine Antwort der Internetseite zukommen lassen können oder sehe ich das falsch?
    Da ich wenig Ahnung von Internetprogrammierung habe tu ich mir da grad ein bisschen schwer.
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.

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

    Richtig, CType kann hier durch DirectCast umgangen werden, wird aber sowieso redundant:

    VB.NET-Quellcode

    1. Dim request As HttpWebRequest = CType(HttpWebRequest.Create("http://www.cover-finder.de/"), HttpWebRequest)
    2. 'Zu
    3. Dim request As HttpWebRequest = HttpWebRequest.CreateHttp("http://www.cover-finder.de/")


    DIe Postnachricht(Byte()) schreibst du nach dem setzen aller notwendigen Eigenschaften in den RequestStream:

    VB.NET-Quellcode

    1. Dim PostMsg = Encoding.UTF8.GetBytes(Post)
    2. Using Strm = request.GetRequestStream()
    3. Strm.Write(PostMsg, 0, PostMsg.Length)
    4. End Using

    Dann kannst du die Antwort abwarten(hier jetzt in .Net 4.5):

    VB.NET-Quellcode

    1. Dim response = Await request.GetResponseAsync()

    Ok, ich hoffe das ist jetzt anähernd das was du mir sagen wolltest....

    VB.NET-Quellcode

    1. Dim Cookie As New CookieContainer
    2. Dim Request As HttpWebRequest = HttpWebRequest.CreateHttp("http://www.cover-finder.de/")
    3. Request.CookieContainer = Cookie
    4. Request.Method = "POST"
    5. Request.Host = "www.cover-finder.de"
    6. Request.ContentType = "application/x-www-form-urlencoded"
    7. Dim Post As String = "PROD_TITLE=" & MovieName & "&preview=&PROD_VERSION=de"
    8. Dim ByteArray() As Byte = Encoding.UTF8.GetBytes(Post)
    9. Request.ContentLength = ByteArray.LongLength
    10. Dim DataStream As Stream = Request.GetRequestStream()
    11. DataStream.Write(ByteArray, 0, ByteArray.Length)
    12. DataStream.Close()
    13. Dim Response As HttpWebResponse = CType(Request.GetResponse(), HttpWebResponse)
    14. DataStream = Response.GetResponseStream()
    15. Dim Reader As New StreamReader(DataStream)
    16. Dim WebResponse As String = reader.ReadToEnd()
    17. reader.Close()
    18. DataStream.Close()
    19. Response.Close()


    Was er mir jetzt markiert ist das Button1_Click event und sagt folgendes

    Damit kann ich irgendwie noch nichts Anfangen.
    sry wenn mein Code auch etwas umständlich geschrieben ist...

    EDIT: musste noch request.GetResponseAsync() einfügen.....
    Generelle Frage wie weiß ich die richtige Schreibweise (ohne CType) wenn selbst auf MSDN alles mit CType verwurschtelt wird?
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.

    Snaptu schrieb:

    Generelle Frage wie weiß ich die richtige Schreibweise (ohne CType) wenn selbst auf MSDN alles mit CType verwurschtelt wird?

    Ich habe vor ein paar Wochen mich mal experimentell an C# probiert und suchte nach dem DirectCast-Äquivalent. Dazu durchforstete ich ein älteres Projekt, das sowohl CType() als auch DirectCast() beinhaltete. Und ILSpy wandelte Beides in CType() um(VB.NET-Schreibweise, C#-Variante ist jetzt ja nicht gefragt). Das heisst wohl, dass die schöne DirectCast-Funktion nur optischer Schnickschnack ist. Aber ich achte aus mir selbst unbekannten Gründen sehr genau darauf, sie richtig zu verwenden: DirectCast() für Polymorphie-Casting und CType() für zwischen Typen, die nicht in einer Vererbungslinie sind, sich aber in den jeweils anderen Typ konvertieren lassen.

    markus.obi schrieb:

    Laut MSDN gibt es in HttpWebRequest kein HttpWebRequest.CreateHttp. Wird wohl nicht von WebRequest geerbt oder wie?!
    Mein VS2010 (.net 4.0) kennt kein WebRequest.CreateHttp Method (Uri). Wieso?

    Das ist eine gute Frage. Der Objektkatalog sagt auch erst bei .Net 4.5, dass es die Funktion gebe. Vorher: Nein. ?(
    Wobei es mir aber sehr suspekt vorkommt, dass da auf MSDN scheinbar etwas nicht stimmen sollte.
    Guten Morgen,

    steh grad ein wenig auf der Leitung, ich hab mir das jetzt angesehen und da steht:
    .GetResponseAsync()
    Wenn diese Methode in einer abgeleiteten Klasse überschrieben wird, gibt Sie eine Antwort auf einen Request als asynchronen Vorgang zurück. (Von WebRequest geerbt.)

    Dann steht gibt Task(TResult) zurück. ?(

    Bitte mich nicht gleich zu zerfleischen aber ich bin hier noch nicht ganz im Bilde wie ich jetzt prüfen kann ob meine Anfrage geklappt hat?
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.
    Au ja, das ist eine geniale Sache. :)
    Eine asynchrone gibt ja scheinbar Task(Of TResult) zurück. Das stimmt insoweit, als das sie den ausführenden Task zurückgibt, der dann im Hintergrund läuft. Wenn du das Ergebnis haben willst, musst du warten, bis der Task beendet wurde(eine Property des Task(Of TResult)-Objektes gibt Aufschluss diesbezüglich). Und hier greifen die Await-Operatoren: Anstatt mit Task.Await(Task) zu warten und dann Task.Result abzurufen kannst du warten und Ergebnis holen in einer Zeile erledigen:

    VB.NET-Quellcode

    1. Dim Result = Await Task(Of TResult)-Object

    OK, das leuchtet soweit einmal ein,Danke.

    Jetzt stelle ich mir das so vor das meine Anfrage nichts anderes macht als würde ich ganz normal dort nach einem Film Namen suchen nur ohne Oberfläche.
    Das Ergebnis so einer Suche beinhaltet jetzt folgende Zeile:

    HTML-Quellcode

    1. <td align="center" valign="middle">
    2. <img src="http://images-eu.amazon.com/images/P/B001BMWH5W.03._SL250.jpg" border="0" alt="Hulk" title="Hulk" />
    3. <img src="http://images-eu.amazon.com/images/P/B001BMWH5W.03._SL115.jpg" border="0" alt="Hulk" title="Hulk" />
    4. <img src="http://images-eu.amazon.com/images/P/B001BMWH5W.03._SL50.jpg" border="0" alt="Hulk" title="Hulk" />
    5. </td>


    Wenn ich aus dieser Tabellen-Zelle das Bild das auf SL115.jpg endet auslesen will kommt mein Feind RegEx ins Spiel? :evil: Ich könnte ja den ganzen Quelltext nach SL115.jpg durchsuchen und dieses Bild dann herunterladen?
    Oder ist das unperformant immer die ganze Seite zu lesen?
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.
    Regex ist nicht dein Feind. Er ist dein Freund. ;)
    Sicher, dass diese Endung immer dieselbe ist? Dann dürfte dieses Pattern genügen:
    http://images-eu\.amazon\.com/images/.+?_SL115\.jpg
    Ich weiss nicht, ob den ganzen Quelltext zu durchsuchen so schlimm ist, aber bis jetzt hatte ich noch nie Probleme damit.
    Weißt du, ob das Bild immer mit _SL115.jpg endet?
    Wenn ja, der reguläre Ausdruck für die Zeile müsste eigentlich
    \<img\ssrc=".+?(SL115.jpg)".*?(/\>) sein.

    Oder tatsächlich nur das Bild wäre src=".+?(SL115.jpg)".
    In Expresso hab ichs kurz getestet, funktioniert bei mir(:

    Ich weiß nicht, obs unperformant wäre, die ganze Seite zu "lesen", aber ich denke mal Regex tut das auch, wenn es nach Matches sucht...

    EDIT: Da war wohl jemand schneller :s Bei @Higlav muss das Bild aber auch von Amazon und exakt den entsprechenden Unterordnern kommen.

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

    Higlav schrieb:

    Das heisst wohl, dass die schöne DirectCast-Funktion nur optischer Schnickschnack ist.
    DirectCast ist viel direkter als CType. Bei CType werden Umwandlungs-Funktionen aufgerufen - DirectCast ist eine direkte Anweisung an den Compiler: "Dieses ist jetzt kein WebRequest, sondern ein HttpWebRequest"
    Das c#-Äquivalent zu DirectCast ist der c# - cast:

    C#-Quellcode

    1. var httpWr=(HttpWebRequest)WebRequest.Create("http://aGutUrl");

    Also ILSpy zeigt mir bei sowas:

    C#-Quellcode

    1. var httpWr = (HttpWebRequest)WebRequest.Create("aGutUrl");

    den CType-Operator bei der VB.NET-Notation an.

    In C# gäbe es ja noch

    C#-Quellcode

    1. var httpWr = WebRequest.Create("aGutUrl") as HttpWebRequest;

    , was aber anscheinend das Äquivalent zu TryCast wäre. Als ich mal intensiver danach gesucht habe, hiess es, dass es in C# kein Äquivalent zu DirectCast gäbe...

    Higlav schrieb:


    Sicher, dass diese Endung immer dieselbe ist? Dann dürfte dieses Pattern genügen:

    Also ich hatte gestern zum Test ein paar Suchen gestartet und es kommt eigentlich immer das selbe raus:

    HTML-Quellcode

    1. <img src="http://images-eu.amazon.com/images/P/B00DHC68NQ.03._SL115.jpg" border="0" alt="Man of Steel" title="Man of Steel" />
    2. <img src="http://images-eu.amazon.com/images/P/B001F7EZ8K.03._SL115.jpg" border="0" alt="Casablanca" title="Casablanca" />
    3. <img src="http://images-eu.amazon.com/images/P/B003NCUMJG.03._SL115.jpg" border="0" alt="Iron Man 2" title="Iron Man 2" />


    Sollte also klappen, war heute wieder viel Info die ich Zuhause erst mal zu Code bringen muss :D
    Wer fragt, ist ein Narr für eine Minute. Wer nicht fragt, ist ein Narr sein Leben lang.

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