Вкусный responses html. Сумасшедшие формы

After receiving and interpreting a request message, a server responds with an HTTP response message:

  • A Status-line
  • Zero or more header (General|Response|Entity) fields followed by CRLF
  • An empty line (i.e., a line with nothing preceding the CRLF) indicating the end of the header fields
  • Optionally a message-body
  • The following sections explain each of the entities used in an HTTP response message.

    Message Status-Line

    A Status-Line consists of the protocol version followed by a numeric status code and its associated textual phrase. The elements are separated by space SP characters.

Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF

HTTP Version

A server supporting HTTP version 1.1 will return the following version information:

HTTP-Version = HTTP/1.1

Status Code

The Status-Code element is a 3-digit integer where first digit of the Status-Code defines the class of response and the last two digits do not have any categorization role. There are 5 values for the first digit:

S.N. Code and Description
1 1xx: Informational

It means the request was received and the process is continuing.

2 2xx: Success

It means the action was successfully received, understood, and accepted.

3 3xx: Redirection

It means further action must be taken in order to complete the request.

4 4xx: Client Error

It means the request contains incorrect syntax or cannot be fulfilled.

5 5xx: Server Error

It means the server failed to fulfill an apparently valid request.

HTTP status codes are extensible and HTTP applications are not required to understand the meaning of all registered status codes. A list of all the status codes has been given in a separate chapter for your reference.

Response Header Fields

We will study General-header and Entity-header in a separate chapter when we will learn HTTP header fields. For now, let"s check what Response header fields are.

The response-header fields allow the server to pass additional information about the response which cannot be placed in the Status- Line. These header fields give information about the server and about further access to the resource identified by the Request-URI.

  • Proxy-Authenticate

  • WWW-Authenticate

You can introduce your custom fields in case you are going to write your own custom Web Client and Server.

Examples of Response Message

Now let"s put it all together to form an HTTP response for a request to fetch the hello.htm page from the web server running on сайт

HTTP/1.1 200 OK Date: Mon, 27 Jul 2009 12:28:53 GMT Server: Apache/2.2.14 (Win32) Last-Modified: Wed, 22 Jul 2009 19:15:56 GMT Content-Length: 88 Content-Type: text/html Connection: Closed

Hello, World!

The following example shows an HTTP response message displaying error condition when the web server could not find the requested page:

HTTP/1.1 404 Not Found Date: Sun, 18 Oct 2012 10:36:20 GMT Server: Apache/2.2.14 (Win32) Content-Length: 230 Connection: Closed Content-Type: text/html; charset=iso-8859-1 404 Not Found

Not Found

The requested URL /t.html was not found on this server.

Following is an example of HTTP response message showing error condition when the web server encountered a wrong HTTP version in the given HTTP request:

HTTP/1.1 400 Bad Request Date: Sun, 18 Oct 2012 10:36:20 GMT Server: Apache/2.2.14 (Win32) Content-Length: 230 Content-Type: text/html; charset=iso-8859-1 Connection: Closed 400 Bad Request

Bad Request

Your browser sent a request that this server could not understand.

The request line contained invalid characters following the protocol string.

Допустим, нам нужно получить данные с сайта, сбор которых вручную нецелесообразен или невозможен из-за объёма. В таком случае мы можем автоматизировать процесс, используя инструменты, описанные далее.

Библиотека requests

Python-библиотека для выполнения запросов к серверу и обработки ответов. Фундамент скрипта для парсинга и наше основное оружие. Пользуясь данной библиотекой мы получаем содержимое страницы в виде html для дальнейшего парсинга.

import requests response = requests . get ("https://ya.ru" ) # get-запрос print (response . text ) # вывод содержимого страницы payload = { "key1" : "value1" , "key2" : "value2" } response = requests . get ("http://httpbin.org/get" , params = payload ) # запрос с параметрами headers = { "user-agent" : "my-app/0.0.1" } response = requests . get (url , headers = headers ) # запрос с определенными html заголовками

API

Application programming interface - программный интерфейс приложения, предоставляемый владельцем веб-приложения для других разработчиков. Отсутствие API, способного удовлетворить наши нужды - первое в чем стоит убедиться прежде чем бросаться анализировать исходный код страницы и писать для нее парсер. Множество популярных сайтов имеет собственное api и документацию, которая объясняет как им пользоваться. Мы можем использовать api таким образом - формируем http-запрос согласно документации, и получаем ответ при помощи requests.

BS4

Beautifulsoup4 - это библиотека для парсинга html и xml документов. Позволяет получить доступ напрямую к содержимому любых тегов в html.

from bs4 import BeautifulSoup soup = BeautifulSoup (raw_html , "html.parser" ) print (soup . find ("p" , class_ = "some-class" ) . text ) # вывод содержимого тэга "p" классом "some-class"

Selenium Web Driver

Данные на сайте могут генерироваться динамически при помощи javascript. В таком случае спарсить эти данные силами requests+bs4 не удастся. Дело в том, что bs4 парсит исходный код страницы, не исполняя js. Для исполнения js кода и получения страницы, идентичной той, которую мы видим в браузере, можно использовать selenium web driver - это набор драйверов для различных браузеров, снабжающийся библиотеками для работы с этими драйверами.

А что делать, если там авторизация?

session = requests.Session() data = {"login_username":"login", "login_password":"password"} url = "http://site.com/login.php" response = session.post(url, data=data)

А что, если сайт банит за много запросов?

  • Установить задержку между запросами:

response = requests.get(url, timeout=(10, 0.01)) # таймаут на соединения, таймаут на чтение (в секундах)

  • Притвориться браузером, используя selenium web driver или передав содержимое заголовка user-agent, формируя запрос:

user_agent = ("Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:50.0) " "Gecko/20100101 Firefox/50.0") request = requests.get(url, headers={"User-Agent":user_agent})

  • Использовать прокси:

Для получения экземпляра этого класса используйте вызов метода wa()->getResponse() , например:

Wa()->getResponse()->getHeader("Content-type")

Методы

public function addCss ($url, $app_id = false )

Добавляет URL в список CSS-файлов. Все добавленные URL CSS-файлов могут быть получены в шаблоне Smarty с помощью метода {$wa->css()} .

Параметры

  • $url

    Относительный URL CSS-файла. Если указано значение параметра $app_id , то следует указать URL файла относительно URL директории с файлами соответствующего приложения. В противном случае относительный URL следует указывать относительно директории установка фреймворка.

  • $app_id

    Идентификатор приложения.

Пример

wa()->getResponse()->addCss("css/myapp.css", "myapp");

public function addGoogleAnalytics ($str )

Добавляет фрагмент JavaScript-кода для Google Analytics. Код Google Analytics (включая добавленный данным методом) подключается в HTML-шаблоне сайта с помощью метода {$wa->headJs()} .

Параметры

  • $str

    Фрагмент JavaScript-кода.

public function addHeader ($name, $value, $replace = true )

Добавляет заголовок, который будет отправлен сервером в ответ на запрос пользователя. Все добавленные таким способом заголовки, будут отправлены пользователю при выполнении метода .

Параметры

  • $name

    Наименование заголовка.

  • $value

    Значение заголовка.

  • $replace

    Флаг, обозначающий необходимость заменить ранее установленное значение для указанного заголовка.

Пример

wa()->getResponse()->addHeader("Content-type", "application/json");

public function addJs ($url, $app_id = false )

Добавляет URL в список JavaScript-файлов. Все добавленные URL JavaScript-файлов могут быть получены в шаблоне Smarty с помощью метода {$wa->js()} .

Параметры

  • $url

    URL файла с JavaScript-кодом. Если указано значение параметра $app_id , то следует указать URL файла относительно URL директории с файлами соответствующего приложения. В противном случае относительный URL следует указывать относительно директории установка фреймворка.

  • $app_id

    Идентификатор приложения.

Пример

wa()->getResponse()->addJs("js/myapp.js", "myapp");

public function getCss ($html = true, $strict = false )

Возвращает список ранее добавленных ссылок CSS-файлов.

Параметры

  • $html

    Флаг, обозначающий необходимость вернуть HTML-код подключения CSS-файлов. Если указано false , метод возвращает массив URL таких файлов.

  • $strict

    Флаг, обозначающий использование XHTML-формата вместо HTML, когда для параметра $html указано значение true .

Пример

wa()->getResponse()->getCss();

public function getHeader ($name = null )

Возвращает значение заголовка ответа.

Параметры

  • $name

    Идентификатор заголовка, значение которого необходимо вернуть. Если не указано, метод возвращает весь текущий массив заголовков.

Пример

wa()->getResponse()->addHeader("Content-type", "application/json"); wa()->getResponse()->getHeader("Content-type");

Результат

application/json

public function getJs ($html = true )

Возвращает список ссылок JavaScript-файлов ответа.

Параметры

  • $html

    Необязательный флаг, обозначающий необходимость вернуть HTML-код подключения JavaScript-файлов. В противном случае метод возвращает текущий массив URL файлов.

Пример

wa()->getResponse()->getJs();

public function getMeta ($name = null )

Возвращает содержимое МЕТА-данных: заголовок страницы ("title"), МЕТА-теги keywords ("keywords"), description ("description").

Параметры

  • $name

    Идентификатор элемента МЕТА-данных, значение которого необходимо вернуть. Если не указан, метод возвращает весь текущий массив МЕТА-данных.

Пример

wa()->getResponse()->getMeta("keywords");

public function getStatus ()

Возвращает ранее установленный статус ответа сервера.

Пример

wa()->getResponse()->setStatus(200); wa()->getResponse()->getStatus();

Результат

200

public function getTitle ()

Возвращает заголовок (TITLE) страницы.

Пример

wa()->getResponse()->setTitle("Мой интернет-магазин"); wa()->getResponse()->getTitle();

Результат

Мой интернет-магазин

public function redirect ($url, $code = null )

Выполняет перенаправление пользователя на указанный URL.

Параметры

  • $url

    URL, на который необходимо перенаправить пользоватвеля.

  • $code

    Код ответа сервера, которым должно сопровождаться перенаправлением.

Пример

wa()->getResponse()->redirect("http://otherdomain.ru/", 301);

public function sendHeaders ()

Выполняет отправку ранее установленных заголовков.

Пример

wa()->getResponse()->addHeader("Content-type", "application/json"); wa()->getResponse()->sendHeaders();

public function setCookie ($name, $value, $expire = null, $path = null, $domain = "", $secure = false, $http_only = false )

Устанавливает значение записи cookie с помощью PHP-функции setcookie .

Параметры

  • $name

    Идентификатор записи.

  • $value

    Значение записи.

  • $expire

    Время истечения срока действия.

  • $path

    Путь к «поддиректории» URI, в пределах которого действует значение записи.

  • $domain

    Доменное имя, для которого действиет значение записи.

  • $secure

    Флаг, обозначающий доступность записи только в случае передачи значения по протоколу HTTPS.

  • $http_only

    Флаг, обозначающий доступность значения записи только через протокол HTTP и недоступность средствами клиентских скриптов (JavaScript).

Пример

wa()->getResponse()->setCookie("code", $code, time() + 30 * 86400, null, "", false, true);

public function setMeta ($name, $value = null )

Устанавливает значение МЕТА-данных. Это значение доступно в шаблонах Smarty с помощью метода {$wa->meta()} .

Параметры

  • $name

    Идентификатор элемента МЕТА-данных: заголовок страницы ("title"), МЕТА-теги keywords ("keywords") и description ("description").

  • $value

    Значение элемента.

Пример

wa()->getResponse()->setMeta("keywords", $keywords);

public function setStatus ($code )

Устанавливает статус ответа сервера.

Параметры

  • $code

    Код статуса

Пример

wa()->getResponse()->setStatus(404);

public function setTitle ($title )

Устанавливает заголовок (TITLE) страницы. Содержимое заголовка доступно в шаблонах Smarty с помощью метода {$wa->title()} .