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相反

posted @ 2023-09-22 19:45  上海-悠悠  阅读(792)  评论(0编辑  收藏  举报