Welche Proxy Methode ist die beste?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Dami123
User
Beiträge: 225
Registriert: Samstag 23. Februar 2013, 13:01

Nabend Community,

ich möchte ein paar Ideen mit Proxy Servern umsetzen und würde gern wissen welche Module ihr verwendet.
Hab hier bereits ein kleines Beispiel:

Code: Alles auswählen

import urllib

proxies = {'http': "http://118.174.144.130:3128"}

result = urllib.urlopen("http://www.whatismyip.com/", proxies=proxies)
print result.read()
whatismyip.com erkennt, dass ein Proxy verwendet wird. Soweit funktionierts.

Ist das Modul ausreichend oder bieten andere Module Funktionen an die theoretisch unerlässlich für ein größeres Programm sind?
und
Im Normalfall sind von meiner Seite aus keine Header Infos nötig, da der Proxy diese nicht ans Ziel mitsendet, um meine Anonymität zu sichern, oder?
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Requests ist urllib/urllib2 definitiv zu bevorzugen.
Dami123
User
Beiträge: 225
Registriert: Samstag 23. Februar 2013, 13:01

@DasIch stelle mich zurzeit auf "requests" um.

Bin am schreiben eines Programms, welches mit Proxies arbeitet. Eine Funktion ist dafür zuständig, dass meine Proxies getestet werden.
Wenn ein Proxy funktionsfähig ist, wird er per "return" wiedergegeben, wenn nicht wiederholt sich die Funktion selber, bis praktisch ein funktionierender Proxy ausgegeben werden kann. Hier die Funktion.

Code: Alles auswählen

import requests

def check_proxy():
    try:
        r = requests.get("http://173.194.113.178", proxies={"http": proxies[0]}, timeout=5)
        proxy = proxies[0]
        used_proxies.append(proxies[0])
        proxies.remove(proxies[0])
        return proxy
    except:
        used_proxies.append(proxies[0])
        proxies.remove(proxies[0])
        check_proxy()


with open("proxy_list.txt", "r") as proxies:
    proxies = proxies.read().splitlines()
    
used_proxies=[]


for i in range(100):
    print check_proxy()
Mein Problem beläuft sich nun auf den "Fehler" von "requests". Wenn nämlich der Proxy innerhalb des Timesouts nicht reagiert, bekomme ich als return "None". Der "except" fängt dies leider nicht ab und die Funktion läuft trotz abgelaufenen timeout weiter weiter.

Zwischenzeitlich verwende ich einen "None"-Filter beim Aufrufen, aber würde diesen gern loswerden.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Dami123: eine Funktion rekursiv aufzurufen ist generell eine schlechte Idee, da früher oder später das Rekusionslimit erreicht wird. Globalen Listen zu verändern ist auch nicht toll. Ein nacktes »except« zu verwenden dumm, da das die Fehlersuche behindert. Was erwartest Du denn für Exception-Typen?
Statt das teure »remove« reicht ein »pop(0)«. »proxies.read().splitline()« ist gleich wie »proxies.readlines()«:

Code: Alles auswählen

import requests

def check_proxies(proxies):
    working = []
    nonworking = []
    for proxy in proxies:
        proxy = proxy.strip()
        try:
            assert requests.get("http://173.194.113.178", proxies={"http": proxy}, timeout=5)
        except (requests.exceptions.RequestException, AssertionError):
            nonworking.append(proxy)
        else:
            working.append(proxy)
    return working, nonworking

def main():
    with open("proxy_list.txt", "r") as proxies:
        working, nonworking = check_proxies(proxies)
    print '\n'.join(working)
if __name__ == '__main__':
    main()
Dami123
User
Beiträge: 225
Registriert: Samstag 23. Februar 2013, 13:01

Danke für die gute Korrektur :)
- ".read().splitline()" entfernt auch die newline im Gegensatz zu "readlines()"
- rekursiv wär in meinem Fall kein Problem, da die Funktion nur einen brauchbaren Proxy ausgeben soll. Aber für die Gewohnheit sollte ich keine Rekursion verwenden, das stimmt.
- ein nacktes "except" hab ich hier verwendet, da die Funktion erst aufgerufen wird, wenn mögliche Fehlerquellen nicht vorhanden sind und praktisch jeder sonstige Fehler der mir keinen funktionierenden Proxy ausgibt, nicht weiter beachtet werden soll.
- "pop()" bau ich ein.
Zuletzt geändert von Dami123 am Dienstag 2. Juli 2013, 21:27, insgesamt 2-mal geändert.
BlackJack

@Dami123: Unnötige Rekursion ist immer ein Problem. So etwas sollte man sich gar nicht erst angewöhnen. Zumal das hier eine echt umständliche Alternative zu einer simplen ``for``-Schleife war, wo jeder sofort versteht was da vor sich geht.

Du weist doch gar nicht welche Fehlerquellen nicht mehr vorhanden sind, das Problem ist doch gerade dass Du hier Fehler verschluckst mit denen Du nicht rechnest, und von denen Du auf diese Weise nie etwas erfährst, das heisst es können Proxies aussortiert werden die funktionieren, wo es aber irgend ein anderes Problem mit Deinem Programm gibt. Überlege zum Beispiel mal was mit Deiner tollen Rekursion passiert wenn keiner der Proxies funktioniert.

`pop()` solltest Du nicht einbauen. Du solltest Die Datenstruktur gar nicht unnötig verändern.
Dami123
User
Beiträge: 225
Registriert: Samstag 23. Februar 2013, 13:01

Ich hab den Wald vor lauter Bäumen nicht gesehen... eine einfache "for"-Schleife ist die Lösung. :lol: danke dafür.

Fehler versuch ich nun aufzufangen.
Antworten