pub struct Request {
pub url: UrlOrRule,
pub method: Method,
pub body: Option<UrlOrRule>,
pub headers: HashMap<String, String>,
pub vars: BTreeMap<String, Rule>,
pub render: bool,
pub ready_for: Option<String>,
pub intercept_api: Option<String>,
pub total_pages: Option<Rule>,
pub has_more: Option<Rule>,
pub page_by: Option<PageBy>,
}Expand description
单个请求。
Fields§
§url: UrlOrRule§method: Method§body: Option<UrlOrRule>§headers: HashMap<String, String>§vars: BTreeMap<String, Rule>命名捕获:对本请求响应每个 (name, Rule) 求值,写入 chapter 层(等价 scope=chapter
的 Capture),使本 op 的 list/item 与后续步骤以 {{name}} 引用。见 design D7-bis。
各条独立对响应求值(可引用 base/key/page 与前置 prelude 捕获,但勿互相引用:
需有序依赖请用 prelude 链)。用 BTreeMap 保证迭代/落点顺序确定(免哈希随机化幽灵 bug)。
render: bool渲染型取页(render-fetcher):为真则用受控浏览器渲染本请求 URL、跑站点自身 JS,
而非 reqwest 直取——用于 SPA 站点(结果由 JS 渲染 / 签名 API 返回)。默认 false = 现状。
仅 browser feature 且浏览器可用时生效;否则该 op 优雅降级。
ready_for: Option<String>渲染就绪等待选择器。两种用法:
- 无
interceptApi:渲染后轮询该选择器出现,取渲染后 DOM 交 CSS 规则(方式 A); - 与
interceptApi共存(render-dual-source):拦 API 取 body 之外,等该选择器出现后 另抓渲染 DOM,供via:css的totalPages等对 DOM 求值(如分页器总页数)。
intercept_api: Option<String>CDP 拦截:渲染时拦截 URL 含此子串的响应体作为取页 body(交 via:"json" 规则)。
用于「结果只在签名 API、DOM 无关键字段」的站点(典型:番茄搜索 search_book/v1)。
可与 ready_for 共存(见上)。
total_pages: Option<Rule>精确总页数规则(render-dual-source):对取页结果求值得「共 M 页」(search 翻页进度)。
via:json 对 API body 求值;via:css/xpath 对渲染 DOM 求值(需 interceptApi +
ready_for 共存,抓到 DOM 才有源)。空 = 不返回总数(现状)。
has_more: Option<Rule>翻页边界规则(list-has-more):对取页结果求值「是否还有下一页」(非空且非 false/0 → 有)。
源路由同 total_pages(按 via)。空 = 不提供边界(UI 不限制)。
page_by: Option<PageBy>点击驱动翻页(search-click-pagination):URL 不认页码的 SPA(如番茄 search)靠点分页器
「下一页」递增页码。配 render + interceptApi 且 page > 1 时,引擎在一张活页内点
pageBy.click 选择器 page-1 次翻到目标页、拦该页 API 响应。空 = 现状(单拦截 /
{{page}} URL 模板翻页),逐字节不变。
Trait Implementations§
Source§impl<'de> Deserialize<'de> for Request
impl<'de> Deserialize<'de> for Request
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
impl Eq for Request
impl StructuralPartialEq for Request
Auto Trait Implementations§
impl Freeze for Request
impl RefUnwindSafe for Request
impl Send for Request
impl Sync for Request
impl Unpin for Request
impl UnsafeUnpin for Request
impl UnwindSafe for Request
Blanket Implementations§
Source§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
Source§type ArchivedMetadata = ()
type ArchivedMetadata = ()
Source§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
impl<T> ErasedDestructor for Twhere
T: 'static,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
Source§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
Source§impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
impl<T, N1, N2> Niching<NichedOption<T, N1>> for N2
Source§unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
unsafe fn is_niched(niched: *const NichedOption<T, N1>) -> bool
Source§fn resolve_niched(out: Place<NichedOption<T, N1>>)
fn resolve_niched(out: Place<NichedOption<T, N1>>)
out indicating that a T is niched.