【问题标题】:How to fill a reactive form using Selenium如何使用 Selenium 填写响应式表单
【发布时间】:2021-10-12 02:49:25
【问题描述】:

我需要在this page 中填写表单的三个字段,以便抓取结果搜索的记录,但是,我还没有弄清楚如何将值更改为apartamento、compra usado 和 Medellín (Antioquia ), 分别。请注意,第一个字段类似于带有复选框选项的下拉列表,第三个字段是文本输入,但您必须选择显示的选项之一才能在搜索中获得正确的结果。我在 R 中使用 Rselenium 包,但我认为将本机 javascript 与 RSelenium 一起使用可能更容易。我也愿意接受 Python 或任何其他语言的建议。

script <- "
document.querySelector('[class = \"m2-select__single-value css-1uccc91-singleValue\"]').textContent='Compra usado';
document.querySelector('[name = \"businessType\"]').setAttribute('value', 'venta/usado');
document.getElementsByClassName('form-control')[0].setAttribute('value', 'Medellín (Antioquia)');
"

remDr$executeScript(script)


inmueble <- remDr$findElements(using = 'css', '#propertyTypes .css-1hwfws3')
inmueble$sendKeysToElement(list("Casas"))


ciudad <- remDr$findElement(using = 'css', '.form-control')
ciudad$sendKeysToElement(list("Medellín (Antioquia)"))


buscar_boton <- remDr$findElement(using = 'css', '#btnSearch')
buscar_boton$sendKeysToElement(list(key = 'enter'))

编辑:添加了我到目前为止的代码,它改变了 html 中的值,但是当我点击输入时,它使用默认值进行搜索。

【问题讨论】:

    标签: javascript python r selenium web-scraping


    【解决方案1】:

    您可以使用 httr 并发出与网页相同的搜索请求。您需要在途中从其中一个 JavaScript 文件中获取 API 密钥:

    library(httr)
    library(stringr)
    library(magrittr)
    
    params <- list(
      "realEstateBusinessList" = "venta",
      "realEstateStatusList" = "usado",
      "locationsList" = "Medellín (Antioquia)",
      "realEstateTypeList" = "apartamento",
      "from" = "0",
      "size" = "50"
    )
    
    key <- httr::GET("https://www.metrocuadrado.com/results/_next/static/chunks/commons.3c50d9b2b91c3e061be4.js") %>%
      content(as = "text") %>%
      stringr::str_match(., '"X-Api-Key":"(.*?)"') %>%
      .[, 2]
    
    headers <- c(
      "user-agent" = "Mozilla/5.0",
      "accept" = "application/json, text/plain, */*",
      "x-api-key" = key
    )
    
    
    r <- httr::GET(url = "https://www.metrocuadrado.com/rest-search/search", httr::add_headers(.headers = headers), query = params) %>%
      content()
    
    r$results
    

    【讨论】:

    • 非常感谢!!!!它在大多数情况下确实有效。这样做只会产生 7 条所需查询的记录,而实际上有超过 9000 条记录。问题在于您指定位置的第三个输入字段,我尝试了几个选项并且只输入麦德林效果很好,因为它显示了前 50 个总共约 9000 条记录。你知道我如何继续这样做以通过页面移动来获取其他结果的信息(截至今天,有 193 页结果)?
    • 这只是对 params 列表的迭代,更改了“from”值。很抱歉再次问,但如果你不介意,你能告诉我你是如何得到这个解决方案的吗?或指导我到哪里可以学习如何?我了解 httr 包的使用,但是您是如何找到请求的这些 url 和变量的?我想将它复制到其他网站。
    • 基本上,我在浏览器中进行了这些手动选择,并使用网络选项卡(浏览器中的 F12)来监控页面为检索搜索结果而发出的请求。我想我实际上在这种情况下使用了 FireFox,因为 Chrome 挂起。参数等在网络选项卡中针对返回数据的 xhr 请求列出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-29
    • 2016-07-13
    • 2018-09-25
    • 1970-01-01
    • 2013-06-25
    • 2019-02-26
    相关资源
    最近更新 更多