Северенс Ч. - Введение в программирование на Python - 2016. Введение в программирование на Python Ч. Северенс М. Национальный Открытый Университет "интуит", 2016
Скачать 0.65 Mb.
|
Протокол передачи гипертекста- НТГРСетевой протокол, на котором основана вся мощь Интернет, на самом деле совсем простой, и его поддержка встроена в Питон - это так называемый механизм сокетов, пользуясь которым , совсем несложно устанавливать сетевые соединения и получать данные из сети в программах Питона. Сокет в основном аналогичен файлу, за тем исключением, что он обеспечивает двустороннее соединение между двумя программами. Вы можете как читать, так и записывать данные по одному и тому же сокету. Если вы что-то пишете в сокет, то эти данные передаются по сети парному приложению, работающему на другом конце сокета. Если вы читаете из сокета, то получаете данные, которые парное приложение послало вам. Но если вы пытаетесь прочесть данные, когда парное приложени е на другом конце сокета еще ничего не послало - вы попросту ничего не делаете и ждёте. Если приложения на обоих концах сокета ждут прихода данных, не посылая ничего, то они будут жда ть очень долго. Поэтому для программ, взаимодействующих через Интернет, очень важно придерживаться некоторого протокола. Протокол - это набор четких правил, которые определяют, кто должен начинать обмен, какими должны быть ответы на полученные сообщения, кто должен посылать следующее сообщение и т.п. В некотором смысле два приложения на концах сокета совместно исполняют танец и не должны наступать на ноги друг другу. Существует множество документов, описывающих подобные сетевые протоколы. Протокол передачи гипертекста приводится в следующем документе : ссы лка: http-J/ www.w3.org/Protocols/rfc2616 /rfc2616. txt. Это длинный и сложный 176-страничный документ с множеством деталей. Если вам интересно, можете прочитать его. Но если прочитать лишь страницу 36 стандарта RFC2616, вы найдете описание синтаксиса запроса GЕТ. Более точно, вы прочитаете, что для получения документа от неб-сервера нужно установить соединение с сервером по адресу www.py4inf.com и порту 80 и передать ему текстовую строку вида: GET httpJ/www.py4inf.co ш/code/romeo.txt НТГР/1.0 Здесь второй параметр - это адрес запрашиваемой неб-страницы; затем нужно послать также пустую строку. Веб-с ервер отвечает на запрос, посылая некото рую служебную ("заголовочную' ') информацию о запрашиваемом документе, пустую строку и затем содержимое документа. Самый простой в мире веб-браузер Наверное, самый простой способ продемонстрировать работу протокола НТГР - это написать программу, которая устанавливает соединение с неб-сервером, запрашивает документ в соответс твии с протоколом НТТР и печатает то, что в ответ присылает сервер. import socke t mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAМ) mysock.coппect(('www.py4inf.com', 80)) mysock.seпd('GET httpJ/www.py4n1f.co m/code/romeo.txt НТГР/1.0\п\п') wl1ile True: data = mysock.recv(S12) if ( leп(data) < 1): break priпt data mysock.close() Сначала программа устанавливает соединение по порту 80 с сервером на узле www.py4iпf.com Поскольку наша программа исполняет роль ''веб браузера", п ротокол НТТР предписывает послать кома нду GET и затем пустую строку. Наш компьютер Веб сервер Опrравка Получ ени е..-, Со:кет 80 \V\V\V_p y 4 i n f. co m ВебC'"llipaLHHЦ Ы . . После посылки пустой строки следует цикл, который принимает данные из сокета порциями по 512 символов и печатает их до тех пор, пока не останется непрочитанных данных (т.е. функцияr e c v () не ве рнёт пустую строку). На выходе программы получаем: НТТР/1.1 200 ОК Date: Sш1, 14 Маг 2010 23:52:41 GMT Server: Apache Last- Modified: Tue, 29 Dec 2009 01:31:22 GMT ETag: "143cl b33-a7-4b395bea" Accept-Ranges: bytes Content-LeпgtЬ:167 Co nпection: close Content-Туре: text/p1arn But soft what light througl1 yonder wrndow breaks It is the east апd Juliet is the sш1 Arise fair suп and kill tЬе eпvious mооп Who is already sick and pale with grief Вывод программы начинается с заголовочной информации, которую сервер посылает для описания документа. Например, заголовочная строка Content-Туре указывает, что это простой текстовый документ (text/p1arn). После того, как сервер пересылает нам всю заголовочную информацию, он посылает пустую строку, отделяющую служебное описание документа от его содержимого, и дальше пересылает текст, содержащийся в файлеr ome o . t x t . Этот пример показывает, как устанавливается низкоуровневое соединение с помощью сокетов. Сокеты можно использовать для обмена с неб- сервером, сервером электронной почты и многими другими типами серверов. Всё, что требуется - это разыскать документ, который описывает протокол обме на, и записа ть программный код, пересылающий и принимающий данные в соответствии с этим протоколом. Однако, поско льку самый часто используемый протокол - это НТТР (протокол Всемирной паутины), Питон имеет специальную библиотеку, обеспечивающую поддержку протокола НТТР для получения документов и данных через Интернет. Получение библиотеки urllib веб-страниц с использованием Библиотека ur l l i b максимально упрощает получение веб-страниц и обработку их содержимого в программах Питона. Используя ur 11 i Ь, мы работаем с неб-страницами почти так же, как с файлами. Нужно всего лишь указать, какую неб-страницу мы хотим получить, дальше уже сама библиотека ur 1 1 i b отрабатывает все детали протокола НТТР. Э квивалентный код для чтени я файлаr o me o . txt из с е ти с помощью ur 1 1 i Ь записывается следующим образом: import urllib :fha пd = urlliЬ.urlopeп(Ъttp:/ /www .py4i пf.com/code/romeo.txt') for liпe iп :fha пd : priпt liпe.str ip() После того, как веб-страница открыта с помощью метода ur 1 1 i b . ur l o pe n, можно работать с ней как с файлом, читая ее содержимое в цикле f оr . На выходе программа выдает только содержимое файла. Заголовочная информация также пересылается, но код би бли отеки ur 11 i Ь проглатывает заголовки и возвращает нам только данные: But soft what light througl1yoпder wiпdow breaks It is the eas t and Juliet is the sш1 Arise fair suп апd kill tl1e e пvious mооп Who is already sick апd pale with grief Для примера можно написать программу, получающую содержимое файлаr o me o . txt и подсчитывающую частоту каждого слова в тексте: import urllib coш1ts = dic t() :fhaпd = urlliЬ. urlopeп(Ъttp://www.py4iпf.com/code/romeo.txt') for liпe iп :fha пd: words = liпe.s plit() for word iп words: coш1ts[word ] = co uпts.get(word, O) + 1 priпt co tmts Еще раз: как только мы открыли веб-страницу, можно читать ее точно так же, как и локальный файл на компьютере. Разбор HTML и извлечение информации из веб страниц (Web scraping) Очень часто возможности библиотеки: u r 1 1 i Ь Питона исполь зуются при извлечении информации во всемирной паугине (Web scraping). Мы пишем программу, которая притво ряется веб-браузером, получает Инте рнет-страницы и затем анализирует их содержимое, находя в них нужные текстовые шаблоны. Например, поисковая машина, подобная Google, начинает свою работу с какой-нибудь неб-страницы, извлекает из нее ссылки на другие страниц ы, получает по сети содержимое этих страниц, извлекает из них ссылки и так далее. Используя подобную технику, пауки Google п рокладывают свой пугь практически: через все страницы в сети. Google принимает частоту найденных подобным образом ссылок на конкретную неб-страниц у как меру "важности" этой страницы, определяющую, насколько высоко она будет пом ещена в ответах на поисковые запросы. Разбор НТМL-страниц с помощью регулярных выражений Один из самых простых способов анализа НТМL-страниц использов ание регулярных выражений для поиска и подстрок, соответствующих определенным шаблонам . простейшую неб-стран ицу: |