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 之前新增將路由的請求傳送到網路,並具有選填的覆寫。
用法
- 同步
- 非同步
def handle(route, request):
# override headers
headers = {
**request.headers,
"foo": "foo-value", # set "foo" header
"bar": None # remove "bar" header
}
route.continue_(headers=headers)
page.route("**/*", handle)
async def handle(route, request):
# override headers
headers = {
**request.headers,
"foo": "foo-value", # set "foo" header
"bar": None # remove "bar" header
}
await route.continue_(headers=headers)
await page.route("**/*", handle)
參數
-
如果設定,則變更請求 HTTP 標頭。標頭值將轉換為字串。
-
如果設定,則變更請求方法(例如 GET 或 POST)。
-
post_data
str | bytes | Serializable (選填)#如果設定,則變更請求的 post data。
-
如果設定,則變更請求 URL。新的 URL 必須與原始 URL 具有相同的協定。
回傳
詳細資訊
headers 選項同時適用於路由請求及其啟動的任何重新導向。但是,url、method 和 post_data 僅適用於原始請求,不會延續到重新導向的請求。
route.continue_() 將立即將請求傳送到網路,不會調用其他符合的處理常式。如果您希望調用鏈中的下一個符合的處理常式,請使用 route.fallback()。
fallback
新增於:v1.23繼續路由的請求,並具有選填的覆寫。此方法與 route.continue_() 類似,不同之處在於其他符合的處理常式將在傳送請求之前被調用。
用法
當多個路由符合給定的模式時,它們會以與其註冊順序相反的順序執行。這樣,最後註冊的路由始終可以覆寫所有先前的路由。在以下範例中,請求將首先由最底層的處理常式處理,然後它將回退到前一個處理常式,最後將被第一個註冊的路由中止。
- 同步
- 非同步
page.route("**/*", lambda route: route.abort()) # Runs last.
page.route("**/*", lambda route: route.fallback()) # Runs second.
page.route("**/*", lambda route: route.fallback()) # Runs first.
await page.route("**/*", lambda route: route.abort()) # Runs last.
await page.route("**/*", lambda route: route.fallback()) # Runs second.
await page.route("**/*", lambda route: route.fallback()) # Runs first.
當您希望不同的處理常式處理不同類型的請求時,註冊多個路由非常有用,例如 API 呼叫與頁面資源或 GET 請求與 POST 請求,如下例所示。
- 同步
- 非同步
# Handle GET requests.
def handle_get(route):
if route.request.method != "GET":
route.fallback()
return
# Handling GET only.
# ...
# Handle POST requests.
def handle_post(route):
if route.request.method != "POST":
route.fallback()
return
# Handling POST only.
# ...
page.route("**/*", handle_get)
page.route("**/*", handle_post)
# Handle GET requests.
async def handle_get(route):
if route.request.method != "GET":
await route.fallback()
return
# Handling GET only.
# ...
# Handle POST requests.
async def handle_post(route):
if route.request.method != "POST":
await route.fallback()
return
# Handling POST only.
# ...
await page.route("**/*", handle_get)
await page.route("**/*", handle_post)
也可以在回退到後續處理常式時修改請求,這樣中間路由處理常式可以修改請求的 url、method、headers 和 postData。
- 同步
- 非同步
def handle(route, request):
# override headers
headers = {
**request.headers,
"foo": "foo-value", # set "foo" header
"bar": None # remove "bar" header
}
route.fallback(headers=headers)
page.route("**/*", handle)
async def handle(route, request):
# override headers
headers = {
**request.headers,
"foo": "foo-value", # set "foo" header
"bar": None # remove "bar" header
}
await route.fallback(headers=headers)
await page.route("**/*", handle)
使用 route.continue_() 立即將請求傳送到網路,在這種情況下,不會調用其他符合的處理常式。
參數
-
如果設定,則變更請求 HTTP 標頭。標頭值將轉換為字串。
-
如果設定,則變更請求方法(例如 GET 或 POST)。
-
post_data
str | bytes | Serializable (選填)#如果設定,則變更請求的 post data。
-
如果設定,則變更請求 URL。新的 URL 必須與原始 URL 具有相同的協定。變更 URL 不會影響路由比對,所有路由都使用原始請求 URL 進行比對。
回傳
fetch
新增於:v1.29執行請求並擷取結果,但不滿足它,以便可以修改回應然後滿足它。
用法
- 同步
- 非同步
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)
參數
-
如果設定,則變更請求 HTTP 標頭。標頭值將轉換為字串。
-
max_redirects
int (選填)新增於:v1.31#將自動追蹤的最大請求重新導向次數。如果超過次數,將會擲回錯誤。預設值為
20
。傳遞0
以不追蹤重新導向。 -
max_retries
int (選填)新增於:v1.46#網路錯誤應重試的最大次數。目前僅重試
ECONNRESET
錯誤。不會根據 HTTP 回應代碼重試。如果超過限制,將會擲回錯誤。預設值為0
- 不重試。 -
如果設定,則變更請求方法(例如 GET 或 POST)。
-
post_data
str | bytes | Serializable (選填)#允許設定請求的 post data。如果 data 參數是物件,它將序列化為 json 字串,並且如果未明確設定,
content-type
標頭將設定為application/json
。否則,如果未明確設定,content-type
標頭將設定為application/octet-stream
。 -
請求逾時時間(毫秒)。預設值為
30000
(30 秒)。傳遞0
以停用逾時。 -
如果設定,則變更請求 URL。新的 URL 必須與原始 URL 具有相同的協定。
回傳
詳細資訊
請注意,headers 選項將適用於擷取的請求以及它啟動的任何重新導向。如果您只想將 headers 應用於原始請求,而不應用於重新導向,請查看 route.continue_()。
fulfill
在 v1.9 之前新增使用給定的回應滿足路由的請求。
用法
使用 404 回應滿足所有請求的範例
- 同步
- 非同步
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!"))
提供靜態檔案的範例
- 同步
- 非同步
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"))
參數
-
回應主體。
-
如果設定,則等於設定
Content-Type
回應標頭。 -
回應標頭。標頭值將轉換為字串。
-
json
Serializable (選填)新增於:v1.29#JSON 回應。如果未設定,此方法將內容類型設定為
application/json
。 -
path
Union[str, pathlib.Path] (選填)#要回應的檔案路徑。內容類型將從檔案副檔名推斷。如果
path
是相對路徑,則會相對於目前的工作目錄解析。 -
response
APIResponse (選填)新增於:v1.15#APIResponse 以滿足路由請求。可以使用 fulfill 選項覆寫回應的個別欄位(例如標頭)。
-
回應狀態代碼,預設值為
200
。
回傳
屬性
request
在 v1.9 之前新增要路由的請求。
用法
route.request
回傳