2016-10-19 35 views
0

タスクを8つのプロセスに分割する必要があります。 私はそれを行うためにmultiprocessingを使用します。 私の仕事について説明しようとしています: 私はdataframeを持っていて、URLには列があります。いくつかのURLにはcaptchaがあり、私はすべてのURLからページを取得するために他のファイルからプロキシを使用しようとします。 これには時間がかかり、分けたいと思っています。私は1つのプロキシで最初のURLを開き、別のプロキシなどでURLを同期したい。プロキシを持つリストの長さがより小さいので、mapまたはzipを使用することはできません。 のURLPython:並列化処理を行う方法

['http://203.223.143.51:8080', 'http://77.123.18.56:81', 'http://203.146.189.61:80', 'http://113.185.19.130:80', 'http://212.235.226.133:3128', 'http://5.39.89.84:8080'] 

私のコードのように見える

['https://www.avito.ru/moskva/avtomobili/bmw_x5_2016_840834845', 'https://www.avito.ru/moskva/avtomobili/bmw_1_seriya_2016_855898883', 'https://www.avito.ru/moskva/avtomobili/bmw_3_seriya_2016_853351780', 'https://www.avito.ru/moskva/avtomobili/bmw_3_seriya_2016_856641142', 'https://www.avito.ru/moskva/avtomobili/bmw_3_seriya_2016_856641140', 'https://www.avito.ru/moskva/avtomobili/bmw_3_seriya_2016_853351780', 'https://www.avito.ru/moskva/avtomobili/bmw_3_seriya_2016_856641134', 'https://www.avito.ru/moskva/avtomobili/bmw_3_seriya_2016_856641141'] 

とプロキシのようになります。

def get_page(url): 
m = re.search(r'avito.ru\/[a-z]+\/avtomobili\/[a-z0-9_]+$', url) 
if m is not None: 
    url = 'https://www.' + url 
    print url 
    proxy = pd.read_excel('proxies.xlsx') 
    proxies = proxy.proxy.values.tolist() 
    for i, proxy in enumerate(proxies): 
     print "Trying HTTP proxy %s" % proxy 
     try: 
      result = urllib.urlopen(url, proxies={'http': proxy}).read() 
      if 'Мы обнаружили, что запросы, поступающие с вашего IP-адреса, похожи на автоматические' in result: 
       raise Exception 
      else: 
       page = page.read() 
       soup = BeautifulSoup(page, 'html.parser') 
       price = soup.find('span', itemprop="price") 
       print price 
     except: 
      print "Trying next proxy %s in 10 seconds" % proxy 
      time.sleep(10) 

if __name__ == '__main__': 
    pool = Pool(processes=8) 
    pool.map(get_page, urls) 

私のコードは8つのURLを取り、1つのプロキシでそれを開いてみてください。 8つの異なるプロキシで8つのURLを開くアルゴリズムを変更するにはどうすればよいですか?そのような

+0

あなたが複数使用することをお勧めします - あなたのCPUは、おそらくほとんどの時間をアイドル状態にあることから、ここで** **スレッドを。また、あなたの質問から個人情報を隠すことができます。 –

答えて

0

何かが役立つかもしれない:

def get_page(url): 
m = re.search(r'avito.ru\/[a-z]+\/avtomobili\/[a-z0-9_]+$', url) 
if m is not None: 
    url = 'https://www.' + url 
    print url 
    proxy = pd.read_excel('proxies.xlsx') 
    proxies = proxy.proxy.values.tolist() 
    for i, proxy in enumerate(proxies): 
     thread.start_new_thread(run, (proxy,i)) 

def run(proxy,i): 
    print "Trying HTTP proxy %s" % proxy 
    try: 
     result = urllib.urlopen(url, proxies={'http': proxy}).read() 
     if 'Мы обнаружили, что запросы, поступающие с вашего IP-адреса, похожи на автоматические' in result: 
       raise Exception 
     else: 
      page = page.read() 
      soup = BeautifulSoup(page, 'html.parser') 
      price = soup.find('span', itemprop="price") 
      print price 
    except: 
     print "Trying next proxy %s in 10 seconds" % proxy 
      time.sleep(10) 

if __name__ == '__main__': 
    pool = Pool(processes=8) 
    pool.map(get_page, urls) 
+0

これは不思議ですが、 'run()'の 'url'は定義されていません –

+0

4つのURL(8つではない)しか取らずに開きます。それを開いて終了することはできません。それはURLのリストに続くものではありません –

関連する問題