Route
Когда сетевой маршрут настраивается с помощью page.route() или browser_context.route(), объект Route
позволяет управлять маршрутом.
Узнайте больше о сетевом взаимодействии.
Методы
abort
Добавлено до v1.9Прерывает запрос маршрута.
Использование
route.abort()
route.abort(**kwargs)
Аргументы
-
Необязательный код ошибки. По умолчанию
failed
, может быть одним из следующих:'aborted'
- Операция была прервана (из-за действия пользователя)'accessdenied'
- Доступ к ресурсу, кроме сети, был запрещен'addressunreachable'
- IP-адрес недоступен. Обычно это означает, что нет маршрута к указанному хосту или сети.'blockedbyclient'
- Клиент решил заблокировать запрос.'blockedbyresponse'
- Запрос не удался, так как ответ был доставлен с требованиями, которые не были выполнены (например, проверки 'X-Frame-Options' и 'Content-Security-Policy').'connectionaborted'
- Соединение прервано из-за отсутствия ACK для отправленных данных.'connectionclosed'
- Соединение было закрыто (соответствует TCP FIN).'connectionfailed'
- Попытка соединения не удалась.'connectionrefused'
- Попытка соединения была отклонена.'connectionreset'
- Соединение было сброшено (соответствует TCP RST).'internetdisconnected'
- Интернет-соединение было потеряно.'namenotresolved'
- Имя хоста не удалось разрешить.'timedout'
- Операция завершилась по тайм-ауту.'failed'
- Произошла общая ошибка.
Возвращает
continue_
Добавлено до v1.9Отправляет запрос маршрута в сеть с возможными переопределениями.
Использование
- Sync
- Async
def handle(route, request):
# переопределение заголовков
headers = {
**request.headers,
"foo": "foo-value", # установить заголовок "foo"
"bar": None # удалить заголовок "bar"
}
route.continue_(headers=headers)
page.route("**/*", handle)
async def handle(route, request):
# переопределение заголовков
headers = {
**request.headers,
"foo": "foo-value", # установить заголовок "foo"
"bar": None # удалить заголовок "bar"
}
await route.continue_(headers=headers)
await page.route("**/*", handle)
Аргументы
-
headers
Dict[str, str] (опционально)#Если установлено, изменяет HTTP-заголовки запроса. Значения заголовков будут преобразованы в строку.
-
Если установлено, изменяет метод запроса (например, GET или POST).
-
post_data
str | bytes | Dict (опционально)#Если установлено, изменяет данные post запроса.
-
Если установлено, изменяет URL запроса. Новый URL должен иметь тот же протокол, что и оригинальный.
Возвращает
Детали
Опция headers применяется как к маршрутизированному запросу, так и к любым перенаправлениям, которые он инициирует. Однако url, method и post_data применяются только к оригинальному запросу и не переносятся на перенаправленные запросы.
route.continue_() немедленно отправит запрос в сеть, другие соответствующие обработчики не будут вызваны. Используйте route.fallback(), если вы хотите, чтобы следующий соответствующий обработчик в цепочке был вызван.
fallback
Добавлено в: v1.23Продолжает запрос маршрута с возможными переопределениями. Метод аналогичен route.continue_(), с той разницей, что другие соответствующие обработчики будут вызваны перед отправкой запроса.
Использование
Когда несколько маршрутов соответствуют заданному шаблону, они выполняются в порядке, обратном их регистрации. Таким образом, последний зарегистрированный маршрут всегда может переопределить все предыдущие. В примере ниже запрос будет обработан сначала самым нижним обработчиком, затем он вернется к предыдущему, и в конце будет прерван первым зарегистрированным маршрутом.
- Sync
- Async
page.route("**/*", lambda route: route.abort()) # Выполняется последним.
page.route("**/*", lambda route: route.fallback()) # Выполняется вторым.
page.route("**/*", lambda route: route.fallback()) # Выполняется первым.
await page.route("**/*", lambda route: route.abort()) # Выполняется последним.
await page.route("**/*", lambda route: route.fallback()) # Выполняется вторым.
await page.route("**/*", lambda route: route.fallback()) # Выполняется первым.
Регистрация нескольких маршрутов полезна, когда вы хотите, чтобы отдельные обработчики обрабатывали разные виды запросов, например, вызовы API против ресурсов страницы или GET-запросы против POST-запросов, как в примере ниже.
- Sync
- Async
# Обработка GET-запросов.
def handle_get(route):
if route.request.method != "GET":
route.fallback()
return
# Обработка только GET.
# ...
# Обработка POST-запросов.
def handle_post(route):
if route.request.method != "POST":
route.fallback()
return
# Обработка только POST.
# ...
page.route("**/*", handle_get)
page.route("**/*", handle_post)
# Обработка GET-запросов.
async def handle_get(route):
if route.request.method != "GET":
await route.fallback()
return
# Обработка только GET.
# ...
# Обработка POST-запросов.
async def handle_post(route):
if route.request.method != "POST":
await route.fallback()
return
# Обработка только POST.
# ...
await page.route("**/*", handle_get)
await page.route("**/*", handle_post)
Также можно изменить запрос, возвращаясь к следующему обработчику, таким образом промежуточный обработчик маршрута может изменить url, метод, заголовки и postData запроса.
- Sync
- Async
def handle(route, request):
# переопределение заголовков
headers = {
**request.headers,
"foo": "foo-value", # установить заголовок "foo"
"bar": None # удалить заголовок "bar"
}
route.fallback(headers=headers)
page.route("**/*", handle)
async def handle(route, request):
# переопределение заголовков
headers = {
**request.headers,
"foo": "foo-value", # установить заголовок "foo"
"bar": None # удалить заголовок "bar"
}
await route.fallback(headers=headers)
await page.route("**/*", handle)
Используйте route.continue_(), чтобы немедленно отправить запрос в сеть, другие соответствующие обработчики не будут вызваны в этом случае.
Аргументы
-
headers
Dict[str, str] (опционально)#Если установлено, изменяет HTTP-заголовки запроса. Значения заголовков будут преобразованы в строку.
-
Если установлено, изменяет метод запроса (например, GET или POST).
-
post_data
str | bytes | Dict (опционально)#Если установлено, изменяет данные post запроса.
-
Если установлено, изменяет URL запроса. Новый URL должен иметь тот же протокол, что и оригинальный. Изменение URL не повлияет на сопоставление маршрута, все маршруты сопоставляются с использованием оригинального URL запроса.
Возвращает
fetch
Добавлено в: v1.29Выполняет запрос и получает результат без его выполнения, чтобы ответ мог быть изменен и затем выполнен.
Использование
- Sync
- Async
def handle(route):
response = route.fetch()
json = response.json()
json["message"]["big_red_dog"] = []
route.fulfill(response=response, json=json)
page.route("https://dog.ceo/api/breeds/list/all", handle)
async def handle(route):
response = await route.fetch()
json = await response.json()
json["message"]["big_red_dog"] = []
await route.fulfill(response=response, json=json)
await page.route("https://dog.ceo/api/breeds/list/all", handle)
Аргументы
-
headers
Dict[str, str] (опционально)#Если установлено, изменяет HTTP-заголовки запроса. Значения заголовков будут преобразованы в строку.
-
max_redirects
int (опционально) Добавлено в: v1.31#Максимальное количество перенаправлений запроса, которые будут автоматически выполнены. Ошибка будет выброшена, если количество превышено. По умолчанию
20
. Передайте0
, чтобы не следовать перенаправлениям. -
max_retries
int (опционально) Добавлено в: v1.46#Максимальное количество повторных попыток при сетевых ошибках. В настоящее время повторно пытается только ошибку
ECONNRESET
. Не повторяет попытки на основе кодов ответа HTTP. Ошибка будет выброшена, если лимит превышен. По умолчанию0
- без повторных попыток. -
Если установлено, изменяет метод запроса (например, GET или POST).
-
post_data
str | bytes | Dict (опционально)#Позволяет установить данные post запроса. Если параметр данных является объектом, он будет сериализован в строку json, и заголовок
content-type
будет установлен вapplication/json
, если не установлен явно. В противном случае заголовокcontent-type
будет установлен вapplication/octet-stream
, если не установлен явно. -
timeout
float (опционально) Добавлено в: v1.33#Тайм-аут запроса в миллисекундах. По умолчанию
30000
(30 секунд). Передайте0
, чтобы отключить тайм-аут. -
Если установлено, изменяет URL запроса. Новый URL должен иметь тот же протокол, что и оригинальный.
Возвращает
Детали
Обратите внимание, что опция headers будет применяться как к запрашиваемому запросу, так и к любым перенаправлениям, инициированным им. Если вы хотите применить headers только к оригинальному запросу, но не к перенаправлениям, рассмотрите возможность использования route.continue_() вместо этого.
fulfill
Добавлено до v1.9Выполняет запрос маршрута с данным ответом.
Использование
Пример выполнения всех запросов с ответами 404:
- Sync
- Async
page.route("**/*", lambda route: route.fulfill(
status=404,
content_type="text/plain",
body="not found!"))
await page.route("**/*", lambda route: route.fulfill(
status=404,
content_type="text/plain",
body="not found!"))
Пример обслуживания статического файла:
- Sync
- Async
page.route("**/xhr_endpoint", lambda route: route.fulfill(path="mock_data.json"))
await page.route("**/xhr_endpoint", lambda route: route.fulfill(path="mock_data.json"))
Аргументы
-
body
str | bytes (опционально)#Тело ответа.
-
content_type
str (опционально)#Если установлено, эквивалентно установке заголовка ответа
Content-Type
. -
headers
Dict[str, str] (опционально)#Заголовки ответа. Значения заголовков будут преобразованы в строку.
-
json
Dict (опционально) Добавлено в: v1.29#JSON-ответ. Этот метод установит тип содержимого в
application/json
, если не установлен. -
path
Union[str, pathlib.Path] (опционально)#Путь к файлу для ответа. Тип содержимого будет определен из расширения файла. Если
path
является относительным путем, то он разрешается относительно текущего рабочего каталога. -
response
APIResponse (опционально) Добавлено в: v1.15#APIResponse для выполнения запроса маршрута. Отдельные поля ответа (такие как заголовки) могут быть переопределены с помощью опций выполнения.
-
Код статуса ответа, по умолчанию
200
.
Возвращает
Свойства
request
Добавлено до версии v1.9Запрос, который будет маршрутизирован.
Использование
route.request
Возвращает