боте с сетями, и Python старается соответствовать другим языкам программирования. Проект
Apache, чей веб-сервер вы видели в пункте «Apache» раздела «Веб-сервер» главы 9, также
поддерживает проект ActiveMQ (https://activemq.apache.org/), включающий в себя несколько
интерфейсов Python, использующих простой текстовый протокол STOMP (http://stomp.github.io/
implementations.html). Популярна также библиотека RabbitMQ (http://www.rabbitmq.com/),
вы можете прочесть онлайн-руководство для нее (http://bit.ly/rabbitmq-tut).
Scapy
Иногда вам нужно погрузиться в поток данных, путешествующих по сети. Возмож-
но, вы хотите отладить API для веба или отследить какую-то проблему с безопас-
ностью. Библиотека Scapy — это отличный инструмент для того, чтобы исследовать
332
Глава 11. Конкуренция и сети
пакеты, работать с ней гораздо проще, чем писать и отлаживать программы, на-
писанные на языке С. Библиотека является небольшим языком программирования
для создания и анализа пакетов.
Я планировал включить в эту книгу примеры исходного кода, но передумал по
двум причинам.
Библиотека Scapy еще не была портирована на Python 3. Раньше это нас не оста-
навливало, мы использовали pip2 и python2, но…
Инструкция по установке библиотеки Scapy (http://bit.ly/scapy-install), по моему
мнению, слишком устрашающая для книги, предназначенной начинающим.
Если хотите, то можете взглянуть на примеры кода на основном сайте с доку-
ментацией (http://bit.ly/scapy-docs). Они могут вдохновить вас на установку этой
библиотеки.
Наконец, не путайте библиотеки Scapy и Scrapy, последняя была рассмотрена
в подразделе «Поиск и выборка данных» раздела «Веб-сервисы и автоматизация»
главы 9.
Интернет-службы
Python имеет широкий набор инструментов для работы с сетями. В следующих
разделах мы рассмотрим способы автоматизации наиболее популярных интернет-
служб. В сети доступна полная официальная документация (http://bit.ly/py-internet).
Доменная система имен
Компьютеры имеют числовые IP-адреса вроде 85.2.101.94, но имена мы запоминаем
лучше, чем числа. Доменная система имен (Domain Name System, DNS) — это кри-
тически важная интернет-служба, которая преобразует IP-адреса в имена и обратно
с помощью распределенной базы данных. Когда вы используете браузер и внезапно
видите сообщение вроде looking up host, вы, возможно, потеряли соединение с Интер-
нетом, и первым предположением должно стать то, что произошла ошибка DNS.
Некоторые функции DNS можно найти в низкоуровневом модуле socket. Функ-
ция gethostbuname() возвращает IP-адрес доменного имени, а ее расширенная версия
gethostbyname_ex() возвращает имя, список альтернативных имен и список адресов:
>>> import socket
>>> socket.gethostbyname('www.crappytaxidermy.com')
'66.6.44.4'
>>> socket.gethostbyname_ex('www.crappytaxidermy.com')
('crappytaxidermy.com', ['www.crappytaxidermy.com'], ['66.6.44.4'])
Метод getaddrinfo() ищет IP-адрес, но также возвращает достаточное количество
информации для того, чтобы создать сокет, который с ним соединится:
>>> socket.getaddrinfo('www.crappytaxidermy.com', 80)