|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
klendathu
Anmeldungsdatum: 18.01.2019 Beiträge: 21 Wohnort: Dortmund
|
Verfasst am: 13.09.2019, 15:23 Titel: Frage zu Suchprogramm |
|
|
Hallo,
ich bin leider seit jahren raus im programmieren mit basic und hätte jetzt einen konkreten anlass, für das ich es eigentlich benötigen würde. Vielleicht kann mir hier jemand helfen?
ich wollte ein programm schreiben, bestimmte informationen im internet zu suchen. Ich möchte mir damit die recherche bestimmter gewichtsangaben für eine liste von tiernamen verkürzen.
das programm sollte zb. google verwenden um nach diesem gewicht zu suchen und danach den gefundenen gewichtswert entweder
a) als txt abspeichern, mit einem namen der dem tier entspricht, zu dem der wert gefunden wurde.
oder
b) am besten den gefunden wert hinter den namen des tieres selbstständig in die liste einfügen...
ist so etwas machbar?
Lg!
Klen |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 13.09.2019, 20:21 Titel: |
|
|
Machbar ist es schon; die Hauptschwierigkeit besteht darin, die Informationen sinnvoll herauszufiltern.
Zum Abrufen von Seiten im Internet: als einfache Lösung https://www.freebasic-portal.de/code-beispiele/internet-netzwerke/websites-selbst-verarbeiten-105.html. Der Rückgabewert enthält dann den kompletten HTML-Text der Seite (durchaus möglich, dass es Probleme mit zu großen Seiten gibt). Verarbeiten kann man den dann über die üblichen Stringfunktionen. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 14.09.2019, 15:36 Titel: |
|
|
Die Sache hat leider einen Haken: httpget unterstützt kein SSL und kann demzufolge auch keine verschlüsselten Seiten (https) aufrufen.
Aber glücklicherweise gibt es noch libcurl. Lade die für dich passende Version der libcurl.dll herunter und kopiere sie in den Ordner, in dem dein Programm steht.
Da die Handhabung von libcurl nicht ganz so einfach ist, habe ich dir aus meinem Fundus mal ein kleines Demoprogramm zusammengestellt, das die Startseite von Google herunterlädt und in einer Datei speichert: Code: | #Include Once "curl.bi"
#Include "vbcompat.bi"
Type tCurlInfo
curl As CURL Ptr
ff As Integer
geslen As Double
dllen As Double
timeout As Double = 3.0
verlauf As boolean = FALSE
inhalt As String
End Type
Declare Function herunterladen_curl(titel As String, tout As Double = 10.0) As String
Declare Function write_callback_curl Cdecl (buffer As Byte Ptr, size As Long, nitems As Long, info As tCurlInfo Ptr) As Integer
Function herunterladen_curl(titel As String, tout As Double = 10.0) As String
Dim As tCurlInfo curlinfo
Dim As String dlurl, tmp
Dim As Double timeout
curlinfo.curl = curl_easy_init()
If curlinfo.curl = 0 Then
Print "FEHLER"
Return ""
End If
'' set url and callback
curl_easy_setopt(curlinfo.curl, CURLOPT_URL, titel)
curl_easy_setopt(curlinfo.curl, CURLOPT_WRITEDATA, @curlinfo)
curl_easy_setopt(curlinfo.curl, CURLOPT_WRITEFUNCTION, @write_callback_curl)
curl_easy_setopt(curlinfo.curl, CURLOPT_SSL_VERIFYPEER, 0)
curlinfo.timeout = tout
curl_easy_perform(curlinfo.curl) 'execute..
curl_easy_cleanup(curlinfo.curl) 'shutdown
Close curlinfo.ff
Return curlinfo.inhalt
End Function
Function write_callback_curl Cdecl (buffer As Byte Ptr, size As Long, nitems As Long, info As tCurlInfo Ptr) As Integer
Dim As Integer x, bytes = size * nitems
Dim As Double tot_len, dl_len, timeout = Timer + info->timeout
curl_easy_getinfo(info->curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, @info->geslen )
curl_easy_getinfo(info->curl, CURLINFO_SIZE_DOWNLOAD, @info->dllen )
If info->ff Then
If info->geslen = -1 Then
Print Format(info->dllen/1024/1024,"#.##");" MB (ESC to terminate)"
Else
Print Int(100 * info->dllen / info->geslen);"% of ";Format(info->geslen/1024/1024,"#.##");" MB (ESC to terminate)"
EndIf
Locate CsrLin - 1,1,0
If info->geslen = info->dllen Then
Print
EndIf
Put #info->ff, ,*buffer,bytes 'write downloaded bytes to file
Else
For x = 0 To bytes - 1
info->inhalt += Chr(buffer[x])
Next
EndIf
If (InKey = Chr(27)) Or (Timer > timeout) Then
Print
Return 0
EndIf
Return bytes
End Function
Dim As String inhalt
inhalt = herunterladen_curl("https://www.google.de")
Print Left(inhalt, 1000)
Open "C:\downloadtest.htm" For Output As #1
Print #1, inhalt;
Close
Sleep
| Ein Doppelklick auf die Datei zeigt die Google - Startseite im Browser an.
Allerdings auch hier kein Paradies ohne verbotene Frucht: curl kann keine URLs mit Umlauten verarbeiten (wenn jemand wissen sollte, wie das geht, bitte dringend bei mir melden!!!).
Das Herausfiltern von Informationen aus HTML - Text ist dann noch mal eine ganz andere Geschichte...
Aber zumindest liesse sich so schon mal das Aufrufen aller Hyperlinks und das Durchsuchen der Seiten nach relevanten Begriffen automatisieren.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen!
Zuletzt bearbeitet von grindstone am 14.09.2019, 16:51, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
klendathu
Anmeldungsdatum: 18.01.2019 Beiträge: 21 Wohnort: Dortmund
|
Verfasst am: 14.09.2019, 16:44 Titel: |
|
|
Hallo Grindstone,
das sieht vielversprechend aus, was du da geschickt hast und könnte mir wirklich weiter helfen Vielen lieben Dank schon mal!
Wäre es möglich, das Demoprogramm so zu modifizieren, dass es aus einer Textdatei, quasi die Liste mit den Suchbegriffen, es sind Namen von Krustentieren, den Namen als Variable herauspickt, nach der das Programm dann zb die ersten 5 Seiten von Google durchsucht und dann die Ergebnisse, zb auch als Textdatei speichert?
Das Schema der Ergebnissuche habe ich mir relativ einfach vorgestellt.
Es wäre vorstellbar, dass nur die Seite mit den Treffern aus Google gespeichert wird. Zb als TxT. Dort wäre der gesuchte Wert, den ich benötige, nach einem simplen Schema zu finden: Der Wert muss in der Nähe von
"Ammonia production" sein,
eine Zahl sein
im besten Fall wird die Zahl gefolgt von einem "g" oder von "grams"
Der restliche Text, ausser das Ergebnis, würden aus der Textdatei gelöscht.
Die Textdatei könnte dann gespeichert werden mit dem Namen des Tieres, das gesucht wurde.
Der Name des Tieres besteht immer aus zwei Wörtern
Zb
Carcinus maenas
cancer magister
humarus gammarus
scylla serrata
Könntest du mir hier vielleicht weiter helfen?
Lg Klen! |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 14.09.2019, 19:07 Titel: |
|
|
klendathu hat Folgendes geschrieben: | Könntest du mir hier vielleicht weiter helfen? | Gerne, soweit ich kann. Allerdings ist -wie gesagt- das Herausziehen von Informationen aus einem HTML - Text eine besondere Herausforderung.
Immerhin habe ich inzwischen herausgefunden, wie man per libcurl Suchanfragen an Google schickt (ist für mich auch neu ): Wenn du die URL im Beispielprogramm durch "https://www.google.be/search?q=Carcinus%20maenas&num=5" ersetzt, bekommst du -wie gewünscht- die ersten 5 Treffer zur Gemeinen Strandkrabbe zurückgeschickt. Und wenn du das ganze nominell als Textdatei haben möchtest, ändere einfach die Endung ".htm" in ".txt" (am Dateiinhalt ändert sich dadurch nichts).
Aber immer eins nach dem anderen. Zuerst einmal mußt du libcurl zum Laufen bringen. Sag bescheid, wenn du soweit bist.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 14.09.2019, 19:35 Titel: |
|
|
@grindstone: Ich hatte mal nur ein bisschen mit der WinAPI, URLDownloadToFile experimentiert, vielleicht kommt das mit Umlauten besser zurecht? (und für Linux nehme ich dann stattdessen wget)
Ich habe aber denn (Datei-)Downloadgedanken bisher nicht weiter verfolgt. Ging mir um eine eingebaute Update-Funktion, aber im Moment habe ich anderes zu tun.
@klendathu
Zitat: | Es wäre vorstellbar, dass nur die Seite mit den Treffern aus Google gespeichert wird. Zb als TxT. Dort wäre der gesuchte Wert, den ich benötige, nach einem simplen Schema zu finden: Der Wert muss in der Nähe von
"Ammonia production" sein,
eine Zahl sein
im besten Fall wird die Zahl gefolgt von einem "g" oder von "grams" |
Wenn sich Google bei den Ergebnissen an ein spezielles Muster halten würde (was als Suchmaschine aber nicht unbedingt Sinn macht), wäre es relativ leicht zu parsen. Ich habe mal als Beispiel https://www.google.com/search?q=weight+of+cancer+magister ausprobiert. Bei der ersten Angabe von " g " steht bei mir "1.88 to 316 g" (Suchergebnisse können sich lokal unterscheiden, und ich habe jetzt nicht überpüft, ob das Gewicht zum richtigen Tier gehört; es ist aber die einzige auffindbare Grammangabe auf dieser ersten Ergebnisseite). Wenn ich https://www.google.com/search?q=gewicht+cancer+magister probiere, erhalte ich als einzige verwertbare Gewichtsangabe "6kg"), die aber zu Cancer pagurus zu gehören scheint. Kurz gesagt: Wenn ich was mit dem Ergebnis anfangen könnte, würde ich gern weiterhelfen; ich halte es aber für nicht verwertbar. Vielleicht stimmt eine der beiden Gewichtsangaben, aber sicher kann man da ohne massiven Einsatz künstlicher Intelligenz nicht sein.
(Einfach nur nach einer Zahl in der Nähe des Namens zu suchen, halte ich übrigens nicht für sinnvoll - vielleicht handelt es sich dabei auch um die Größe, die Anzahl der Beine, oder irgendwer wollte bloß mal mitteilen, wie viele dieser Tiere er heute schon gesehen hat. )
Für besser aufgearbeitete Suchergebnisse würde ich sehr gern https://www.wolframalpha.com/ empfehlen, was mir aber leider für die ersten beiden Tests keine Gewichtsangaben liefern konnte. Vielleicht gibt es eine spezielle Plattform, auf der man eher fündig wird? _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 14.09.2019, 20:55 Titel: |
|
|
@nemored:
Ich muß mich korrigieren: Wie ich inzwischen festgestellt habe, hat libcurl hat keine Probleme mit (URL-codierten) Umlauten. Lediglich die URL "https://de.wikipedia.org/wiki/Spezial:Zuf%C3%A4llige_Seite" funktioniert nicht - warum auch immer.
Was das Problem der Websuche betrifft, dürfte wohl die halbautomatische Vorgehensweise am zielführendsten sein: Das Programm sucht alle möglicherweise relevanten Seiten heraus, die dann von klendathu gesichtet werden.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Toa-Nuva
Anmeldungsdatum: 14.04.2006 Beiträge: 204 Wohnort: München
|
Verfasst am: 16.09.2019, 19:15 Titel: |
|
|
grindstone hat Folgendes geschrieben: | Ich muß mich korrigieren: Wie ich inzwischen festgestellt habe, hat libcurl hat keine Probleme mit (URL-codierten) Umlauten. Lediglich die URL "https://de.wikipedia.org/wiki/Spezial:Zuf%C3%A4llige_Seite" funktioniert nicht - warum auch immer. |
Wahrscheinlich ist das Problem dann die Weiterleitung (per HTTP Status Code 302) und nicht der Umlaut. So ist das jedenfalls in der Kommandozeile - curl folgt der Weiterleitung nur, wenn man das mit dem zusätzlichen Argument -L explizit fordert.
libcurl hab ich noch nie direkt benutzt, aber das hier müsste die entsprechende Option sein: https://curl.haxx.se/libcurl/c/CURLOPT_FOLLOWLOCATION.html _________________ 704 Signature not found |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 17.09.2019, 16:47 Titel: |
|
|
@ Toa-Nuva:
Vielen herzlichen Dank, es funktioniert!
Diese Seite benutze ich nämlich gerne, wenn ich für Testzwecke große Mengen von beliebigem Text benötige (dafür spende ich auch jedes Jahr an Wikipedia ). Seit Wikipedia auf https umgestellt hat, geht das mit PMedias httpget nicht mehr, und ich habe ganz schön auf dem Schlauch gestanden.
Für alle, die es interessiert: In FB lautet die zusätzliche Option: Code: | curl_easy_setopt(<curlHandle>, CURLOPT_FOLLOWLOCATION, 1) |
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|