Проверка множества URL-адресов, чтобы увидеть, возвращают ли они 200. Какой самый умный способ? - PullRequest
2 голосов
/ 21 апреля 2011

Мне нужно проверить много (~ 10 миллионов) URL-адресов, чтобы увидеть, существуют ли они (вернуть 200).Я написал следующий код, чтобы сделать это для каждого URL-адреса, но для выполнения всех URL-адресов понадобится примерно вечность.должен быть в состоянии использовать это, чтобы направить мои запросы и уменьшить накладные расходы на соединение.Как бы вы это построили?Я открыт для любого языка программирования / написания сценариев.

Ответы [ 2 ]

2 голосов
/ 21 апреля 2011

Все это в 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()

Теперь, если urllist содержит ваши URL, ваш основной файл должен выглядеть следующим образом:

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().

2 голосов
/ 21 апреля 2011

Посмотрите на urllib3 . Он поддерживает повторное использование соединения для каждого хоста. Кроме того, было бы неплохо использовать несколько процессов / потоков или асинхронный ввод-вывод.

...