2017-01-09 9 views
0

私は巨大なプロキシリストをチェックする要求を使用しようとしています。これを行うために、私はスレッドを使用しています。私は本当に1つのスレッド= 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を2回実行しようとしているとき、同じパラメータで、2つの結果がかなり異なっています。なぜなのかご存知ですか ? ありがとうございました –

+0

Btw、コード改善のおかげでありがとう! :) しかし、私がやっている場合ようだ: を私用の範囲で(nbThread): スレッド[i]は=プロキシ(subSeq [i]が、) スレッド[i]を.start() スレッド[I ] .join() 2番目のスレッドを開始するために最初のスレッドが停止するのを待つでしょうか?私はそれを試してみました、それはずっと遅いです! –

+0

私はループのたびに終了するのを待つ必要はないと思った。ですから、私は開始と挿入を1つのループに挿入することを推奨しました。なぜなら、あまり待たなければならない理由はありますが、マルチスレッド化は存在しません。そうなら、あなたは正しいです。それはより大きな遅れをとるだろう。 最終的に結果にどのような違いがあるかを明確にすることができますか? – nuriselcuk

関連する問題