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_html
和 rvest
。我使用以下代码执行此操作:
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 的一个很好的主题。
我正在尝试抓取 https://www.yachtfocus.com/boten-te-koop.html#price=10000%7C30000&length=9.2%7C&super_cat_nl=Zeil。我正在使用 R 包 read_html
和 rvest
。我使用以下代码执行此操作:
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 的一个很好的主题。