0

urllib2を使用してデータスクレイピング呼び出しを行っていますが、それぞれが完了するまでに約1秒かかります。URL呼び出しループをさまざまなオフセットのスレッドにマルチスレッド化できるかどうかをテストしようとしていました。

私は今、update_items()メソッドでこれを行っています。ここで、最初と2番目のパラメーターは、ループを実行するためのオフセットと制限です。

import threading
t1 = threading.Thread(target=trade.update_items(1, 100))
t2 = threading.Thread(target=trade.update_items(101, 200))
t3 = threading.Thread(target=trade.update_items(201, 300))

t1.start()
t2.start()
t3.start()

#t1.join()
#t2.join()
#t3.join()

コードのように、スレッドの待機を防ぐためにjoin()をコメントアウトしようとしましたが、このライブラリの考えが間違っているようです。print()関数をupdate_items()メソッドに挿入しました。これは、私が達成したかったように、3つのスレッドすべてが並列ではなく、シリアルルーチンでループしていることを示しています。

私の通常のスクレイピングプロトコルは完了するのに約5時間かかり、それは非常に小さなデータですが、HTTP呼び出しには常に時間がかかります。このタスクを少なくとも数回マルチスレッド化して、フェッチを少なくとも30〜45分に短縮したいと思います。

4

2 に答える 2

3

複数のURLを並行して取得するには、一度に20の接続に制限します。

import urllib2
from multiprocessing.dummy import Pool

def generate_urls(): # generate some dummy urls
    for i in range(100):
        yield 'http://example.com?param=%d' % i

def get_url(url):
    try: return url, urllib2.urlopen(url).read(), None
    except EnvironmentError as e:
         return url, None, e

pool = Pool(20) # limit number of concurrent connections
for url, result, error in pool.imap_unordered(get_url, generate_urls()):
    if error is None:
       print result,
于 2013-01-29T23:45:43.727 に答える