DoS HiberProxy.py - Multithreading POWERFUL Proxy Downloader and Checker (up to 30k)

All3xJ

Utente Gold
28 Marzo 2014
597
46
109
251
Ultima modifica:
E' un piccolo script scritto da me. Riesco a scaricare da 28k proxies in su. È un programma in python che cerca in molti siti proxy list e li raggruppa, eliminando i duplicati e facendo il check (in multithreading) per veder se sono o meno UP.

Ve lo consiglio, è uno strumento potente, magari accoppiato con Hibernet o qualsiasi altro programma che fa uso di proxy.

Lo trovate qui: https://github.com/All3xJ/HiberProxy

Enjoy


Ovviamente non scrivete cazzate del tipo: "30k proxy non sono un pazzo"... Se volete i proxy veri e buoni, comprateli. Questa è una alternativa per avere proxy pubblici e gratuiti, ma FUNZIONANTI e ATTIVI, visto che nel programma c'è il check dei proxy integrato.

Se avete qualche sito da consigliare che dia un bel numero di proxy, scrivetemelo, vedrò di integrarlo nel programma per avere ancora più proxy.
 
  • Mi piace
Reazioni: Sauron9 e 0xbro
Ultima modifica:
Ciao, i proxy che sono riuscito a prendere sono 1200 circa e facendo svariati check consecutivi riuscivo ad arrivare a 500 più o meno fissi, ciononostante sono sempre 500 proxies, per quanto riguarda il codice, invece, ti faccio i miei complimenti, io non saprei fare tutto quel parsing... comunquo ho lo stesso delle migliorie da proporre su altri concetti:

1. potresti usare il threading anche per il downloading e non solo per il checking, per esempio un thread per ogni funzione che prende i proxies o se vogliamo proprio essere precisi, con un pizzico di difficoltà in più, lo si puo fare per ogni sito.

2. il modo con cui hai implementato il threading nel checking non mi piace, io lo ho fatto in modo diverso, sotto ho postato i cambiamenti. Comunque, parlando di efficienza, in questa casistica, non sembra avere rallentamenti. Piccola annotazione, con la mia cpu, che non è molto performante, il programma si bloccava ad attivare tutte quelle migliaia di thread, sarebbere, quindi, utile far scegliere quanti thread usare.

3. sarebbe utile un contatore dei proxy dopo il checking, perchè, dopo, molti proxy se ne vanno, poichè i siti hanno tanti proxy inattivi (implementabile in una riga)

4. mettere il mascheramento user-agent anche al checking, non vorrei che google blocchi tutte quelle richieste fatte da uno script e quindi faccia pensare che il proxy non funzioni.


modifiche del punto 2 (implementazione threading del checking)

come è ora
Python:
import urllib.request, threading

def proxycheckerinit():
    global out_file
    candidate_proxies = open("proxy.txt").readlines()
    filedl = open("proxy.txt", "w") # prima cancella contenuto
    filedl.close()
    out_file = open("proxy.txt", "a") # e poi lo apre non in riscrivibile
    for i in candidate_proxies:
        threading.Thread(target=proxychecker, args=[i]).start() # avvia un thread per proxy per velocizzare

def proxychecker(i):
    proxy = 'http://' + i
    proxy_support = urllib.request.ProxyHandler({'http' : proxy}) # compone la richiesta con il proxy
    opener = urllib.request.build_opener(proxy_support)
    urllib.request.install_opener(opener)
    try:
        urllib.request.urlopen("http://www.google.com", timeout=10)
        print ("%s works!\n\n" % proxy) # se funziona printa "it works"
        out_file.write(i)               # e lo scrive nel file.
    except:
        print ("%s does not respond.\n\n" % proxy) #altrimenti dice che non risponde


proxycheckerinit()

modificato
Python:
import urllib.request, threading, queue

def proxycheckerinit():
    '''
    Funzione che deve essere chiamata per avviare il checking dei proxy.
    '''
    global out_file
    global q # !!!
    
    proxies = open("proxy.txt").readlines()

    filedl = open("proxy.txt", "w")
    filedl.close()
    
    out_file = open("proxy.txt", "a")
    
    q = queue.Queue() # creazione della lista q
    for p in proxies:
        q.put(p) # inserisce tutti i proxy nella lista
        
    threads = []
    for i in range(threads_num):
        t = threading.Thread(target = proxy_controller)
        t.start()
        threads.append(t) # copia gli object dei thread in un lista, così da richiamarli dopo per ucciderli
        
    q.join() # aspetta che tutti i proxy siano stati checkati, per capirlo q.join() si aspetta
             # tanti q.task_done() quanti sono gli oggetti messi nella lista da q.put()
    
    out_file.close()
    
    for i in range(threads_num):
        q.put(None) # manda questo valore per far terminare il lavoro di tutti i thread
        
    for t in threads:
        t.join() # aspetta che il thread abbia finito prima di andare avanti e lo uccide.
                 # in questi caso, i thread hanno sempre finito in questo punto, perchè
                 # abbiamo già aspettato con il q.join() del modulo queue e li abbiamo
                 # terminati mandando i valori None, quindi questo serve solo ad ucciderli


def proxy_controller():
    '''
    Funzione di ogni thread, che ripetutamente prende un proxy dalla lista e lo checka.
    Quando la lista è vuota, puo essere terminato.
    '''
    while True:
        i = q.get() # prende un proxy
        if i == None: # if per terminare il thread quando hanno finito di lavorare, basta inserire tante volte il valore None quanti sono i thread
            break
        proxychecker(i) # checka il proxy
        q.task_done() # dice a q.join() che un proxy è stato checkato

def proxychecker(i):
    proxy = 'http://' + i
    proxy_support = urllib.request.ProxyHandler({'http' : proxy}) # compone la richiesta con il proxy
    opener = urllib.request.build_opener(proxy_support)
    urllib.request.install_opener(opener)
    try:
        urllib.request.urlopen("http://www.google.com", timeout=10)
        print ("%s works!\n\n" % proxy) # se funziona printa "it works"
        out_file.write(i)               # e lo scrive nel file.
    except:
        print ("%s does not respond.\n\n" % proxy) #altrimenti dice che non risponde

threads_num = 10000

proxycheckerinit()



Modifica:
Ho scoperto che il programma non si bloccava, ma rimaneva semplicemente a fare niente, perchè i thread non venivano uccisi. Però sarebbe comunque un' idea far decidere quanti thread utilizzare.
 
  • Mi piace
Reazioni: All3xJ
Ciao, i proxy che sono riuscito a prendere sono 1200 circa e facendo svariati check consecutivi riuscivo ad arrivare a 500 più o meno fissi, ciononostante sono sempre 500 proxies, per quanto riguarda il codice, invece, ti faccio i miei complimenti, io non saprei fare tutto quel parsing... comunquo ho lo stesso delle migliorie da proporre su altri concetti:

1. potresti usare il threading anche per il downloading e non solo per il checking, per esempio un thread per ogni funzione che prende i proxies o se vogliamo proprio essere precisi, con un pizzico di difficoltà in più, lo si puo fare per ogni sito.

2. il modo con cui hai implementato il threading nel checking non mi piace, io lo ho fatto in modo diverso, sotto ho postato i cambiamenti. Comunque, parlando di efficienza, in questa casistica, non sembra avere rallentamenti. Piccola annotazione, con la mia cpu, che non è molto performante, il programma si bloccava ad attivare tutte quelle migliaia di thread, sarebbere, quindi, utile far scegliere quanti thread usare.

3. sarebbe utile un contatore dei proxy dopo il checking, perchè, dopo, molti proxy se ne vanno, poichè i siti hanno tanti proxy inattivi (implementabile in una riga)

4. mettere il mascheramento user-agent anche al checking, non vorrei che google blocchi tutte quelle richieste fatte da uno script e quindi faccia pensare che il proxy non funzioni.


modifiche del punto 2 (implementazione threading del checking)

come è ora
Python:
import urllib.request, threading

def proxycheckerinit():
    global out_file
    candidate_proxies = open("proxy.txt").readlines()
    filedl = open("proxy.txt", "w") # prima cancella contenuto
    filedl.close()
    out_file = open("proxy.txt", "a") # e poi lo apre non in riscrivibile
    for i in candidate_proxies:
        threading.Thread(target=proxychecker, args=[i]).start() # avvia un thread per proxy per velocizzare

def proxychecker(i):
    proxy = 'http://' + i
    proxy_support = urllib.request.ProxyHandler({'http' : proxy}) # compone la richiesta con il proxy
    opener = urllib.request.build_opener(proxy_support)
    urllib.request.install_opener(opener)
    try:
        urllib.request.urlopen("http://www.google.com", timeout=10)
        print ("%s works!\n\n" % proxy) # se funziona printa "it works"
        out_file.write(i)               # e lo scrive nel file.
    except:
        print ("%s does not respond.\n\n" % proxy) #altrimenti dice che non risponde


proxycheckerinit()

modificato
Python:
import urllib.request, threading, queue

def proxycheckerinit():
    global out_file
    global q
  
    proxies = open("proxy.txt").readlines()

    filedl = open("proxy.txt", "w")
    filedl.close()
  
    out_file = open("proxy.txt", "a")
  
    q = queue.Queue()
    for p in proxies:
        q.put(p)
      
    threads = []
    for i in range(threads_num):
        t = threading.Thread(target = proxy_controller)
        t.start()
        threads.append(t)
      
    q.join()
  
    out_file.close()
  
    for i in range(threads_num):
        q.put(None)
      
    for t in threads:
        t.join()


def proxy_controller():
    while True:
        i = q.get()
        if i == None:
            break
        proxychecker(i)
        q.task_done()

def proxychecker(i):
    proxy = 'http://' + i
    proxy_support = urllib.request.ProxyHandler({'http' : proxy}) # compone la richiesta con il proxy
    opener = urllib.request.build_opener(proxy_support)
    urllib.request.install_opener(opener)
    try:
        urllib.request.urlopen("http://www.google.com", timeout=10)
        print ("%s works!\n\n" % proxy) # se funziona printa "it works"
        out_file.write(i)               # e lo scrive nel file.
    except:
        print ("%s does not respond.\n\n" % proxy) #altrimenti dice che non risponde

threads_num = 10000

proxycheckerinit()



Modifica:
Ho scoperto che il programma non si bloccava, ma rimaneva semplicemente a fare niente, perchè i thread non venivano uccisi. Però sarebbe comunque un' idea far decidere quanti thread utilizzare.

Ciao! Innanzitutto grazie della risposta, mi piacciono i commenti costruttivi. Ora vedo di rispondere a tutto ciò che hai detto.

Per quanto riguarda il numero dei proxy, ti assicuro che i proxy pubblici non sono performanti e affidabili. Non è un problema del programma il fatto che dopo il check i proxy validi sono pochi, visto che sei fai uno scan al sito più grosso di proxylist pubbliche (http://free-proxy-list.net) vedrai che più della metà sono down, anche se il sito si presenta come "Just Checked Proxies". Quindi il problema di fondo non è il programma, ma i proxy pubblici, che sono molto altalenanti. L'unica cosa possibile da fare è aumentare il numero di siti di free proxy list. E in questo potete aiutarmi voi, suggerendomene qualcuno.

1) Si potrei implementare il threading nel download, anche se sarebbe un pò sprecato visto che è già abbastanza veloce, ma farlo potrebbe migliorare ulteriormente la velocità. Più che altro era per fare una cosa più "pulita", senza incorrere ai threads.

2)Ho analizzato bene il code che hai modificato, e apprezzo la modifica. In realtà a me non funziona, ma forse c'è bisogno di impostare qualcosa di aggiuntivo ma onestamente è tardi e non ragiono più lol. Però ho capito il tuo intento importando la libreria queue, infatti quando ho un pò di tempo vedo di implementare questo metodo nel programma. Però ho una richiesta: se potevi commentare le lines così da capire meglio il funzionamento, perchè le ultime lines di proxycheckerinit() (il q.join() e i due cicli for all'ultimo) non capisco il significato (ripeto, sarà perchè sono stanchissimo, magari domani mi sveglio e le capisco ).

3)Giustissimo, anzi hai fatto bene a dirmelo, ero convinto di averlo messo.

4)Vero, provvederò

Grazie mille per la segnalazione, se hai altro da dire dimmi pure, se vuoi forka il prgoramma su github e fai la tua versione o suggeriscimi altri link per proxylist o altre funzionalità da implementare!
 
  • Mi piace
Reazioni: Sauron9
Ultima modifica:
Aggiunti commenti.
posso contattarti su telegram? comunque sto implementanto il tuo code, è un problema se lascio i commenti?

c'è questa parte:
Codice:
for i in range(threads_num):
    q.put(None)

che ancora non capisco. se nella lista queue ci sono tutti i proxies, perchè stai facendo un ciclo for con i threads invece che con i proxy?

Altra cosa, secondo te un valore ottimale medio per i threads è 800-1200? (voglio mettere un valore consigliato quando darò l'input per chiedere quanti proxy si vogliono)
 
Per i commenti non è un problema.

Quanto riguarda il codice, a quel punto del programma la lista è gia stata tutta elaborata e svuotata, poi i thread rimangono, a causa del loop, ad aspettare nel codice q.get() che arrivino nuovi oggetti, pertanto per eliminarli mandiamo i valori None che fanno attivare il break all' interno del if, facendo terminare il thread, in questo caso mando esattamente il minimo necessario per far terminare tutti i thread(il minimo necessario sarebbe il numero dei thread attivati), ma ipoteticamente, aggiungerei anche inutilmente, potrei mettere un numero maggiore di None.

Io uso 10000 threads, che sarebbero all' incirca gli stessi thread che avviavi in media con il tuo programma(il tuo programma ne creava esattamente rispetto a quanti proxy trovava). Potresti fare un scelta dove, se lasci fare il programma il numero dei thread è simile al numero dei proxy, oppure la scelta manuale che devi inserire il numero.

Se vuoi contattarmi, mandami il tuo nome in privato.
 
  • Mi piace
Reazioni: All3xJ
Ultima modifica:
Allora, ho messo su github una nuova versione del programma molto più ottimizzata. Molti consigli tuoi li ho messi in pratica e ho modificato gran parte di codice. Per quanto riguarda la parte dei threads e della queue: ho fatto diversi test, e sebbene il tuo metodo sia molto più elegante e gestibile, da più problemi. Nel senso, la mia cpu (anche se diminuisco da 10k threads a un numero più fattibile) va meglio col metodo for i in proxies: start thread..... la tua osservazione che rallenta di molto la cpu perchè avvia un thread per ogni proxy, è vero, o almeno il linea teorica. Ma a quanto pare il check è talmente veloce che la cpu non si rallenta perchè il lavoro dei threads dura molto poco. Riassumendo, il metodo della versione iniziale di HiberProxy è quello che ho scelto sebbene so che non è il migliore in termini di coerenza di programmazione. Ma se funziona meglio ed è più veloce, alla fine, è bene usare quello. Grazie infinite per tutto, tant'è che nella nuova versione ho implementato molte cose che mi avevi suggerito. GG
Messaggio unito automaticamente:

Caricata nuova versione con nuovi bug fixes. Aumentato il timeout, ora i proxy che risultano up dopo il check risultano di più
 
  • Mi piace
Reazioni: Sauron9