Передача параметров в URL



В процессе работы с сайтами часто возникает необходимость передачи определенного набора данных через строку запроса URL. При работе в браузере часто можно видеть автоматическое добавление пар ключ/значение, они добавляются после знака вопроса. Библиотека Requests позволяет удобно передавать эти данные в виде словаря, используя аргумент params=. Обобщенно код может выглядеть следующим образом:

# Создание словаря с параметрами
params = {'key1': 'value1', 'key2': 'value2'}

# Отправка GET-запроса с параметрами
r = requests.get('https://httpbin.org/get', params=params)

# Вывод результирующего URL
print(r.url)

>>> https:// httpbin.org/get?key1=value1&key2=value2

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

Когда используется

Такой режим часто используется при работе с API. Набор параметров позволяет указать, какие данные необходимо предоставить.

В качестве примера можно привести взаимодействие с популярным сервисом погоды.

import requests

# Ваш API-ключ от OpenWeather (замените на реальный ключ)
api_key = "ВАШ_API_КЛЮЧ"

# Город, для которого мы хотим получить погодные данные
city = "Москва"

# Словарь параметров для передачи в API
params = {
    'q': city,        # Название города
    'appid': api_key, # Ваш API-ключ
    'units': 'metric' # Единицы измерения (опционально)
}

# Базовый URL API сервиса погоды
base_url = "http://api.openweathermap.org/data/2.5/weather"

# Отправляем GET-запрос к API
response = requests.get(base_url, params=params)

# Проверяем статус ответа
if response.status_code == 200:
    # Выводим полученные данные о погоде
    print("Погодные данные для города {}: ".format(city))
    print(response.json())
else:
    # Выводим сообщение об ошибке
    print("Не удалось получить данные. Код ошибки: {}".format(response.status_code))

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

import requests
from bs4 import BeautifulSoup

# Базовый URL для поиска в онлайн-магазине
base_url = 'https://example.com/search'

# Параметры поиска: ищем ноутбуки с определенными характеристиками
search_params = {
    'query': 'note',  # Поисковый запрос
    'brand': 'Dell',  # Бренд
    'min_price': '50000',  # Минимальная цена
    'max_price': '100000',  # Максимальная цена
    'sort': 'price_asc'  # Сортировка по возрастанию цены
}

# Отправляем GET-запрос с параметрами
response = requests.get(base_url, params=search_params)

# Проверка успешности запроса
if response.status_code == 200:
    # Парсим HTML-страницу с использованием BeautifulSoup
    soup = BeautifulSoup(response.text, 'html.parser')
    # Находим все элементы, соответствующие карточкам товаров (здесь это примерный CSS-селектор)
    product_cards = soup.select('.product-card')
    for card in product_cards:
        # Извлекаем информацию из карточки товара (название и цена)
        product_name = card.select_one('.product-name').text
        product_price = card.select_one('.product-price').text
        print(f'Название товара: {product_name}')
        print(f'Цена товара: {product_price}')
        print('---')
else:
    print(f'Не удалось выполнить запрос. Код ошибки: {response.status_code}')
    print(response.url)

Сформированная ссылка будет иметь следующий вид:

https://example.com/search?query=note&brand=Dell&min_price=50000&max_price=100000&sort=price_asc

Пагинация. При разбиении записей на отдельные страницы параметры ссылки часто используются для передачи номера страницы. Это достаточно удобное решение, поскольку при необходимости можно быстро организовать цикл для обхода всех страниц. На каждой итерации производится переход к нужной странице, после чего в теле цикла запускается процесс сбора информации. Ниже также будет пример парсинга контента с определенной страницы.

import requests
from bs4 import BeautifulSoup

# Базовый URL веб-сайта новостей
base_url = 'https://example.com/news'
# Перебираем страницы от 1 до 10
for page_number in range(1, 11):
    # Словарь параметров для передачи в запрос
    params = {
        'page': page_number  # Параметр для указания номера страницы
    }
    # Отправляем GET-запрос с параметрами
    response = requests.get(base_url, params=params)
    print(response.url)

Фильтрация данных. Для демонстрации будет рассмотрен пример с теоретическим порталом через API. К примеру, необходимо получить перечень фильмов, которые относятся к одной категории и выпущенных после определенного года.

import requests

# Базовый URL для API фильмов
base_url = 'https://api.example.com/movies'

# Параметры для фильтрации фильмов
params = {
    'year_after': 2000,  # Фильмы, выпущенные после этого года
    'genre': 'action'    # Жанр фильма
}
# Отправляем GET-запрос с параметрами для фильтрации
response = requests.get(base_url, params=params)
# Проверка успешности запроса

if response.status_code == 200:
    # Выводим полученные данные о фильмах
    print("Список фильмов:")
    for movie in response.json():
        print(f'  Название: {movie["title"]}, Год выпуска: {movie["year"]}, Жанр: {movie["genre"]}')
else:
    # Выводим сообщение об ошибке
    print(f'Не удалось выполнить запрос. Код ошибки: {response.status_code}')

 Как будет выглядеть сформированная ссылка:

https://api.example.com/movies?year_after=2000&genre=action



Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: