Опубликован: 14.06.2015 | Доступ: свободный | Студентов: 4653 / 500 | Длительность: 21:48:00
Авторские права: Creative Commons Attribution 3.0
Лекция 12:

Сетевые программы

Смотреть лекцию на: ИНТУИТ | youtube.com

Если проблемы с видео, нажмите выше ссылку youtube

Get Adobe Flash Player

По ссылке youtube выложено видео с русскими титрами.

Хотя большая часть примеров в этой книге до сих пор фокусировалась на чтении файлов и поиске данных в них, есть много других источников информации, и важнейший из них – Интернет.

В этой главе мы попробуем исполнить роль веб-браузера и получить веб-страницу, используя протокол передачи гипертекста HTTP (HyperText Transport Protocol). Затем мы прочитаем содержимое страницы и осуществим его разбор.

23.1. Протокол передачи гипертекста – HTTP

Сетевой протокол, на котором основана вся мощь Интернет, на самом деле совсем простой, и его поддержка встроена в Питон – это так называемый механизм сокетов, пользуясь которым, совсем несложно устанавливать сетевые соединения и получать данные из сети в программах Питона.

Сокет в основном аналогичен файлу, за тем исключением, что он обеспечивает двустороннее соединение между двумя программами.

Вы можете как читать, так и записывать данные по одному и тому же сокету. Если вы что-то пишете в сокет, то эти данные передаются по сети парному приложению, работающему на другом конце сокета. Если вы читаете из сокета, то получаете данные, которые парное приложение послало вам. Но если вы пытаетесь прочесть данные, когда парное приложение на другом конце сокета еще ничего не послало – вы попросту ничего не делаете и ждёте. Если приложения на обоих концах сокета ждут прихода данных, не посылая ничего, то они будут ждать очень долго.

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

Существует множество документов, описывающих подобные сетевые протоколы. Протокол передачи гипертекста приводится в следующем документе: http://www.w3.org/Protocols/rfc2616/rfc2616.txt.

Это длинный и сложный 176-страничный документ с множеством деталей. Если вам интересно, можете прочитать его. Но если прочитать лишь страницу 36 стандарта RFC2616, вы найдете описание синтаксиса запроса GET. Более точно, вы прочитаете, что для получения документа от веб-сервера нужно установить соединение с сервером по адресу http://www.py4inf.com и порту 80 и передать ему текстовую строку вида:

GET http://www.py4inf.com/code/romeo.txt
HTTP/1.0
  

Здесь второй параметр – это адрес запрашиваемой веб-страницы; затем нужно послать также пустую строку. Веб-сервер отвечает на запрос, посылая некоторую служебную ("заголовочную") информацию о запрашиваемом документе, пустую строку и затем содержимое документа.

23.2. Самый простой в мире веб-браузер

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

import socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect(('www.py4inf.com', 80))
mysock.send('GET http://www.py4inf.com/code/romeo.txt HTTP/1.0\n\n')

while True:
data = mysock.recv(512)
if ( len(data) < 1 ) :
break
print data
mysock.close()
  

Сначала программа устанавливает соединение по порту 80 с сервером на узле http://www.py4inf.com. Поскольку наша программа исполняет роль "веб-браузера", протокол HTTP предписывает послать команду GET и затем пустую строку.


После посылки пустой строки следует цикл, который принимает данные из сокета порциями по 512 символов и печатает их до тех пор, пока не останется непрочитанных данных (т.е. функция recv() не вернёт пустую строку).

На выходе программы получаем:

HTTP/1.1 200 OK
Date: Sun, 14 Mar 2010 23:52:41 GMT
Server: Apache
Last-Modified: Tue, 29 Dec 2009 01:31:22 GMT
ETag: "143c1b33-a7-4b395bea"
Accept-Ranges: bytes
Content-Length: 167
Connection: close
Content-Type: text/plain
But soft what light through yonder window breaks
It is the east and Juliet is the sun
Arise fair sun and kill the envious moon
Who is already sick and pale with grief
  

Вывод программы начинается с заголовочной информации, которую сервер посылает для описания документа. Например, заголовочная строка Content-Type указывает, что это простой текстовый документ (text/plain). После того, как сервер пересылает нам всю заголовочную информацию, он посылает пустую строку, отделяющую служебное описание документа от его содержимого, и дальше пересылает текст, содержащийся в файле romeo.txt.

Этот пример показывает, как устанавливается низкоуровневое соединение с помощью сокетов. Сокеты можно использовать для обмена с веб-сервером, сервером электронной почты и многими другими типами серверов. Всё, что требуется – это разыскать документ, который описывает протокол обмена, и записать программный код, пересылающий и принимающий данные в соответствии с этим протоколом. Однако, поскольку самый часто используемый протокол – это HTTP (протокол Всемирной паутины), Питон имеет специальную библиотеку, обеспечивающую поддержку протокола HTTP для получения документов и данных через Интернет.

Ксения Шошина
Ксения Шошина

курс Программирование на Python

Илья Кизилов
Илья Кизилов

В лекции приводится программа для сортировки слов по их длинне. В коде ошибка. Я исправил так:

def sort_by_length(words):

words = words.split()

t = []

for word in words:

t.append((len(word), word))

t.sort(reverse=True)

res = []

for length, word in t:

res.append(word)

return res

print(sort_by_length(words))

 

Кто ещё как сделал?

 

Геннадий Шестаков
Геннадий Шестаков
Беларусь, Орша
Андрей Микульский
Андрей Микульский
Молдова, Республика, Комрат, Комратский Государственный Университет