Найти - Пользователи
Полная версия: Асинхронные сокеты, клиент
Начало » Network » Асинхронные сокеты, клиент
1
antp1x
Есть желание переписать неколько своих проектов, которые работают через 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()
reclosedev
С asyncore почти все придется писать вручную, и в итоге ничего хорошего не получится. Но есть несколько вариантов:
заменить thread'ы в готовых проектах greenlet'ами (gevent)
grequests (gevent + requests)
Scrapy (придется поразбираться)
grab.Spider
tornado.httpclient
antp1x
reclosedev
С asyncore почти все придется писать вручную, и в итоге ничего хорошего не получится. Но есть несколько вариантов:заменить thread'ы в готовых проектах greenlet'ами (gevent)grequests (gevent + requests)Scrapy (придется поразбираться)grab.Spidertornado.httpclient

Спасибо большое за сообщение.
По поводу grab.Spider и Tornado много слышал, сейчас пойду поищу информацию по поводу них.

Если Вы работали с обоими решения, могли бы подсказать, что больше подходит для моих задач, более быстрое и с чем было бы проще выполнять запросы (имеется ввиду то, что я спросил в п2.2).
reclosedev
antp1x
Если Вы работали с обоими решения, могли бы подсказать, что больше подходит для моих задач, более быстрое и с чем было бы проще выполнять запросы (имеется ввиду то, что я спросил в п2.2).
С ними не работал, но и то и то смотрел, в grab.Spider побольше возможностей.

Сам использую grequests для мелких и Scrapy для крупных вещей.
lorien
http://grablib.org/ - тут есть ссылки на публикации о Grab и Spider, тут документация по Spider http://docs.grablib.org/#grab-spider
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB