July 19, 2022

HTPP и сетевые запросы

https://yandex.ru/search/?text=что%20такое%20backend&lr=213

%20 - заменяет пробел т.к. в HTPP нет пробелов

Чтобы отправить правильный запрос можно использовать следующий код:

user_query = 'как стать бэкенд-разработчиком'

url = 'https://yandex.ru/search/?text=' 
user_query_str=user_query.split(' ') # разбиваем текст по пробелу
url2='%20'.join(user_query_str)      # объединяем текс по %20 

print(f'{url}{url2}')
# результат:
https://yandex.ru/search/?text=как%20стать%20бэкенд-разработчиком

Вопросы с кириллицей

Браузер автоматически перекодирует другие языки в латиницу. В ручную это можно сделать при помощи библиотеки import urllib.parse

import urllib.parse


strings = [
    'что такое backend',
    'Привет!',
    ' ',  # просто пробел
    'letiště',  # аэропорт по-чешски
    'München',  # крупнейший город Баварии
    'Champs-Élysées',  # Елисейские поля
    '東京',  # а это Токио, столица Японии  :)
]
for s in strings:
    encoded = urllib.parse.quote(s)  # зашифрованная строка
    decoded = urllib.parse.unquote(encoded)  # расшифрованная обратно строка
    print(decoded, '-', encoded)

что такое backend - %D1%87%D1%82%D0%BE%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B5%20backend
Привет! - %D0%9F%D1%80%D0%B8%D0%B2%D0%B5%D1%82%21
  - %20
letiště - leti%C5%A1t%C4%9B
München - M%C3%BCnchen
Champs-Élysées - Champs-%C3%89lys%C3%A9es
東京 - %E6%9D%B1%E4%BA%AC 

import urllib.parse

url = 'https://yandex.ru/search/?text=%D0%BA%D0%B0%D0%BA%20%D0%B1%D0%B5%D1%81%D0%BF%D0%BB%D0%B0%D1%82%D0%BD%D0%BE%20%D0%B5%D0%B7%D0%B4%D0%B8%D1%82%D1%8C%20%D0%BD%D0%B0%20%D1%82%D0%B0%D0%BA%D1%81%D0%B8'

# чтобы вычленить текст вопроса
# разбейте строку по знаку = и возьмите
# второй элемент получившегося списка 
# question =  # сохраните его в переменной question
# напечатайте на экран запрос в расшифрованном виде

split_query=url.split('=')
decode_query=urllib.parse.unquote(split_query[1])
print(decode_query)

Выше пример кода для расшифровки запросов.
-----------------------------------------------------------------------------------------

Запросы через Python

Запрос на сайт можно отправить в обход браузера. Ниже код:

import requests

response = requests.get('https://ya.ru/white') 
print(response.text) # печатаем текст запрошенной страницы

или

import requests

url = 'http://wttr.in/?0T'
response = requests.get(url)
print(response.text)

Если отправлять запрос через Python, то его придется сначала перекодировать, чтобы получилось вот так:
url = 'https://yandex.ru/search/?text=%D1%87%D1%82%D0%BE%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B5%20backend&lr=213'

Однако, это неудобно. Чтобы было легче, существует функция:

response = requests.get(url, params=search_parameters)

Пример:

import requests 

search_parameters = { 'text': 'что такое backend', 'lr': 213 }
url = 'https://yandex.ru/search/' 

# Функция get() приняла на вход URL и параметры поиска, 
# а дальше она знает, что делать 

response = requests.get(url, params=search_parameters) 

print(response.status_code) 
print(response.url)

В параметрах можно указать другие аргументы.
Например,
parameters = { 'u': '', 'T': '' }
u - переводит в формат английской метрической системы
T - возвращает черно-белый режим

import requests

url = 'https://wttr.in'  # не изменяйте значение URL
weather_parameters = {
    '0': '',
    'T': '',
    'M': '',
    'lang':'ru'
    # добавьте параметр запроса `T`, чтобы вернулся чёрно-белый текст
}

response = requests.get(url,params=weather_parameters)  
# передайте параметры в http-запрос
print(response.text)

Заголовки запросов и ответов

# Headers можно получать из запросов: отправляем запрос response 
# и добавляем к нему параметр заголовка:

import requests

response = requests.get('https://ya.ru/white') 
                    # вот мы узнали, что код ответа 200
                    # и заполучили это число в свой код: 

code = response.status_code
 
print(f'Код ответа = {code}') # а вот мы и заголовки читаем, 
                              # и выводим их форматированной строкой 
                              # с примечанием, каким захочется, на любом языке 
headers = response.headers 

print(f'Тип содержимого: {headers["content-type"]}') 
print(f'Время ответа: {headers["date"]}')
Вот чё к нам вернулось:
Код ответа = 200 
Тип содержимого: text/html; charset=UTF-8 
Время ответа: Thu, 13 Jun 2019 15:25:13 GMT

Заголовки можно собрать в словаре и передать в HTTP запросе:

import requests

request_headers = { 'Accept-Language': 'ru'}
# попросим материал на русском языке 
# сходим почитать блоги про IT, строкой передаём URL платформы habr

response = requests.get('https://habr.com', headers=request_headers) 
print(response.text)

Результат:

<!DOCTYPE html> <html lang="ru" class="no-js"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <meta content='width=1024' name='viewport'> <title>Лучшие публикации за сутки / Хабр</title> <meta name="description" content="Лучшие публикации за последние 24 часа" />

Так разными запросами мы можем вытягивать информацию, которая нам нужна.