URL 中的过滤器选项被 read_html 和 rvest 调用忽略

Filter options in URL are ignored by a read_html and rvest call

我正在尝试抓取 https://www.yachtfocus.com/boten-te-koop.html#price=10000%7C30000&length=9.2%7C&super_cat_nl=Zeil。我正在使用 R 包 read_htmlrvest。我使用以下代码执行此操作:

library('rvest')
#scrape yachtfocus
url <- "https://www.yachtfocus.com/boten-te-koop.html#price=10000|30000&length=9.2|&super_cat_nl=Zeil"
webpage <- read_html(url)

#Using CSS selectors to scrap the rankings section
amount_results_html <- html_node(webpage,".res_number")

#create text
amount_results <- html_text(amount_results_html)

这 returns 不是使用 url 中提供的过滤器时的预期值,而是 returns "unfiltered" 值。所以当我使用时也是如此:

url <- "https://www.yachtfocus.com/boten-te-koop.html"
webpage <- read_html(url)

我可以"force" read_html 正确执行过滤器参数吗?

问题是站点将锚点 link 转换为异步 POST 请求,检索 JSON 然后动态构建页面。

可以在浏览器中使用Developer Tools重新加载请求看看^^:

如果右键单击突出显示的项目并选择 "Copy as cURL",您可以使用 curlconverter 程序包自动将其转换为 httr 函数:

httr::POST(
  url = "https://www.yachtfocus.com/wp-content/themes/yachtfocus/search/",
  body = list(
    hash = "#price=10000%7C30000&length=9.2%7C&super_cat_nl=Zeil"
  ),
  encode = "form"
) -> res

dat <- jsonlite::fromJSON(httr::content(res, "text"))

这就是你得到的(你还需要解析一些HTML):

str(dat)
## List of 8
##  $ content   : chr " <!-- <div class=\"list_part\"> <span class=\"list_icon\"><a href=\"#\">lijst</a></span> <span class=\"foto\"><"| __truncated__
##  $ top       : chr " <h3 class=\"res_number\">317 <em>boten\tgevonden</em></h3> <p class=\"filters_list red_border\"> <span>prijs: "| __truncated__
##  $ facets    :List of 5
##   ..$ categories_nl    :List of 15
##   .. ..$ 6u3son : int 292
##   .. ..$ 1v3znnf: int 28
##   .. ..$ 10opzfl: int 27
##   .. ..$ 1mrn15c: int 23
##   .. ..$ qn3nip : int 3
##   .. ..$ 112l5mh: int 2
##   .. ..$ 1xjlw46: int 1
##   .. ..$ ci62ni : int 1
##   .. ..$ 1x1x806: int 0
##   .. ..$ 1s9bgxg: int 0
##   .. ..$ 1i7r9mm: int 0
##   .. ..$ qlys89 : int 0
##   .. ..$ 1wwlclv: int 0
##   .. ..$ 84qiky : int 0
##   .. ..$ 3ahnnr : int 0
##   ..$ material_facet_nl:List of 11
##   .. ..$ 911206 : int 212
##   .. ..$ c9twlr : int 53
##   .. ..$ 1g88z3 : int 23
##   .. ..$ fwfz2d : int 14
##   .. ..$ gvrlp6 : int 5
##   .. ..$ 10i8nq1: int 4
##   .. ..$ h98ynr : int 4
##   .. ..$ 1qt48ef: int 1
##   .. ..$ 1oxq1p2: int 1
##   .. ..$ 1kc1p0j: int 0
##   .. ..$ 10dkoie: int 0
##   ..$ audience_facet_nl:List of 13
##   .. ..$ 71agu9 : int 69
##   .. ..$ eb9lzb : int 63
##   .. ..$ o40emg : int 55
##   .. ..$ vd2cm9 : int 41
##   .. ..$ tyffgj : int 24
##   .. ..$ icsp53 : int 20
##   .. ..$ aoqm1  : int 11
##   .. ..$ 1puyni5: int 6
##   .. ..$ 1eyfin8: int 5
##   .. ..$ 1920ood: int 4
##   .. ..$ dacmg4 : int 4
##   .. ..$ e7bzw  : int 3
##   .. ..$ offcbq : int 3
##   ..$ memberships      :List of 7
##   .. ..$ 137wtpl: int 185
##   .. ..$ 17vn92y: int 166
##   .. ..$ wkz6oe : int 109
##   .. ..$ 1mdn78e: int 87
##   .. ..$ aklw3a : int 27
##   .. ..$ 1d9qtvu: int 20
##   .. ..$ zqsmlf : int 3
##   ..$ super_cat_nl     :List of 3
##   .. ..$ 2xl9ac : int 271
##   .. ..$ glli8c : int 317
##   .. ..$ 1key6o0: int 0
##  $ filter    :List of 3
##   ..$ brand  : chr "<label><input type=\"checkbox\" name=\"yfilter[brand][Dehler]\" data-solr=\"brand\" value=\"Dehler\" class=\"cu"| __truncated__
##   ..$ brokers: chr "<label><input type=\"checkbox\" name=\"yfilter[brokers][Scheepsmakelaardij Goliath]\" data-solr=\"brokers\" val"| __truncated__
##   ..$ land_nl: chr "<label><input type=\"checkbox\" name=\"yfilter[land_nl][Nederland]\" data-solr=\"land_nl\" value=\"Nederland\" "| __truncated__
##  $ hash      : chr "&price=10000|30000&length=9.2|&super_cat_nl=Zeil"
##  $ ifield    :List of 3
##   ..$ y_price_min : chr "10000"
##   ..$ y_price_max : chr "30000"
##   ..$ y_length_min: chr "9.2"
##  $ rcfield   :List of 1
##   ..$ y_glli8c: chr "1"
##  $ session_id: chr "spghrfb8urv50u2kfg6bp3hejm"

请注意,这是一个超级常见问题,已在 SO 上多次讨论过。每种情况都需要在 XHR 请求中找到正确的 URL ,但这通常是唯一的区别。如果你打算进行网络抓取,你应该花一些时间阅读如何这样做(即使在 SO 上搜索 10m 也可能会为你解决这个问题)。

如果你不想做这种类型的页面自省,你需要使用 Rselenium 或 splashr 或 decapitated。同样,在此类问题的上下文中使用这些工具是关于 SO 的一个很好的主题。