Есть несколько вопросов:
1. Какую библиотеку выбрать, учитывая, что запросы нужны не только GET, но и POST и передача кукисов и т.п.
2. Пока что нашел asyncore и есть несколько вопросов по ней:
2.1. Как ловить экцепшины, причем надо это делать так, чтобы фейлилась не вся пачка запросов. Т.е. к примеру мы выполняем параллельно 100запросов, если один из них вызывает ошибку, то надо, чтобы все остальные запросы не прерывались.
2.2. Есть скрипты, где надо смотреть, что отдает приложение и в зависимости от ответа выполнять либо один запрос, либо другой, как это лучше реализовать. Я лишь вижу пока что один вариант: Создать словарь, где в кач-ве ключа указывать допустим host или даже лучше host+path и далее после выполнения asyncore.loop() распаршивать эти результаты и в зависимости от результата добавлять или не добавлять другой запрос с этим же сайтом в список clients
Мой код:
# -*- coding: utf-8 -*- import asyncore, socket class HTTPClient(asyncore.dispatcher): def __init__(self, typez, host, path): asyncore.dispatcher.__init__(self) self.create_socket(socket.AF_INET, socket.SOCK_STREAM) self.result = '' if (typez=='GET'): self.connect( (host, 80) ) self.buffer ='GET %s HTTP/1.0\r\nHost:%s\r\n' % (path, host) self.buffer += 'User-Agent:%s\r\n' % 'testtest' self.buffer += 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n' self.buffer += 'Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3\r\n' self.buffer += 'Accept-Encoding: gzip, deflate\r\n' self.buffer += 'Referer:%s\r\n' % 'http://google.com' self.buffer += 'Connection: close\r\n\r\n' def handle_connect(self): pass def handle_close(self): self.close() def handle_read(self): self.result += self.recv(8192) def writable(self): return (len(self.buffer) > 0) def handle_write(self): sent = self.send(self.buffer) self.buffer = self.buffer[sent:] clients = [] # Генерируем 100запросов for x in xrange(0, 100): clients.append( ('GET', 'ya.ru', '/') ) while clients: #Берем по 10запросов, которые будем выполнять параллельно for x in xrange(0, 10): CurrClient = clients.pop() WebClient = HTTPClient(CurrClient[0], CurrClient[1], CurrClient[2]) # Выполняем всю (10) пачку запросов asyncore.loop()