python+playwright 学习-82 Request 对象
前言
每当页面发送网络资源请求时,页面都会发出以下事件序列:
page.on("request")
当页面发出请求时触发page.on("response")
接收到请求的响应状态和标头时触发page.on("requestfinished")
当响应主体被下载并且请求完成时发出。
如果请求在某个时刻失败,则会发出page.on("requestfailed")
事件,而不是'requestfinished'
事件(也不是"response"事件)。
HTTP错误响应,如404或503,从HTTP的角度来看仍然是成功的响应,所以请求将以“requestfinished”事件完成。
如果请求得到“重定向”响应,则会使用requestfinished事件成功完成请求,并向重定向的url发出新请求。
Request 对象相关操作方法
相关操作方法
- all_headers()
- header_value()
- headers_array()
- response()
- sizes()
- is_navigation_request()
all_headers
具有与此请求相关联的所有请求HTTP标头的对象。标头名称的大小写均为小写。
该方法返回 Dict[str, str]
request.all_headers()
header_value
返回与名称匹配的标头的值。该名称不区分大小写。
参数name,是请求头部 表头的名称
request.header_value(name)
headers_array
包含与此请求相关联的所有请求HTTP标头的数组。与request.all_headers()
不同,标头名称不使用小写。具有多个条目的标头(如Set Cookie)会多次出现在数组中。
该方法返回List[Dict]
request.headers_array()
response
返回匹配的响应对象,如果由于错误而未收到响应,则返回null。
request.response()
sizes
返回给定请求的资源大小信息。
request.sizes()
返回dict内容包含
requestBodySize
请求正文(POST数据负载)的大小(以字节为单位)。如果没有正文,则设置为0。requestHeadersSize
从HTTP请求消息开始到正文前的双CRLF(包括双CRLF)的总字节数。responseBodySize
接收到的响应正文(已编码)的大小(以字节为单位)。responseHeadersSize
从HTTP响应消息开始到正文前的双CRLF(包括双CRLF)的总字节数。
is_navigation_request
此请求是否为Frame的导航。一些导航请求是在创建相应的帧之前发出的,因此没有可用的request.frame。
request.is_navigation_request()
Request 对象相关属性
常用的属性
request.url
返回请求url地址
request.method
请求方式(GET, POST, etc.)
request.headers
标头名称的大小写均为小写,此方法不返回与安全相关的标头,包括与cookie相关的标头。您可以使用request.all_headers()获取包含cookie信息的完整标头列表
request.post_data
获取post请求body内容
request.post_data_buffer
获取post请求binary 类型
request.post_data_json
返回已解析的请求体,用于form-urlencoded
和JSON,
request.resource_type
包含呈现引擎感知到的请求的资源类型。ResourceType将是以下类型之一:document、stylesheet、image、media、font、script、texttrack、xhr、fetch、eventsource、websocket、manifest、other。
failure
方法返回null,除非此请求失败,如requestfailed事件所报告的那样。
page.on("requestfailed", lambda request: print(request.url + " " + request.failure))
frame
返回发起此请求的 Frame
frame_url = request.frame.url
请注意,在某些情况下, Frame 不可用,并且此方法将抛出。
- 当请求在Service Worker中发起时。您可以使用
request.serviceWorker()
进行检查。 - 当在创建相应的 Frame 之前发出导航请求时。您可以使用
request.is_navigation_request()
进行检查。
下面是一个处理所有情况的示例
redirected_from
服务器重定向到此请求的请求(如果有的话)
当服务器以重定向进行响应时,Playwright会创建一个新的Request对象。这两个请求通过redirectedFrom()和redirectedTo()方法连接。当发生多个服务器重定向时,可以通过重复调用redirectedFrom()来构建整个重定向链。
使用示例,如果从 http://example.com
重定向到 https://example.com
:
response = page.goto("http://example.com")print(response.request.redirected_from.url) # "http://example.com"
如果没有重定向返回None
response = page.goto("https://google.com")
print(response.request.redirected_from) # None
redirected_to
如果服务器响应重定向,则浏览器发出新请求。
assert request.redirected_from.redirected_to == request
他的方法与request.redirected_from相反