无法使用rvest使用表单刮取网站

无法使用rvest使用表单刮取网站,r,rvest,R,Rvest,我正试图从下面列出的网站上删除这些内容。我试图通过使用rvest和下面的代码来实现这一点 我的尝试是尝试复制我在Google Chrome中找到的下载按钮的PUT。我不确定我做错了什么。我的reprex中列出了错误 库(httr) 图书馆(rvest) 图书馆(dplyr) #> #>正在附加包:“dplyr” #>以下对象已从“package:stats”屏蔽: #> #>滤波器,滞后 #>以下对象已从“package:base”屏蔽: #> #>相交、setdiff、setequal、

我正试图从下面列出的网站上删除这些内容。我试图通过使用
rvest
和下面的代码来实现这一点

我的尝试是尝试复制我在Google Chrome中找到的下载按钮的
PUT
。我不确定我做错了什么。我的
reprex
中列出了错误

库(httr)
图书馆(rvest)
图书馆(dplyr)
#> 
#>正在附加包:“dplyr”
#>以下对象已从“package:stats”屏蔽:
#> 
#>滤波器,滞后
#>以下对象已从“package:base”屏蔽:
#> 
#>相交、setdiff、setequal、并集
url警告:设置隐藏字段“num_teams”的值。
#>警告:设置隐藏字段“草稿类型”的值。
#>警告:隐藏字段“sport”的设置值。
#>警告:设置隐藏字段“位置”的值。
#>警告:设置隐藏字段“联赛球队”的值。
会议提交(x=pgsession,表格=filled表格)
#>错误:`form`不包含`action`属性

这里有一个可能的解决方案,使用
rSelenium
将tsv.file下载到给定文件夹。 在那之后,简单的豌豆

library( RSelenium )
library( rvest )
library( xml2 )
library( data.table )

#setup download file + location
filename <- "ADP.tsv"
download_location <- file.path(Sys.getenv("USERPROFILE"), "Downloads")

#create extra cpabilities, so the browser(firefox) does not display an save-as dialog 
# when downloading the tsv file
eCaps <- makeFirefoxProfile( list( "browser.download.dir" = download_location,
                                   "browser.download.folderList" = 2, 
                                   "browser.helperApps.neverAsk.saveToDisk" = "text/tab-separated-values",
                                   "browser.download.manager.showWhenStarting" = FALSE ) )
#setup driver (using the firefox profile created before), client and server
driver <- rsDriver( browser = "firefox", port = 4545L, extraCapabilities = eCaps, verbose = FALSE )
server <- driver$server
browser <- driver$client

#goto url in browser
browser$navigate( "https://nfc.shgn.com/adp/baseball" )
#get 
button_dl <- list()
#while no buttons found (site not loaded), try to load the download-button
while ( length( button_dl ) == 0 ) {
  button_dl <- browser$findElements(using = "name", "download" )
}
#now click the button and wait for the file to show up in the download_location
button_dl[[1]]$clickElement()
#wait for download to complete
Sys.sleep(5)
#check if file is loaded
if ( file.exists( paste( download_location, filename, sep = "/" ) ) ) {
  #load the file
  DT <- data.table::fread( paste( download_location, filename, sep = "/" ) )
}
#close everything down properly
browser$close()
server$stop()

head(DT)
#    Rank              Player Team Position(s)  ADP Min Pick Max Pick Difference # Picks Team Team Pick
# 1:    1   Acuna Jr., Ronald  ATL          OF 1.68        1        6         NA     323   NA        NA
# 2:    2 Tatis Jr., Fernando   SD          SS 2.58        1        7         NA     323   NA        NA
# 3:    3       Betts, Mookie  LAD          OF 3.50        1        9         NA     323   NA        NA
# 4:    4          Soto, Juan  WAS          OF 3.98        1       10         NA     323   NA        NA
# 5:    5         Trout, Mike  LAA          OF 6.06        1       11         NA     323   NA        NA
# 6:    6        Cole, Gerrit  NYY           P 6.52        1       15         NA     323   NA        NA
库(RSelenium)
图书馆(rvest)
库(xml2)
库(data.table)
#安装程序下载文件+位置

filename如果您只想刮取该表,您可以通过使用“打印”按钮带您访问的URL,使用
rvest
purr
轻松完成

尽管不能使用
html\u table
,但使用
purr::map\u df
将单元格提取为数据帧是很简单的:

library(rvest)
library(dplyr)
library(purrr)
library(stringr)

pgtab <- read_html("https://nfc.shgn.com/adp.data.php") %>%  #destination of Print button
  html_nodes("tr") %>%                 #returns a list of row nodes
  map_df(~html_nodes(., "td") %>%      #returns a list of cell nodes for each row
           html_text() %>%             #extract text
           str_trim() %>%              #remove whitespace
           set_names("Rank","Player","Team","Position","ADP","MinPick",
                     "MaxPick","Diff","Picks","Team2","PickBid"))

head(pgtab)

# A tibble: 6 x 11
  Rank  Player             Team  Position ADP   MinPick MaxPick Diff  Picks Team2 PickBid
  <chr> <chr>              <chr> <chr>    <chr> <chr>   <chr>   <chr> <chr> <chr> <chr>  
1 1     Ronald Acuna Jr.   ATL   OF       1.69  1       6       ""    332   ""    ""     
2 2     Fernando Tatis Jr. SD    SS       2.57  1       7       ""    332   ""    ""     
3 3     Mookie Betts       LAD   OF       3.53  1       9       ""    332   ""    ""     
4 4     Juan Soto          WAS   OF       3.98  1       10      ""    332   ""    ""     
5 5     Mike Trout         LAA   OF       6.08  1       11      ""    332   ""    ""     
6 6     Gerrit Cole        NYY   P        6.50  1       15      ""    332   ""    ""     
库(rvest)
图书馆(dplyr)
图书馆(purrr)
图书馆(stringr)
pgtab%#打印按钮的目标
html_节点(“tr”)%>%#返回行节点列表
map_df(~html_nodes(,“td”)%>%#返回每行的单元格节点列表
html_text()%>%#提取文本
str_trim()%>%#删除空格
设置名称(“排名”、“球员”、“团队”、“位置”、“ADP”、“MinPick”,
“MaxPick”、“Diff”、“Picks”、“Team2”、“PickBid”))
头部(pgtab)
#一个tibble:6x11
排名球员团队位置ADP MinPick MaxPick Diff选择团队2 PickBid
1小罗纳德·阿库纳ATL 1.69 16“332”
2 2 Fernando Tatis Jr.SD SS 2.57 1 7“332”
3穆基·贝茨3.53 19“332”的小伙子
4胡安·索托的成绩为3.98110“332”
5 5 Mike Trout LAA 6.08 11“332”
6 6 Gerrit Cole NYY第6.50页115“332”
您还可以设置表单参数并执行此操作,尽管您必须检查它是否有影响。这里有一个方法

url <- "https://nfc.shgn.com/adp/baseball"
pgsession <- html_session(url)

pgform <- html_form(pgsession)[[2]]

filled_form <-set_values(pgform,
                         team_id = "0", from_date = "2020-10-01", to_date = "2021-02-19", num_teams = "0",
                         draft_type = "0", sport = "baseball", position = "",
                         league_teams = "0" )

filled_form$url <- "https://nfc.shgn.com/adp.data.php" #error if this is left blank

pgsession <- submit_form(pgsession, filled_form, submit = "printerFriendly")

pgtab <- pgsession %>% read_html() %>% #code as per previous answer above
  html_nodes("tr") %>% 
  map_df(~html_nodes(., "td") %>% 
           html_text() %>% 
           str_trim() %>% 
           set_names("Rank","Player","Team","Position","ADP","MinPick",
                     "MaxPick","Diff","Picks","Team2","PickBid"))

url是一个好地方,尤其是因为javascript没有运行!谢谢这管用!有几个问题,允许从我列出的表单中选择查询字段的附加选项是什么?为什么对td节点使用map_df,而不是tr节点?我如何为每一行提取数据playerid数据?@Jazzmatazz我会看看表单字段是否可以更改,尽管我认为它们只是过滤器,所以可能只会给您整个表的一个子集。我认为要获得详细的玩家数据,你需要使用rselenium
html_节点
生成一个列表,要保留列表结构,需要使用
map
对其进行迭代,并为每一行生成一个嵌套的单元格列表
map_df
将嵌套列表强制为数据帧(只要您设置了一些名称)。这只是将其放入数据帧的最简洁的方法。@Jazzmatazz我在上面的答案中添加了一个设置表单值的示例。在运行上面的pgsession代码后,我仍然收到错误“error:
form
不包含
action
属性”。我以前从未使用过RSelenium。你能给我指一个帮助我设置firefox配置文件的资源吗?我在运行rsDriver时遇到一个错误。我建议首先执行一些基本的selenium Totorial。。。