PHP Proxys

joschilein

Multitalent
ID: 9301
L
5 Mai 2006
1.393
151
Es geht darum verschiedene SEO-Abfragen über verschiedene Proxys zu erstellen.

Dazu brauche ich eine automatisch aktualisierte Liste gültiger Proxys und dann die Verwendung einer dieser Proxyinformation für eine Abfrage. Diese beiden Themenbereiche gliedere ich auf zwei Klassen aus.

Die erste Klasse (für die Liste) wird momentan noch durch die Rückgabe manuell eingetragener Arrays simuliert. Mein Problem ist die Klasse, welche die eigentliche Abfrage machen soll. Im ersten Schritt soll sie mal prüfen, ob der Proxy überhaupt (noch) funktioniert und dessen verwendete IP ermitteln. Ich kann mich ja schließlich nicht darauf verlassen, ob HTTP_X_FORWARDED_FOR verwendet wird und wenn könnte ich mir den Käse gleich sparen. Im Idealfall wäre die so ermittelte IP identisch mit der, die ich zur Proxyverbindung verwendet habe.

Nun habe ich aber schon festgestellt, dass die Interpretation der Ergebnisse gar nicht so einfach ist und möchte mal fragen ob das soweit richtig ist.
  1. Wenn es einen curl-Timeout (errno 28) gibt (testweise mal großzügige 20sec) ist wohl der Proxy nichts (mehr). Wobei es hier auch Unterschiede zu geben scheint, da über curl_getinfo() mal komplette 0er gezeigt werden und manchmal die time-Felder zwar was zeigen, aber download_content_length auf 0 steht. Wobei der zweite Fall eigentlich nicht an der Zielseite liegen kann, da ich bei paralleler Proxyverwendung bei anderen problem ein Ergebnis bekomme.
  2. Manche Proxys scheinen auf schwarzen Listen zu sein, wodurch zwar eine Ergebnisseite zurückgegeben wird, jedoch nicht die gewünschte Information darauf zu finden ist. Hier müsste ich ggf. noch unterscheiden können, ob ein preg_match wegen einem geblocktem Proxy oder einfach wegen einer Umstrukturierung des Html-Aufbaus fehl schlägt.
  3. Was mich nun am allermeisten wundert: Wenn ich mit mehreren Proxys parallel den selben IP-Lookup probiere, habe ich entweder Ergebnisse aus 1. oder 2. oder scheinbar gültige Ergebnisse. Nur warum wird bei manchen Proxys dann eine ganz andere IP ermittelt, als sie eigentlich haben sollten (weder die von mir erwartete, noch meine eigene, zusätzlich pro Aufruf wieder anders)? Habe ich Proxys erwischt, die selbst wieder Proxys nutzen? Ist das ein Bug oder Feature? Für meine Prüfung sollte es ja schonmal reichen, wenn nicht meine eigene IP ermittelt wird.
 
  1. Was mich nun am allermeisten wundert: Wenn ich mit mehreren Proxys parallel den selben IP-Lookup probiere, habe ich entweder Ergebnisse aus 1. oder 2. oder scheinbar gültige Ergebnisse. Nur warum wird bei manchen Proxys dann eine ganz andere IP ermittelt, als sie eigentlich haben sollten (weder die von mir erwartete, noch meine eigene, zusätzlich pro Aufruf wieder anders)? Habe ich Proxys erwischt, die selbst wieder Proxys nutzen? Ist das ein Bug oder Feature? Für meine Prüfung sollte es ja schonmal reichen, wenn nicht meine eigene IP ermittelt wird.

Das ist eindeutig ein Feature. Der Proxy könnte zum Beispiel an TOR angeschlossen sein.

https://www.torproject.org/

Bei curl solltest du auch die anderen Fehler behandeln.

https://curl.haxx.se/libcurl/c/libcurl-errors.html
 
ganz einfach:

www.wieistmeineip.de

als URL dem Proxy geben und dann bekommst du ein Ergebnis.
Die Proxy IP ist ja bekannt. Ist sie gleich dem aus dem Aufruf, dann ist es ok, sonst ist mindestens noch ein Proxy nachgeschalten.
Würde ich ebenfalls als ein Feature benennen.
 
Bei curl solltest du auch die anderen Fehler behandeln.
Klar, die Errorliste habe ich mir auch schon angeschaut. Es macht aber eigentlich fast keinen Unterschied warum eine Verbindung scheitert, außer es würde helfen zu unterscheiden, ob es an der Verbindung zum Proxy oder von diesem zum Ziel liegt. Im Zweifel wird einfach der nächste Proxy genutzt.

ganz einfach:
www.wieistmeineip.de
als URL dem Proxy geben und dann bekommst du ein Ergebnis.
Na über was habe ich wohl getestet, wenn nicht über diese und ähnliche Angebote. Was ich am Ende verwende überlege ich mir noch, kommt auch auf die Einfachheit der nötigen Regex-Patterns an. Vermutlich wird das eh rotierend verwendet. Aber noch muss ich auch mal das verhalten bei geblockten Proxys analysieren. Gibt es eigentlich auch Lookups die ein einfach strukturiertes xml oder ähnliches zurückliefern?
 
mal gefragt, was ist eine SEO-Abfrage ?
was mit suchmaschinen, aber was genau ?

Nachtrag:
Es wird keine komplette Proxyliste geben, da es Ketten von Proxy's gibt, wo nur der erste als öffentlich bekannter zum greifen ist.
Soll der Anonymität dienen.
 
Also ich bin schon mal einen großen Schritt weiter. Die Verwendung der einzelnen Proxys funktioniert und auch meine Listenklasse kann nun automatisch Daten abfragen.

Nun bräuchte ich mal noch ein paar Ideen zur Sortierung. Also angenommen ich sage der Listenklasse, dass ich 5 valide Proxys möchte.
Die schaut dann in die DB nach folgendem Muster:
Code:
SELECT    id
FROM      proxys
WHERE    todelete = '0'
    AND    (ISNULL(lastipergnum) OR lastimpergnum > 0)
ORDER BY $order
Eine besondere Bedeutung kommt hier lastipergnum zu. Wenn ein Proxy geladen wird, schaut er erstmal welche IP er nach außen trägt. Wenn er das vor nicht all zu langer Zeit gemacht hat, unterlässt er eine erneute Abfrage (~15 min). lastipergnum kann folgende Werte haben.
Code:
NULL: Noch gar nicht geprüft
 2: Funktioniert mit dynamischer IP
 1: Funktioniert mit statischer IP (für curl verwendetet)
-1: Keine Daten (Proxy funktioniert nicht oder braucht zu lange)
-2: Verbotene IP gefunden (HTTP_X_FORWARDED_FOR benutzt)
-3: Beim Lookup geblockt
-4: Lookup kann nicht analysiert werden (=Auffangcode)
Zusätzlich wird todelete dann auf 1 gesetzt, wenn entweder -2 auftritt (dem Proxy kann ich nicht trauen) oder zu oft -1 (Ich summiere auf wie oft ingesamt probiert und wie oft davon fehlgeschlagen). Später werde ich auch noch diejenigen mit zu langsamen durchschnittlichen Datenraten aussieben (aktuell wird erstmal nur Datenmenge und benötigte Zeit aus der curlinfo aufsummiert).

Mit obiger SQL-Abfrage habe ich also erstmal alle Proxyids, die valide sein sollten, das also zumindest zuletzt waren - z.B. aktuell 20 Stück. Bleibt noch die Frage, wie ich die am besten sortiere ($order ist ja noch offen) und wie ich ggf. neue einflechte (daher auch ISNULL).

Es sollen ja nicht immer die selben verwendet werden. Dennoch sollten die bevorzugt sein, die oft schnell reagiert haben. Außerdem ist es vorteilhaft, wenn diejenigen ihrer Lookupfrist genommen werden, da diese ja dann keine zusätzliche Prüfung der IP mehr machen. Und es gibt bestimmt noch einige andere Ansätze.
Die aktuellen Informationsspalten sind: lastiplookuptime, lastipergnum, lasterrortime, lasterror (z.B. 28 für timeout), numerrors, lastusetime, numuses, loadtime, loadsize.

Aktuell wird auch nur dann die Proxyliste nachgeladen, wenn durch das Query und die danach folgende validierung durch die jeweiligen Proxyobjekte nicht die angefragte Anzahl übrig bleibt. Würde ich nicht auf die positiven ergnums beschränken, würde ja stattdessen ggf. erst die komplette Liste invalider Proxys durchprobiert. Davon kann zwar der ein oder andere wieder aktiv werden (z.B. weil ein guter nur mal an einem schlechten Tag wegen Timeout eine -1 gefangen hat), aber die Wahrscheinlichkeit viele Fehlschläge zu haben ist natürlich groß. Da mache ich lieber parallel noch eine Extraroutine, die die invaliden ravalidiert.

Und dann gibt es auch noch die Frage, wie das ganze im Bezug auf Serps gut eingeflochten werden kann. Die Berechnung durch Frontendnutzer schließe ich aus, da die Ladezeiten einfach spürbar leiden würden (10 Seiten für ein Keyword sind schon nicht wenig). Aber auch für Backendnutzer, die das Gesamtpaket selbst anstoßen wollen, wäre der php-timeout ein Problem (ja verlängern und flush sind aber auch nicht so toll). Bleibt noch das Thema Cronjob oder eine Ajax-Lösung im Backend. Eines der letzten beiden werde ich wohl machen.

Ähm ja, die leere api-Variante hatte ich wirklich noch nicht entdeckt (ist in den Beispielen ja immer mit konkreter IP verwendet).

mal gefragt, was ist eine SEO-Abfrage ?
was mit suchmaschinen, aber was genau ?
=> SERP-Scraping (jaja, böse :ugly:)
(Das automatisiserte Auslesen von Suchmaschinenergebnislisten)

Es wird keine komplette Proxyliste geben, da es Ketten von Proxy's gibt, wo nur der erste als öffentlich bekannter zum greifen ist.
Ich brauche keine komplette Liste, sondern nur so viele wie ich brauche. ;)
 
Die Web Search API steht seit Ende 2010 auf Depraced. Die neuere Custom Search API ist noch nicht ganz fertig und zudem stark limitiert.

Außerdem traue ich Google nicht so ganz. Es gibt ja schon unterschiedliche Ergebnisse, wenn man den num-Parameter verändert (z.B. 100 anstatt 10 Ergebnisse; wobei es da jetzt mit InstantPages sogar nicht mehr geht). Und das wird über ein Api-Key sicher nicht "neutraler" sein.