Pythonlearn 12 HTTP
Pythonlearn 12 HTTP
Глава 12
• www.net-intro.com
Протокол управления передачей (TCP)
• Создан на основе IP (Интернет протокол)
http://www.flickr.com/photos/kitcowan/2103850699/
TCP соединения / Сокеты
«В сетевой архитектуре Интернет-сокет или сетевой-сокет —
это конечная точка двунаправленного меж-процессного
потока обмена данными в компьютерной сети, основанной на
Интернет Протоколе, такой как Интернет»
https://ru.wikipedia.org/wiki/Сокет_(программный_интерфейс)
Протокол TCP: Номера портов
• Порт — это конечная точка связи приложения или
процесса
https://ru.wikipedia.org/wiki/Порт_(компьютерные_сети)
www.umich.edu
Входящая 25
почта
бла-бла-
Логин 23 бла
74.208.28.177
80
Веб-сервер
443
Личный 109
почтовый
ящик 110
Клипарт: http://www.clker.com/search/networksym/1
Общеизвестные TCP-порты
https://ru.wikipedia.org/wiki/Список_портов_TCP_и_UDP
Иногда можно встретить
номер порта в адресе,
если сервер использует
«нестандартный» порт
Сокеты в Пайтон
Пайтон имеет встроенную поддержку сокетов TCP
import socket
mysock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
mysock.connect( ('data.pr4e.org', 80) )
Хост Порт
http://docs.python.org/library/socket.html
https://xkcd.ru/i/353_v1.png
Прикладные протоколы
Прикладной протокол
• TCP (и Пайтон) предоставляет
нам надежный сокет, но что мы
хотим с этим сокетом делать?
Какую проблему хотим решить?
• Прикладные протоколы:
https://ru.wikipedia.org/wiki/HTTP
HTTP
(Протокол передачи гипертекста)
Протокол Передачи Гипертекста — набор правил,
позволяющих браузерам получать веб-документы с
серверов через Интернет
Что такое протокол?
• Это свод правил, которым следуют все участники,
чтобы можно было предсказать поведение
каждого из участников
http://www.youtube.com/watch?v=x2GylLq59rI
Robert Cailliau
1:17 - 2:19 CERN
Получение данных с сервера
• Каждый раз, когда пользователь кликает на ссылку, имеющую
атрибут href = value (в качестве значения – адрес документа, на
который следует перейти), чтобы перейти на другую страницу,
браузер устанавливает соединение с веб-сервером и делает
запрос посредством метода “GET”, чтобы получить содержимое
страницы по указанному адресу
Браузер
Веб-сервер
80
Браузер
Клик по
ссылке
Запрос Веб-сервер
80
GET http://www.dr-chuck.com/page2.htm
Браузер
Клик по
ссылке
Запрос Веб-сервер
80
GET http://www.dr-chuck.com/page2.htm
Браузер
Клик по
ссылке
Запрос Ответ
Веб-сервер
80
<h1>Страница 2</h1>
<p>Перейти на <a
href="page1.htm">Страницу
1</a>.</p>
GET http://www.dr-chuck.com/page2.htm
Браузер
Клик по
ссылке
Запрос Веб-сервер Ответ
80
<h1>Страница 2</h1>
<p>Перейти на <a
href="page1.htm">Страницу
1</a>.</p>
GET http://www.dr-chuck.com/page2.htm
Браузер
Клик по Анализ/
ссылке Визуализация
Стандарты Интернета
• Стандарты для всех Интернет-
протоколов (внутренние механизмы)
разрабатываются организацией
• www.ietf.org
Источник: http://tools.ietf.org/html/rfc791
http://www.w3.org/Protocols/rfc2616/rfc2616.txt
Делаем HTTP-запрос
• Подключаемся к серверу, например, www.dr-chuck.com
HTTP/1.1 200 OK
Date: Thu, 08 Jan 2015 01:57:52 GMT
Last-Modified: Sun, 19 Jan 2014 14:25:43 GMT
Connection: close
Браузер
Content-Type: text/html
<h1>Страница 1</h1>
<p>Перейти на <a href="http://www.dr-chuck.com/page2.htm">Страницу 2</a>.</p>
Соединение закрыто внешним хостом.
Меткий хакинг в кино
• Матрица Перезагрузка
• Ультиматум Борна
• Крепкий орешек 4
• ...
http://nmap.org/movies.html
Напишем веб-браузер!
HTTP-запрос в Пайтон
import socket
while True:
data = mysock.recv(512)
if (len(data) < 1):
break
print(data.decode(),end='')
mysock.close()
HTTP/1.1 200 OK Заголовок HTTP-запроса
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" while True:
Accept-Ranges: bytes data = mysock.recv(512)
Content-Length: 167 if ( len(data) < 1 ) :
Connection: close break
Content-Type: text/plain print(data.decode())
https://ru.wikipedia.org/wiki/ASCII
http://www.catonmat.net/download/ascii-cheat-sheet.png
Представление простых строк
• Каждый символ представлен
числом от 0 до 256, хранящимся в
8 битах памяти >>> print(ord('H'))
72
• Мы называем 8 бит памяти >>> print(ord('e'))
«байтом» (например, мой диск 101
содержит 3 Терабайта памяти) >>> print(ord('\n'))
10
>>>
• Функция ord() сообщает нам
числовое значение простого
символа из таблицы ASCII
ASCII
>>> print(ord('H'))
72
>>> print(ord('e'))
101
>>> print(ord('\n'))
10
>>>
В 1960-х и 1970-х
считалось, что один байт
– это один символ
http://unicode.org/charts/
Многобайтовые символы
В связи с многообразием символов, которые должны обрабатываться компьютерами,
существуют символы, представленные более чем одним байтом
UTF-16: фиксированная длина — два байта https://ru.wikipedia.org/wiki/UTF-8
• UTF-32: фиксированная длина — четыре байта
• UTF-8: 1-4 байта:
- Полная обратная совместимость с ASCII;
- Автоматическое определение между ASCII и UTF-8;
- UTF-8 рекомендуется для кодирования данных,
которыми обмениваются системы.
Два вида строк в Пайтон
Python 2.7.10 Python 3.5.1
>>> x = ' 이광춘 ' >>> x = ' 이광춘 '
>>> type(x) >>> type(x)
<type 'str'> <class 'str'>
>>> x = u' 이광춘 ' >>> x = u' 이광춘 '
>>> type(x) >>> type(x)
<type 'unicode'> <class 'str'>
>>> >>>
while True:
data = mysock.recv(512)
if (len(data) < 1):
break
print(data.decode())
mysock.close()
https://docs.python.org/3/library/stdtypes.html#bytes.decode
https://docs.python.org/3/library/stdtypes.html#str.encode
decode() Байты recv()
Строка в UTF-8
Сокет Сеть
кодировке
Юникод Байты
encode() send()
UTF-8
import socket
while True:
data = mysock.recv(512)
if (len(data) < 1):
break
print(data.decode())
mysock.close()
Упрощение HTTP с помощью
модуля urllib
Использование urllib в Пайтон
Благодаря распространенности HTTP, у нас есть библиотека,
которая производит всю работу с сокетами и делает веб-
страницы похожими на файл
fhand = urllib.request.urlopen('http://data.pr4e.org/romeo.txt')
for line in fhand:
print(line.decode().strip())
urllib1.py
import urllib.request, urllib.parse, urllib.error
fhand = urllib.request.urlopen('http://data.pr4e.org/romeo.txt')
for line in fhand:
print(line.decode().strip())
fhand = urllib.request.urlopen('http://data.pr4e.org/romeo.txt')
counts = dict()
for line in fhand:
words = line.decode().split()
for word in words:
counts[word] = counts.get(word, 0) + 1
print(counts)
urlwords.py
Чтение веб-страниц
import urllib.request, urllib.parse, urllib.error
fhand = urllib.request.urlopen('http://www.dr-chuck.com/page1.htm')
for line in fhand:
print(line.decode().strip())
<h1>Страница 1</h1>
<p>Перейти на<a
href="http://www.dr-chuck.com/page2.htm">Страницу 2</a>.
</p>
urllib2.py
Следуем по ссылкам
import urllib.request, urllib.parse, urllib.error
fhand = urllib.request.urlopen('http://www.dr-chuck.com/page1.htm')
for line in fhand:
print(line.decode().strip())
<h1>Страница 1</h1>
<p>Перейти на <a
href="http://www.dr-chuck.com/page2.htm">Страницу 2</a>.
</p>
urllib2.py
Первые строки кода @ Google?
import urllib.request, urllib.parse, urllib.error
fhand = urllib.request.urlopen('http://www.dr-chuck.com/page1.htm')
for line in fhand:
print(line.decode().strip())
HTML-парсинг
(или веб-скрейпинг)
Что такое веб-скрейпинг?
• Программа или скрипт, притворяясь браузером, извлекает и
анализирует информацию с веб-страниц, а затем
отправляется по ссылкам на следующие страницы
https://ru.wikipedia.org/wiki/Веб-скрейпинг
https://ru.wikipedia.org/wiki/Поисковый_робот
Зачем нужен веб-скрейпинг?
• Извлечь данные, особенно из соц.сетей: кто на кого
ссылается?
https://www.crummy.com/software/BeautifulSoup/
Установка BeautifulSoup
# Вы можете установить BeautifulSoup, перейдя по ссылке:
# https://pypi.python.org/pypi/beautifulsoup4
...
urllinks.py
import urllib.request, urllib.parse, urllib.error
from bs4 import BeautifulSoup
python urllinks.py
Enter - http://www.dr-chuck.com/page1.htm
http://www.dr-chuck.com/page2.htm
Резюме
• TCP/IP создает для нас каналы / сокеты между приложениями