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.