В процессе работы с сайтами часто возникает необходимость передачи определенного набора данных через строку запроса 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