Monday, January 23, 2012

http://devpro.md/python-for-web-52.html

http://devpro.md/python-for-web-52.html

Эта статья – краткое описание того, как можно использовать Python для веб. Есть много способов работы с WWW при помощи языка Python, и эта статья рассмотрит все из них. Рассмотрение включает в себя web-scraping, взаимодействие с API и создание веб-сайта, написанного на Python. Есть множество вариантов, как это сделать с помощью Python, но я собираюсь показать Вам, как это сделать правильно, используя самые современные методы и техники.

Взаимодействие с сайтами и API с помощью Python


Лучший и единственный пакет для работы с интернет-страницами с помощью Python – это 'Requests' Кеннета Райтца. Мое мнение – это отличная библиотека. Я использую ее каждый день, и я просто в восторге от нее. Эта библиотека – одна из тех вещей, что делают Python — лучшим языком для Интернета.
Сначала вам надо установить эту библиотеку. Лучший способ сделать это – использовать «pip» (python package manager) – пакетный менеджер Python. Если у вас нет «pip» — следуйте инструкциям из этой статьи, или, если вы на Win-платформе – почитайте этот пост на Stack Overflow 
После того, как установите pip, запустите:

  1. pip install requests

Библиотека Requests установлена! Возможно вам нужно будет запустить эту команду как 'sudo' если вы на Linix-е или OSX. Теперь давайте рассмотрим несколько примеров.
Вам понадобятся 2 метода – GET и POST. GET – достает документ – веб-страницу, а POST – шлет информацию на страницу.

Сначала рассмотрим GET. Допустим нам нужно вытащить полностью главную страницу сайта Gun.io.

  1. import requests
  2. r = requests.get('http://gun.io')
  3. print r.content

Вот и все! Три строчки на Python – и вы можете вытащить веб-страницу целиком и распечатать ее содержимое на экран. Здорово!
Теперь давайте рассмотрим более сложный пример. Возьмем случай, когда нам нужно залогиниться. 

  1. import requests
  2. r = requests.get('https://api.github.com', auth=('YOURUSERNAME', 'PASSWORD'))
  3. print r

Тут, YOURUSERNAME и YOURPASSWORD будут отосланы логин и пароль на сервер. 
Теперь попробуем создать POST запрос, чтобы послать некоторые данные на сервер. Это подойдет для случая, когда вам нужно заполнить форму на веб-странице с помощью Python. 

  1. import requests
  2. url = 'https://testexample.com/form'
  3. data={'title': 'RoboCop', 'description': 'The best movie ever.'}
  4. r = requests.post(url, data=data)
  5. print r

Этот код пошлет значения «RoboCop» и «The best movie ever.» для полей «title» и «description» соответственно. Если вам нужно засабмитить форму защищенную логином и паролем — можно использовать параметр 'auth' из предыдущего примера. 
Обработка JSON в Python 
Очень часто при работе с API в Python, ответ вам придёт в форме JSON (JavaScript Object Notation). Лучший способ взаимодействия с JSON в Python является использование библиотеки 'simplejson' (документацию, для которой вы можете найти здесь). Опять же, используйте pip, чтобы установить ее:

  1. pip install simplejson
Рассмотрим пример: 
  1. import requests
  2. import simplejson
  3. r = requests.get('https://github.com/timeline.json')
  4. c = r.content
  5. j = simplejson.loads©
  6. for item in j:
  7. print item['repository']['name']

Этот код вытащит список последних событий из GitHub в формате JSON, распарсит JSON и присвоит результат переменной j. Переменная j – это словарь, по которому мы можем пройтись и распечатать его содержимое. В нашем случае, код распечатает имя каждого репозитория для 
каждого события попавшего в ответ от сервера.

Web-Scraping используя Python


К сожалению, работа в вебе не всегда происходит в удобном формат, таком как JSON. Обычно веб-сайты возвращают только HTML, который ваш браузер отображает в виде красивых страниц. В этом случае нам нужно делать то, что называют scraping (т.е. берем HTML и превращаем его данные удобного для Python формата) 
Лучший способ это сделать – использовать пакет LXML. Я бы описал LXML двумя словами – херовый и отличный. LXML – очень быстрый и мощный, но у него также запутанный интерфейс и довольно неудачная документация. Определенно, это лучший инструмент для работы, но он явно не без греха.

Допустим, есть веб-страница из которой вам нужно достать некоторое значение в вашу программу на Python. Вы смотрите внутрь исходного кода веб-страницы и видите, что нужное значение находится внутри элемента с особым id атрибутом. Давайте используем LXML, чтобы достать это значение.
Сначала, установим LXML:

  1. pip install lxml

Так, теперь в бой. 

  1. import requests
  2. import lxml
  3. from lxml import html
  4. r = requests.get('http://gun.io')
  5. tree = lxml.html.fromstring(r.content)
  6. elements = tree.get_element_by_id('frontsubtext')
  7. for el in elements:
  8. print el.text_content()

Этот код использует также библиотеку Requests чтобы достать нашу страницу. Затем, мы используем HTML-парсер из LXML чтоб вытащить дерево обработанных HTML-элементов. Следующая строка вызывает функцию «Get Element By Id» чтобы вернуть список всех элементов, у которых значение атрибута id = «frontsubtext». Затем, мы пробегаем по элементами списка, и печатаем содержимое каждого элемента. Ура! 




Веб-сайта на Python


Другая область применения Python – это использование для создания веб-сайтов. Лучше всего использовать для этого веб-фреймворк Django
Django – бывает довольно мудреным. Использовать Django – не самый быстрый и легкий способ создания сайтов, но у Django – самое большое сообщество и самая лучшая документация. Таким образом, в итоге – это лучший инструмент для создания сайтов. Мы сделаем совсем краткое введение в Django – я просто научу вас как заставить ваш код на Python возвращать результат в виде HTML страницы.
Итак, начнем!
Для начала, установим Django с помощью pip. 

  1. sudo pip install django

Так, теперь Django установлен в вашей системе. Давайте создадим новый проект Django. Допустим, нам нужно создать сайт, который будет возвращать прописными буквами строку, которую мы будем ему передавать. Назовем его UppercaseMaker. Итак, чтобы создать новый проект Django, выполним: 

  1. django-admin.py startproject UppercaseMaker

Затем, перейдем в папку, которая была создана: 
  1. cd UppercaseMaker
Там находятся несколько файлов, такие как settings.py и urls.py. Мы к ним еще вернемся. Теперь, когда мы внутри папки, нам нужно создать новое «приложение». В Django – приложение – это то место, где происходит выполнение некоторых действий. Давайте создадим приложение 'upper'. 

  1. django-admin.py startapp upper

Чтобы активировать это приложение в проекте Django, нам надо отредактировать settings.py и добавить его в список INSTALLED_APPS (установленых приложений). Таким образом, вам нужно изменить файл the settings.py чтобы он выглядел следующим образом: 

  1. INSTALLED_APPS = (
  2. 'django.contrib.auth',
  3. 'django.contrib.contenttypes',
  4. 'django.contrib.sessions',
  5. 'django.contrib.sites',
  6. 'django.contrib.messages',
  7. # Uncomment the next line to enable the admin:
  8. # 'django.contrib.admin',
  9. # Uncomment the next line to enable admin documentation:
  10. # 'django.contrib.admindocs',
  11. 'UppercaseMaker.upper',
  12. )

Там же нужно отредактировать значение переменной TEMPLATE_DIRS чтобы она выглядела вот так: 

  1. import os
  2. TEMPLATE_DIRS = (
  3. os.path.join(os.path.dirname(__file__), 'templates'),
  4. )

Когда Django нужно отрисовать шаблон, он будет искать шаблоны в папке 'templates' которая находится в папке вашего проекта. 
В папке вашего проекта есть папка 'upper'. Давайте посмотрим, что внутри нее. Там есть файл 'views.py' – вот где происходит вся магия. Давайте добавим туда немного кода. 

  1. from django.shortcuts import render_to_response
  2. def home(request, input="No input supplied"):
  3. output = input.upper()
  4. return render_to_response('home.html', {'output': output})

Мы определяем функцию 'home' которая принимает 2 параметра — 'request', который содержит информацию о запросе, посланном на сервер (информация о пользователе, его браузере и тд), и строке 'input', со значением по умолчанию = «No input supplied.» В следующей строке входящая строка преобразовывается прописным буквам и присваивается переменной output. 
Затем мы передаем это в функцию «render_to_response», которая наполняет файл шаблона переменными из словаря и превращает их в красивый HTML. Мы еще не смотрели файл шаблона, давайте же сейчас посмотрим что у него внутри. 
Вернитесь к папке проекта и создайте внутри нее новую папку с именем 'templates', а внутри нее создайте файл 'home.html' с вот таким кодом: 

  1. <html>
  2. <head><title>{{output}}</title></head>
  3. <body>
  4. Your output is: {{output}}.
  5. </body>
  6. </html>

Это очень простая HTML страница, которая берет любое значение, которое мы присваиваем переменной 'output' из нашего файла views.py и выводите его между двойными фигурными скобками. 
Осталось еще кое-что. Давайте посмотрим на файл urls.py в папке проекта. Добавьте следующий код в этот файл: 

  1. from django.conf.urls.defaults import patterns, include, url
  2. urlpatterns = patterns('',
  3. url(r'^(?P<input>[^/]+)$', 'UppercaseMaker.upper.views.home'),
  4. )

Это указывает, что для пустого пути (пробел между '^' и '(' ), будет вызываться функция «UppercaseMaker.upper.views.home» и ей будет передаваться значение, которое будет присвоено переменной «input». И если кто-то зайдет на страницу «www.ourwebsite.com/test», значение «test» передается на функцию 'home', преобразуется к верхнему регистру и выводится на экран. 
Теперь вы можете попробовать это сами, запустите следующую команду из папки вашего проекта. 
python manage.py runserver
Затем, в браузере перейдите по адресу 'http://localhost:8000/test', и вы должны увидеть текст «Your output is: TEST.» 

Ура! Вы использовали Python для создания веб-сайта. Супер! 
Этот пример вы можете найти в 'git' репозитории, так что если вы хотите еще поковырять этот пример, выполните 
  1. git clone https://Gunio@github.com/Gunio/UppercaseMaker.git


Заключение


Итак, вы ознакомились с кратким введением в использование Python для работы в вебе. Эта статья ни в коем случае не претендует на полноту, но надеюсь вы теперь на правильном пути.
Основные выводы: для HTTP запросов, используйте библиотеку 'Requests'. Для парсинга JSON, используйте 'simplejson'. Для парсинга HTML, используйте 'LXML'. А для создания веб-сайтов — используйте 'Django'. В других статьях – вам скажут, что надо использовать такие тулзы как 'urllib2' и 'BeautifulSoup' – не тратьте ваше время!.. Эти пакеты, как и руководства, которые их рекомендуют – давно потеряли актуальность — Requests и LXML лучшие инструменты для работы. Django – также все еще лучший веб-фреймворк, но все же убедитесь, что любые руководства, которые вы будете читать – совместимы с вашей версией Django, так как этот фреймворк довольно стремительно развивается и в интернете полно устаревших учебников и книг по Django.

[Источник: http://gun.io, By Rich Jones]

No comments:

Post a Comment