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

时间:2018-11-12 11:20:28

标签: r rvest xml2

我正在尝试抓取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)

使用url中提供的过滤器时,此值不返回预期值,而是返回“未过滤”值。当我使用时也是如此:

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

我可以“强制” read_html正确执行过滤器参数吗?

1 个答案:

答案 0 :(得分:2)

问题在于该站点将锚链接转换为异步POST请求,检索JSON,然后动态构建页面。

您可以在浏览器中使用开发人员工具并重新加载请求以查看^^:

enter image description here

如果右键单击突出显示的项目并选择“复制为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的一个广为讨论的主题。