2

URL が存在するかどうか (200 を返す) を確認するために、多数 (約 1000 万) の URL をチェックする必要があります。これを URL ごとに実行する次のコードを作成しましたが、すべての URL を実行するには、ほぼ永遠に時間がかかります。

def is_200(url):             
    try:
        parsed = urlparse(url)
        conn = httplib.HTTPConnection(parsed.netloc)
        conn.request("HEAD", parsed.path)
        res = conn.getresponse()
        return res.status == 200
    except KeyboardInterrupt, e:
        raise e
    except:
        return False

URL は約 12 のホストに分散されているため、これを利用してリクエストをパイプライン処理し、接続のオーバーヘッドを削減できるはずです。これをどのように構築しますか?私はどんなプログラミング/スクリプト言語にもオープンです。

4

2 に答える 2

2

urllib3を見てください。ホストごとの接続の再利用をサポートします。さらに、複数のプロセス/スレッドまたは非同期I/Oを使用することをお勧めします。

于 2011-04-21T08:03:39.193 に答える
2

これはすべて Python バージョン 3.x で行われます。

200 をチェックするワーカー スレッドを作成します。例を挙げます。スレッドプール (threadpool.py に入れる):

# http://code.activestate.com/recipes/577187-python-thread-pool/

from queue import Queue
from threading import Thread

class Worker(Thread):
    def __init__(self, tasks):
        Thread.__init__(self)
        self.tasks = tasks
        self.daemon = True
        self.start()

    def run(self):
        while True:
            func, args, kargs = self.tasks.get()
            try: func(*args, **kargs)
            except Exception as exception: print(exception)
            self.tasks.task_done()

class ThreadPool:
    def __init__(self, num_threads):
        self.tasks = Queue(num_threads)
        for _ in range(num_threads): Worker(self.tasks)

    def add_task(self, func, *args, **kargs):
        self.tasks.put((func, args, kargs))

    def wait_completion(self):
        self.tasks.join()

に URL が含まれている場合urllist、メイン ファイルは次のようになります。

numconns = 40
workers = threadpool.ThreadPool(numconns)
results = [None] * len(urllist)

def check200(url, index):
    results[index] = is_200(url)

for index, url in enumerate(urllist):
    try:
        workers.add_task(check200, url, index)

    except KeyboardInterrupt:
        print("Shutting down application, hang on...")
        workers.wait_completion()

        break

このプログラムは、ここに投稿された他の提案に合わせて調整されることに注意してください。これは、にのみ依存していis_200()ます。

于 2011-04-21T08:15:26.037 に答える