Autor Beitrag
BlackMatrix
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: Sa 21.04.12 11:47 
Hi.

Ich möchte gerne ein Suchmaschine in mein Programm einbinden, aber bisher habe ich noch keinerlei funktionierende Lösung gefunden.

Ich habe versucht über den WebRequests/WebClient Anfragen an www.google.de/search?q=suchbegriff zu senden, aber nachdem man einige Suchergebnisseiten "durchgeklickt" hat, wird man aufgefordert ein Captcha einzugeben.
Dann habe ich bereits versucht die Google Search API zu benutzen, aber wie ich rausgefunden habe, bietet diese auch einfach nur einen Webrequest an ajax.googleapis.com/...ge&q=suchbegriff
Die Suche scheint zwar zu funktionieren, aber ich glaube, die API hat Probleme damit Parameter wie inurl:, site: anzuwenden. Ich bekomme deutlich weniger Ergebnisse als wenn ich direkt über Google Suche.

Welche Suche es im Endeffekt ist, ist mir egal, sofern die Suchergebnisse akzeptabel sind. Hat das schon mal jemand umgesetzt?

Liebe Grüße
Oliver M.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 109
Erhaltene Danke: 1

Win 8 CP
VS 11 Beta
BeitragVerfasst: Mo 23.04.12 17:37 
Ich habe schon öfter Suchmaschinen in meine Programme eingebunden, und kann dir ein paar Tips geben:
  • Wenn man auf Suchergebnisseiten kommt, kann man oft die Ergebnisse als RSS-Feed abonnieren. Die RSS-Feeds, auf die dort verlinkt wird, sind meist deutlich einfacher mit Programmcode zu entschlüsseln, als das HTML.
  • Die Idee mit WebRequest und WebResponse ist sehr gut. Um die Ergebnisse dann auszuwerten, empfehle ich XmlDocument oder Regex. XmlDocument ist zwar einfacher umzusetzen, aber müssen die Suchergebnisse dabei in perfektem XML vorliegen, das es sonst abstürzt.
Ich schicke dir per PN ein Beispiel für eine Youtube-Suche, die der Google-Suche ja sehr ähnelt, ich hoffe es hilft dir. Leider kann ich das Beispiel hier nicht öffentlich reinstellen, da der Code nur teilweise von mir ist.

MfG Oliver
Oliver M.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 109
Erhaltene Danke: 1

Win 8 CP
VS 11 Beta
BeitragVerfasst: Sa 28.04.12 21:29 
Ich weiß nicht was du willst! Das geht doch einwandfrei!!!


Zuletzt bearbeitet von Oliver M. am So 06.05.12 10:35, insgesamt 1-mal bearbeitet
BlackMatrix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: Mo 30.04.12 00:09 
user profile iconOliver M. hat folgendes geschrieben Zum zitierten Posting springen:
Ich weiß nicht was du willst! Das geht doch einwandfrei!!!


Dank dir. Die Suche funktioniert auch, will man aber z.B. alle Links mit den gefunden Textstellen rausparsen müsste man alle Seiten von 1-X durchlaufen.

Mein Code, der mich nach einer Weile ein Captcha eingeben lässt:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
        public string Search(string searchString)
        {
            int start = 0;
            WebClient wc = new WebClient();
            string html = string.Empty;
            do
            {
                html += wc.DownloadString(string.Format("http://www.google.de/search?q={0}&start={1}", searchString, start));
                start += 10;
                // Thread.Sleep(5000);
            } while (html.Contains("<b>Weiter</b>"));
            return html;
        }



Man kann auch optional noch Sleeps einbauen, das verändert aber nicht das Ergebnis, dass man irgendwann einen Timeout vom Google Server bekommt. Es wird zusätzlich zu den Cookies noch irgendwelcher Javascriptmist generiert, der den Aufruf von bestimmten Urls zur Folge hat. Ein korrekter Browseraufruf und Ablauf hat zur Folge, dass man keine Captchas eingeben muss, das bekomme ich aber nicht hin :/

MfG
Oliver M.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 109
Erhaltene Danke: 1

Win 8 CP
VS 11 Beta
BeitragVerfasst: Di 01.05.12 09:28 
Du willst ALLE Suchergebinsse auslesen? Das sind laut Google meist so ca. 1.340.000.000! LAss einfach den Benutzer ein Limit setzten, wieviele Ergebnisse er haben möchte (Siehe Anhang).
MfG Oliver
Einloggen, um Attachments anzusehen!
BlackMatrix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: Di 01.05.12 13:52 
user profile iconOliver M. hat folgendes geschrieben Zum zitierten Posting springen:
Du willst ALLE Suchergebinsse auslesen? Das sind laut Google meist so ca. 1.340.000.000! LAss einfach den Benutzer ein Limit setzten, wieviele Ergebnisse er haben möchte (Siehe Anhang).
MfG Oliver


Hab mir mal den Regex geklaut :)

Dem Benutzer stehen nur eine Vielzahl von Suchbegriffen zur Verfügung. Diese Suchbegriffe sind so speziell, dass dabei niemals mehr als 30 Seiten abgesucht werden müssen. Das spielt aber keine Rolle, denn selbst wenn ich immer nur eine Seite absuche, aber dafür 30 verschiedene Suchbegriffe, irgendwann lässt mich Google nicht mehr zu deren Server verbinden. Egal wieviel Sleeps ich zwischen den Abfragen einbaue, irgendwann passiert das, weil ich keine Cookies, Javascript und vllt sogar auch Bilder runterlade. Dafür soll ja die API benutzt werden, die aber meiner Meinung nach noch mehr eingeschränkt ist, als die Requests selber zu machen.
Die einzige Möglichkeit, die ich im Moment noch sehe ist ein WebBrowser Control zu nehmen und damit die Requests zu machen, das regt mich aber jetzt schon auf :/
glotzer
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 393
Erhaltene Danke: 49

Win 7
Lazarus
BeitragVerfasst: Di 01.05.12 14:40 
BlackMatrix hat folgendes geschrieben:
Dafür soll ja die API benutzt werden, die aber meiner Meinung nach noch mehr eingeschränkt ist, als die Requests selber zu machen.

vieleicht ist das ja der Sinn der ganzen Sache: die Abfragen einzuschränken?

_________________
ja, ich schreibe grundsätzlich alles klein und meine rechtschreibfehler sind absicht
Oliver M.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 109
Erhaltene Danke: 1

Win 8 CP
VS 11 Beta
BeitragVerfasst: Di 01.05.12 15:21 
Ich verstehe nicht ganz, zu welchem Zwech das ganze gut ist. Vielleicht könntest du ja sagen, warem du so viele Google-Suchen auf einmal machen möchtest. Das könnte helfen.
MfG Oliver
BlackMatrix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: Di 01.05.12 17:20 
Ich möchte meine Datenbank mit URLs füllen.

Um möglichst auf aktuellem Stand zu sein, versuche ich Google einzubeziehen.
FinnO
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Di 01.05.12 18:09 
Gut, daran wird Google wohl wenig interesse haben.
Oliver M.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 109
Erhaltene Danke: 1

Win 8 CP
VS 11 Beta
BeitragVerfasst: Mi 02.05.12 19:04 
Du möchtest also einfach irgend welche URLs in eine Datenbank füttern? Ich kann mir nicht zusammenreimen, warum. Jedenfalls wünsche ich dir viel Spaß :lol:
BlackMatrix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: Di 15.05.12 17:25 
Vielleicht kann mir jemand bei der Verwirklichung helfen.

Es geht nun um einen allgemeinen WebRequest/WebResponse Sache.

Wenn ich zuviele Anfragen an die Google Suche gesendet habe, dann muss ich ein Captcha eingeben. Wenn ich den Ablauf mit LiveHttpHeaders oder HttpFox mitschneide, dann werde ich von meiner Such-URL auf

www.google.com/sorry...earch?q=searchString

weitergeleitet.

Wenn ich nun meine Suchanfrage mit einem WebRequest nachbauen will, dann bekomme ich eine WebException:
ausblenden C#-Quelltext
1:
Der Remoteserver hat einen Fehler zurückgegeben: (503) Server nicht verfügbar.					


Ich habe Cookies und Javascript im Browser abgeschalten, sende keinen Referer und trotzdem will die Weiterleitung beim WebRequest nicht funktionieren.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
                // Request
                var request = (HttpWebRequest)WebRequest.Create(uri);
                request.CookieContainer = _cookieContainer;
                request.UserAgent = UserAgent; // Firefox 12
                request.AutomaticDecompression = _automaticDecompression; // GZIP | DEFLATE
                request.KeepAlive = true;
                request.MaximumAutomaticRedirections = MaximumAutomaticRedirections; // 5
                request.AllowAutoRedirect = allowAutoRedirect; // true
                request.Headers.Set(HttpRequestHeader.AcceptLanguage, AcceptLanguage); // de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
                var response = (HttpWebResponse)request.GetResponse();
                Stream stream =  response.GetResponseStream();




Also ich rufe

ausblenden C#-Quelltext
1:
http://www.google.de/search?q=searchString					


auf, da werde ich im Browser auf:

ausblenden C#-Quelltext
1:
http://www.google.de/sorry/?continue=http://www.google.de/search?q=searchString					


weitergeleitet.

Das funktioniert nicht beim WebRequest, obwohl die Weiterleitung eingeschalten ist.
Oliver M.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 109
Erhaltene Danke: 1

Win 8 CP
VS 11 Beta
BeitragVerfasst: Mi 16.05.12 19:17 
Vielleicht hilft es, wenn du zwischen den Abfragen einen variablen Zeitraum wartest, also das einbaust:
ausblenden C#-Quelltext
1:
Thread.Sleep(new Random().Next(103000));					

Das braucht zwar ein wenig länger, aber vielleicht trickst du so Google aus. Sonst halt Verbindug über einen Proxy leiten.
platzwart
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: Mi 16.05.12 20:49 
Oder sich einfach an die Spielregeln von Google halten und nicht einfach so fremde Leistungen abgreifen...

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
Oliver M.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 109
Erhaltene Danke: 1

Win 8 CP
VS 11 Beta
BeitragVerfasst: Mi 16.05.12 21:05 
Das ist natürlich das Besste, Einfachste und Sinnvollste.
BlackMatrix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: Mi 16.05.12 21:10 
user profile iconOliver M. hat folgendes geschrieben Zum zitierten Posting springen:
Vielleicht hilft es, wenn du zwischen den Abfragen einen variablen Zeitraum wartest, also das einbaust:
ausblenden C#-Quelltext
1:
Thread.Sleep(new Random().Next(103000));					

Das braucht zwar ein wenig länger, aber vielleicht trickst du so Google aus. Sonst halt Verbindug über einen Proxy leiten.


Schon ausprobiert. Das hatte ich mir auch gedacht, aber das bringt nichts. Das ist ein Parameter der vib Google wahrscheinlich am wenigsten kontroliert wird. Google schaut eher, ob Javascript und Cookies funktionieren.

Ansonsten, sobald eben dieser Captchamechanismus von Google eingeleitet wurde, kann ich mit meinem HttpWebRequest einfach nicht mehr diese URL aufrufen ttp://www.google.de/search?q=searchString, obwohl es im Firefox ohne Cookies und Javascript (das ja genau dem HttpWebRequest im .Net Framework) entspricht, nicht funkioniert.

Also entweder man benutzt wirklich das WebBrowser Control ohne Anzeige, dann hat man aber das Problem, dass wenn man doch mal ein Captcha eingeben muss, es nur schwer geht dieses Captcha im verstecken Browser zum Benutzer weiterzuleiten. Ich habe gelesen, das geht nur über die Zwischenablage.

user profile iconplatzwart hat folgendes geschrieben Zum zitierten Posting springen:
Oder sich einfach an die Spielregeln von Google halten und nicht einfach so fremde Leistungen abgreifen...


Das ist insofern nur schwer machbar, weil mir die API, welche von Google angeboten wird, nicht die selben Ergebnisse wie die Suche im WebBrowser liefert. Bei der neuen Google API funktionieren Suchparameter wie "inurl:" nicht. Dafür gibt es auch schon einige Threads im Netz:

stackoverflow.com/qu...oints-to-specific-pa

Daher wäre eine funktionierende, nicht restriktierte Lösung schon etwas feines.
Oliver M.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 109
Erhaltene Danke: 1

Win 8 CP
VS 11 Beta
BeitragVerfasst: Mi 16.05.12 21:13 
Wie gesagt: Wenn du einen Proxy benutz, hat Google keine Chance gegen dich mehr.
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Do 17.05.12 10:53 
user profile iconOliver M. hat folgendes geschrieben Zum zitierten Posting springen:
Wie gesagt: Wenn du einen Proxy benutz, hat Google keine Chance gegen dich mehr.

Warum das denn? Ist doch im Endeffekt auch nur ein anderer Rechner. Das Verhalten dürfte dasselbe bleiben.
BlackMatrix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: Fr 18.05.12 16:27 
user profile iconUGrohne hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconOliver M. hat folgendes geschrieben Zum zitierten Posting springen:
Wie gesagt: Wenn du einen Proxy benutz, hat Google keine Chance gegen dich mehr.

Warum das denn? Ist doch im Endeffekt auch nur ein anderer Rechner. Das Verhalten dürfte dasselbe bleiben.


Ich denke er meint damit, dass jede Suchseite oder nur eine handvoll Suchseiten mit einem Proxy abgefragt werden, sodass Google noch nicht von einem Bot ausgeht. Das ist wohl die einzig funktionierende Möglichkeit, verkompliziert das Ganze aber auch, da Google selber auch wieder gegen Proxys vorgeht und man bei einer bestimmten IP direkt zur Captchaeingabe weitergeleitet wird.

Die Captchaeingabe an und für sich stellt ja kein Problem dar, die kann mein Benutzer gerne eingeben, aber mir ist bisher noch nicht gelungen überhaupt weitergeleitet zu werden um das Captcha herunterzuladen.
Oliver M.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 109
Erhaltene Danke: 1

Win 8 CP
VS 11 Beta
BeitragVerfasst: Sa 19.05.12 11:34 
So sehr ich mich auch bemühe, ich bekomme keine Chaptcha Abfrage, obwohl ich alle Scuhergebnisse von Google abrufe. Wieviele muss man denn abrufen, bis man nach einem Chapta gefragt wird? Und woran erkennt man, das ein Captcha abgefragt wird? Ich bekomme zwar bei manschen Querys (z. B. „und“) irgend wann einen 403, aber bis dahin wurden mir schon einige Zeit immer die gleichen Ergebnisse angezeigt. :?