2017-01-09 2 views
0

Я пытаюсь использовать запросы для проверки огромных списков прокси. Для этого я использую потоки. Мне действительно нужны эти потоки, потому что я использую ту же структуру кода, что и для многих запросов на веб-сайте, где я делаю 1 thread = 1 IP.Запросы с прокси и потоком

Так что мой код сортировки:

def proxyList(proxies, nbThread): 
    with open('proxyList.txt', 'w') as f: 
     f.write('') 
     f.close() 
    proxies = list(set(proxies)) 
    prox = [] 
    lenS = len(proxies) 
    pas = int(lenS/nbThread) 
    subSeq = [proxies[i*pas:(i+1)*pas] for i in range(nbThread)] 
    subSeq[nbThread-1]+=proxies[nbThread*pas:] 
    threads = [0 for i in range(nbThread)] 

    for i in range(nbThread): 
     threads[i] = proxy(subSeq[i],) 
    for i in range(nbThread): 
     threads[i].start(); 
    for i in range(nbThread): 
     threads[i].join(); 

    return list(set(prox)) 

class proxy(Thread): 
    def __init__(self, proxies): 
     Thread.__init__(self) 
     self.proxies = proxies 

    def run(self): 
     k=0 
     prox = [] 
     for proxy in self.proxies: 
      k+=1 
      try: 
       requests.get("https://api.ipify.org/?format=json", timeout=15, proxies={"https":str(re.findall(r'[0-9]+(?:\.[0-9]+){3}:[0-9]+', proxy)[0])}) 
       try: 
        requests.get("https://api.ipify.org/?format=json", timeout=15, proxies={"https":str(re.findall(r'[0-9]+(?:\.[0-9]+){3}:[0-9]+', proxy)[0])}) 
        prox+=[str(proxy)] 
        print("Bon proxy : " + str(re.findall(r'[0-9]+(?:\.[0-9]+){3}:[0-9]+', proxy)[0])) 
        with open('proxyList.txt', 'a') as f: 
         f.writelines(str(re.findall(r'[0-9]+(?:\.[0-9]+){3}:[0-9]+', proxy)[0])+'\n'); 
         f.close() 
       except: 
        t = "a" 
      except: 
       print("Mauvais proxy : "+ str(re.findall(r'[0-9]+(?:\.[0-9]+){3}:[0-9]+', proxy)[0])) 
       print(sys.exc_info()[0]) 
     print("Terminé: "+str(k), prox) 

Это работает, но я не всегда имеют одинаковые выходные результаты, это сильно зависит от количества нитей, которые я поставил.

У вас, ребята, есть идея, я видел, что, возможно, запросы здесь не лучший выбор, но мне действительно нужны мои потоки с моими прокси.

Спасибо, Djokx

ответ

1

Я уверен, что запрос является лучшим способом. Ниже приведено обсуждение;

https://gist.github.com/kennethreitz/973705

Но я попытался сделать некоторые улучшения в коде, уменьшилось на петлях, который делал ту же работу и предотвратили называть «получить» метод дважды.

Надеется, что это помогает

def proxyList(proxies, nbThread): 
    with open('proxyList.txt', 'w') as f: 
     f.write('') 
     f.close() 
    proxies = list(set(proxies)) 
    prox = [] 
    lenS = len(proxies) 
    pas = int(lenS/nbThread) 
    subSeq = [proxies[i*pas:(i+1)*pas] for i in range(nbThread)] 
    subSeq[nbThread-1]+=proxies[nbThread*pas:] 
    threads = [0 for i in range(nbThread)] 

    for i in range(nbThread): 
     threads[i] = proxy(subSeq[i],) 
     threads[i].start() 
     threads[i].join() 

    return list(set(prox)) 

class proxy(Thread): 
    def __init__(self, proxies): 
     Thread.__init__(self) 
     self.proxies = proxies 

    def run(self): 
     k=0 
     prox = [] 
     for proxy in self.proxies: 
      k+=1 
      try: 
       s = requests.Session() 
       try: 
        s.get("https://api.ipify.org/?format=json", timeout=15, proxies={"https":str(re.findall(r'[0-9]+(?:\.[0-9]+){3}:[0-9]+', proxy)[0])}) 
        prox+=[str(proxy)] 
        print("Bon proxy : " + str(re.findall(r'[0-9]+(?:\.[0-9]+){3}:[0-9]+', proxy)[0])) 
        with open('proxyList.txt', 'a') as f: 
         f.writelines(str(re.findall(r'[0-9]+(?:\.[0-9]+){3}:[0-9]+', proxy)[0])+'\n'); 
         f.close() 
       except: 
        t = "a" 
      except: 
       print("Mauvais proxy : "+ str(re.findall(r'[0-9]+(?:\.[0-9]+){3}:[0-9]+', proxy)[0])) 
       print(sys.exc_info()[0]) 
     print("Terminé: "+str(k), prox) 
+0

Спасибо за ваш ответ. Но когда я пытаюсь запустить proxyList дважды, с теми же параметрами, результаты довольно разные между ними. Ты знаешь почему ? Спасибо –

+0

Btw, спасибо за улучшение кода! :) Но мне кажется, что если я делаю: для г в диапазоне (nbThread): нити [я] = прокси (после- [я]) нити [я] .start() нити [я ] .join() Ожидается, что первый поток будет остановлен, чтобы начать второй, нет? Я стараюсь, что это намного медленнее! –

+0

Я думал, вам не нужно ждать, чтобы закончить каждый цикл. Поэтому я рекомендовал вставить start и join в один цикл. Вот почему вы должны ждать меньше, но существует ли многопоточность? Если это так, вы правы. Это займет большую задержку. В конечном счете вы можете уточнить, какие различия в результатах? – nuriselcuk