Быстрый в изучении - мощный в программировании
>> Telegram ЧАТ для Python Программистов

Свободное общение и помощь советом и решением проблем с кодом! Заходите в наш TELEGRAM ЧАТ!

>> Python Форум Помощи!

Мы создали форум где отвечаем на все вопросы связанные с языком программирования Python. Ждем вас там!

>> Python Канал в Telegram

Обучающие статьи, видео и новости из мира Python. Подпишитесь на наш TELEGRAM КАНАЛ!

Программирование Web-клиента на языке Python

Программирование Web-клиента - мощная техника для создания запросов в Web. Web-клиент - это любая программа, извлекающая данные с Web-сервера при помощи протокола передачи гипертекста (Hyper Text Transfer Protocol, http в ваших URL). Web-броузер является клиентом, так же, как и поисковики, то есть программы, автоматически перемещающиеся по Web для сбора информации. Вы можете также применять Web-клиенты для использования возможностей сервисов, предлагаемых другими обитателями Web, и добавления динамических свойств в ваш собственный Web-сайт.

Программирование Web-клиента входит в любой набор инструментов для разработчиков. Приверженцы Perl'а используют его многие годы. В языке Python этот процесс достигает даже более высоких уровней удобства и гибкости. Большинство необходимых вам функций обеспечивается тремя модулями: HTTPLIB, URLLIB и новым дополнением, XMLRPCLIB. В истинно Питоновском стиле каждый модуль надстроен над своим предшественником, обеспечивая таким образом прочную, хорошо спроектированную базу для ваших приложений. В этой статье мы рассмотрим первые два модуля, оставив XMLRPCLIB на потом.

Для наших примеров мы будем использовать Meerkat. Если вы похожи на меня, вы тратите время на отслеживание тенденций и событий в среде создателей открытых программных средств, которые позволят вам получить конкурентные преимущества. Meerkat представляет собой инструмент, значительно упрощающий эту задачу. Это служба открытого доступа (an open wire service), собирающая и упорядочивающая огромные объемы информации по открытым программным средствам. Поскольку его интерфейс для браузера гибок и настраиваем, то, используя программирование web-клиента, мы можем сканировать, извлекать и даже сохранять эту информацию для последующего использования в автономном режиме. Сначала мы обратимся к Meerkat с помощью HTTPLIB в интерактивном режиме, а затем перейдем к работе с Meerkat's Open API через URLLIB, чтобы создать настраиваемое средство сбора информации.

HTTPLIB

HTTPLIB представляет собой простую обертку вокруг модуля socket. Из трех упомянутых мною библиотек, HTTPLIB обеспечивает наибольший контроль при обращении к web-сайту. Это дается, однако, за счет увеличения объема работы, необходимого для выполнения вашей задачи. Протокол http не имеет текущего состояния ("stateless") и поэтому ничего не помнит о ваших предыдущих запросах. При соединении с Web-сайтом для каждого запроса вы должны построить новый объект HTTPLIB. Эти запросы образуют диалог с Web-сервером, подражая Web-браузеру. Давайте интерактивно подсоединимся к Meerkat с помощью Open API Рейла Дорнфеста (Rael Dornfest) и посмотрим, что получится. Диалог начинается с построения серии предложений, определяющих сначала, какое действие вы хотите предпринять, а затем идентифицирующее вас для Web-сервера:

>>> import httplib
>>> host = 'www.oreillynet.com'
>>> h = httplib.HTTP(host)
>>> h.putrequest('GET', '/meerkat/?_fl=minimal')
>>> h.putheader('Host', host)
>>> h.putheader('User-agent', 'python-httplib')
>>> h.endheaders()
>>>

Запрос GET сообщает серверу, какую страницу вы хотите получить. Заголовок Host сообщает ему имя запрашиваемого вами домена. Современные сервера, использующие HTTP 1.1, могут иметь несколько доменов по одному и тому же адресу. Если вы не говорите им, какой домен вам нужен, в качестве кода возврата вы получите код переадресации '302'. Заголовок User-agent сообщает серверу, к какому типу клиента вы относитесь, чтобы знать, что он может вам посылать, а что нет. Это вся информация, необходимая для обработки вашего запроса Web-сервером. Далее вы запрашиваете ответ:

>>> returncode, returnmsg, headers = h.getreply()
>>> if returncode == 200: #OK
... f = h.getfile()
... print f.read()
...

В результате этого будет распечатана текущая страница Meerkat в минимальном виде. Заголовок отклика и содержимое возвращаются отдельно друг от друга, что помогает как в определении и устранении проблем, так и в разборе данных. Если вы хотите увидеть заголовки отклика, используйте print headers.

HTTPLIB скрывает механику программирования сокетов, и использование им файлового объекта для буферизации позволяет вам применять привычный подход к манипуляции данными. Тем не менее, лучше он подходит как базовый блок для построения более мощных Web?клиентских приложений или для интерактивного общения с проблемным Web-сайтом. Для использования в обеих этих областях, HTTPLIB оснащен полезной возможностью отладки. Доступ к ней вы получаете, вызывая метод h.set_debuglevel(1) в любой момент после инициализации объекта (строка h = httplib.HTTP(host) в нашем примере). С уровнем отладки 1, модуль будет дублировать на экран запросы и результаты любых обращений к getreply().

Интерактивная природа Python делает процесс анализа Web-сайтов с помощью HTTPLIB развлечением. Привыкните к этому модулю, и у вас будет мощный и гибкий инструмент для диагностики проблем Web-сайтов. Кроме того, потратьте время на то, чтобы просмотреть исходники HTTPLIB. HTTPLIB, содержащий менее 200 строк кода, - быстрое и простое вступление к программированию сокетов с использованием Python.

URLLIB

URLLIB обеспечивает изощренный интерфейс к функциональности HTTPLIB. Лучше всего использовать его непосредственно для получения данных, а не для анализа Web-сайта. Здесь представлено то же взаимодействие, что и выше, но с использованием URLLIB:

>>> import urllib
>>> u = urllib.urlopen('http://www.oreillynet.com/meerkat/?_fl=minimal')

Вот и все, что нужно сделать! Одной строкой вы обратились к Meerkat, получили данные и поместили их во временный кэш. Для доступа к заголовку:

>>> print u.headers
И для просмотра всего файла:
>>>print u.read()

Но это еще не все. В дополнение к HTTP, URLLIB может таким же образом обращаться к FTP, Gopher и даже к локальным файлам. Модуль содержит также множество вспомогательных функций, включая те, что используются для разбора url, кодирования строк в url-безопасный формат и обеспечения индикации хода процесса во время пересылки большого объема данных.

Пример использования Meerkat

Представьте, что у вас есть группа клиентов, ожидающих, что их будут информировать по почте о последних событиях, касающихся Linux. Мы можем написать короткий скрипт с использованием URLLIB для получения этой информации из Meerkat, построить список ссылок и сохранить эти ссылки в файл для последующей передачи. Автор Meerkat, Рэйел Дорнфест, уже сделал большую часть работы за нас в Meerkat API. Все, что нам осталось - это сконструировать запрос, разобрать ссылки и сохранить результаты для последующей передачи.

Зачем делать все это вместо того, чтобы просто отдать Meerkat на откуп пользователям? Обеспечение такого "пассивного" обслуживания дает пользователям возможность просматривать информацию на досуге и избирательно сохранять информацию в знакомом формате (например, в формате электронной почты). Получая новости в свой почтовый ящик утром в понедельник, они не пропустят информацию, прошедшую за выходные.

Поскольку минимальный вариант выборки Meerkat ограничен 15 новостями, мы будем запускать скрипт каждый час (например, как задание cron под Unix, или, используя команду AT под NT) для уменьшения вероятности потери данных. Вот url, который мы будем использовать (результаты использования этого URL вы можете посмотреть здесь).

Это объединит все новости о Linux (profile=5) за последний час, представляя данные в минимальном варианте, без описаний, информации о категории, канале и дате. Мы также используем модуль регулярных выражений, чтобы извлечь информацию о ссылках и перенаправить вывод в файловый объект, открытый в режиме добавления.

Вывод

Мы только коснулись поверхности этих модулей, а существуют еще множество других доступных для Python модулей сетевого программирования, которые могут быть использованы для задач, связанных с Web-клиентом. Программирование Web-клиента особенно полезно при обработке больших объемов табличных данных. Используя программирование Web-клиента в последнем проекте Обмена Электронными Данными (Electronic Data Interchange project), мы избежали использования громоздкого пакета патентованных программ. Мы извлекали необходимую нам обновленную информацию о ценах напрямую из Web и помещали ее в нашу базу данных. Это сэкономило нам массу времени и нервов.

Программирование Web-клиента может быть полезно и для тестирования структуры и целостности Web-сайтов. Наиболее распространенная процедура заключается в проверке неработающих ссылок. Стандартный дистрибутив Python включает в себя полный пример такой проверки, основанной на URLLIB. Webchecker вместе с основанным на Tk внешним интерфейсом можно найти в подкаталоге tools в дистрибутиве. Другой инструмент языка Python, Linbot, еще совершеннее. Он обеспечивает все, что вам нужно для решения проблем с Web-сайтом. По мере того, как сайты становятся все сложнее, другие Web-клиентские приложения становятся все необходимее для обеспечения качества вашего Web-сайта.

В программировании Web-клиента есть ловушка. Ваши программы часто чувствительны к небольшим изменениям в форматировании страниц. То, как сайт показывает свои данные сегодня, может отличаться от того, как он будет показывать их завтра. Когда изменяется формат, должны изменяться и ваши программы. Это одна из причин популярности XML: для данных в web, отмеченных тэгами, отражающими их значение, формат менее важен. По мере того, как стандарты XML будут развиваться и становиться общепринятыми, обработка XML-данных будет еще проще и надежнее.

Есть и некоторые ограничения в инструментах, которые мы здесь рассмотрели. Хотя они великолепно себя зарекомендовали при решении клиентских задач, модули HTTPLIB и URLLIB не могут использоваться для построения промышленного http-сервера, поскольку они обрабатывают запросы по одному. Для обеспечения асинхронной обработки, Сэм Рашинг создал впечатляющий набор инструментов, включающий asyncore.py, поставляющийся в составе стандартного дистрибутива Python. Самый сильный пример этого подхода - это ZOPE, сервер приложений, включающий в себя быстрый http-сервер, построенный с использованием ядра Medusa Сэма Рашинга.

В следующей статье я покажу вам, как вы можете соединить XML и программирование web-клиента, используя XMLRPCLIB. Вы можете использовать XML для извлечения гораздо большей функциональности из Meerkat API.

Если вы твердо уверены в желании сделать тату нужно сперва понять значение татушек, всеми любимое тату дракон может многое сказать про своего носителя стоит попробовать.