Создайте Массу Асинхронных Запросов С Помощью Grequests

Запросы — это хорошо, но запросы — лучше.

Я не знаю лучшей и более эффективной библиотеки, которая могла бы быстро и элегантно выполнять HTTP-запросы, чем запросы; эта библиотека является несомненным лидером в этом плане.

Но поскольку асинхронность плохая, можно выполнять асинхронные запросы с помощью потоков или gevent. Написал grequests, тот же автор, который писал запросы.

Только с использованием запросов gevent +.

Не буду долго останавливаться на теме, дам подробную информацию об этой библиотеке.

Запросы — это асинхронная оболочка над обычными запросами.

Давайте сделаем обычный POST-запрос ко многим URL-адресам:

  
  
  
  
  
   

import grequests with open("C:\\path\\urls.txt") as werewolves: array = [row.strip() for row in werewolves] params = {'a':'b', 'c':'d'} rs = [grequests.post(u, data=params) for u in array] for r in grequests.imap(rs, size=16) print(r[0].

status_code, r[0].

url)

Все довольно просто, библиотека импортируется, файл открывается на чтение, создается список, переменной params присваиваются значения a:b, c:d. Далее создаем переменную rs, которая будет отвечать за сам POST-запрос, для переменной r создаем grequests.map([rs], size= — асинхронное значение, чем больше значение, тем быстрее будут выполняться http-запросы выполняется, хотя ставить больше 16 нет смысла).

Теперь, поскольку мы передали все аргументы в переменную r, то есть в grequests.imap(), мы можем взаимодействовать с этой переменной, как и в обычных запросах.

И последний шаг нам нужно отобразить весь код статуса, url адрес, также rs выступает в роли списка, делаем это чтобы не было ошибок индексации по типам:

TypeError: 'Response' object does not support indexing

Если вы по-прежнему получаете отслеживание с этой ошибкой, я предлагаю этот вариант:

def exception_handlerr(request, exception): print("Request failed", request.url) import grequests with open("C:\\path\\urls.txt") as werewolves: array = [row.strip() for row in werewolves] params = {'a':'b', 'c':'d'} rs = [grequests.post(u, data=params) for u in array] for r in grequests.map([rs], size=16, exception_handler=exception_handlerr) print(r[0].

status_code, r[0].

url)

Теперь мы также будем обращаться к переменной r как к списку, чтобы избежать ошибок индексации.

Мы сделали основные шаги.

Вы можете «ДУДОСЕТЬ» сервер.

Хотя заоблачной асинхронности в этой библиотеке нет. Вы можете взглянуть на это Айоhttp .

Еще хотелось бы поговорить об исключениях в grequests. Так как grequests не использует классы ошибок из запросов, а делает это следующим образом:

def send(self, **kwargs): """ Prepares request based on parameter passed to constructor and optional ``kwargs```.

Then sends request and saves response to :attr:`response` :returns: ``Response`` """ merged_kwargs = {} merged_kwargs.update(self.kwargs) merged_kwargs.update(kwargs) try: self.response = self.session.request(self.method, self.url, **merged_kwargs) except Exception as e: self.exception = e self.traceback = traceback.format_exc() return self

Перехватываем с помощьюException_handler:

def exception_handlerr(request, exception): print("Request failed", request.url) # print(str(exception))

Полный исходный код:

def exception_handlerr(request, exception): print("Request failed", request.url) import grequests with open("C:\\path\\urls.txt") as werewolves: array = [row.strip() for row in werewolves] params = {'a':'b', 'c':'d'} rs = [grequests.post(u, data=params) for u in array] for r in grequests.map([rs], size=16, exception_handler=exception_handlerr) print(r.status_code, r.url)

Таким образом, мы можем с полной уверенностью обнаруживать ошибки.

С GET-запросами все так же просто, как и с POST-запросами:

def exception_handlerr(request, exception): print("Request failed", request.url) import grequests with open("C:\\path\\urls.txt") as werewolves: array = [row.strip() for row in werewolves] rs = [grequests.get(u) for u in array] for r in grequests.map([rs], size=16, exception_handler=exception_handlerr) print(r.status_code, r.url)

исходный код запросов запрашивает документацию Хорошего дня! Теги: #python #асинхронные #запросы #python

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.