Форум сайта python.su
Есть желание переписать неколько своих проектов, которые работают через threads на асинхронные сокеты или же вообще использовать и потоки и сокеты, не суть.
Есть несколько вопросов:
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()
Офлайн
С asyncore почти все придется писать вручную, и в итоге ничего хорошего не получится. Но есть несколько вариантов:
заменить thread'ы в готовых проектах greenlet'ами (gevent)
grequests (gevent + requests)
Scrapy (придется поразбираться)
grab.Spider
tornado.httpclient
Офлайн
reclosedev
С asyncore почти все придется писать вручную, и в итоге ничего хорошего не получится. Но есть несколько вариантов:заменить thread'ы в готовых проектах greenlet'ами (gevent)grequests (gevent + requests)Scrapy (придется поразбираться)grab.Spidertornado.httpclient
Офлайн
antp1xС ними не работал, но и то и то смотрел, в grab.Spider побольше возможностей.
Если Вы работали с обоими решения, могли бы подсказать, что больше подходит для моих задач, более быстрое и с чем было бы проще выполнять запросы (имеется ввиду то, что я спросил в п2.2).
Офлайн
http://grablib.org/ - тут есть ссылки на публикации о Grab и Spider, тут документация по Spider http://docs.grablib.org/#grab-spider
Офлайн