我正在学习如何使用rvest
进行网络搜索,并且我遇到了一些问题。具体来说,代码只是拾取标题行。
library(rvest)
library(XML)
URL1 <- "https://swishanalytics.com/optimus/nba/daily-fantasy-salary-changes?date=2017-11-25"
df <- URL1 %>% read_html() %>% html_node("#stat-table") %>% html_table()
调用df
会产生一个包含7列和0行的data.frame。我安装了检查器小工具,甚至告诉我id = #stat-table
是正确的。这个网站有什么独特之处,它不想提取表格数据?
作为一个单独的问题,如果我查看页面来源&#34;,我可以看到页面上的所有数据,我不必使用RSelenium
来翻阅DK, FD,或雅虎的工资。看起来有很容易找到的键(例如找到&#34; FD&#34;&gt;找到所有&#34;玩家名称:&#34;然后拿起字符等),但我不知道#39;知道处理页面源的库/进程。有没有这方面的资源?
感谢。
答案 0 :(得分:3)
理论上,您可以从<script>
代码中提取数据,然后使用V8
进行处理,但使用splashr
或{{1}也很容易}}。我写了seleniumPipes
所以我会表明:
splashr
BeautifulSoup也不会读取此数据。好吧,你可以以JS格式定位包含它的library(splashr)
library(rvest)
start_splash()
pg <- render_html(url="https://swishanalytics.com/optimus/nba/daily-fantasy-salary-changes?date=2017-11-25")
html_node(pg, "table#stat-table") %>%
html_table() %>%
tibble::as_tibble()
## # A tibble: 256 x 7
## Position Player Salary Change `Proj Fantasy Pts` `Avg Fantasy Pts` Diff
## <chr> <chr> <chr> <chr> <dbl> <chr> <chr>
## 1 PF Thon Maker $3,900 +$600 (18.2%) 12.88 13.24 -0.36
## 2 PG DeAndre Liggins $3,500 +$500 (16.7%) 9.68 7.80 +1.88
## 3 PG Elfrid Payton $6,400 +$700 (12.3%) 32.77 28.63 +4.14
## 4 C Jahlil Okafor $3,000 -$400 (-11.8%) 1.71 12.63 -10.92
## 5 PF John Collins $5,200 +$400 (8.3%) 29.65 24.03 +5.63
## 6 SG Buddy Hield $4,600 -$400 (-8.0%) 17.96 21.84 -3.88
## 7 SF Aaron Gordon $7,000 +$500 (7.7%) 32.49 36.91 -4.42
## 8 PG Kemba Walker $7,600 -$600 (-7.3%) 36.27 38.29 -2.02
## 9 PG Lou Williams $6,600 -$500 (-7.0%) 34.28 30.09 +4.19
## 10 PG Raul Neto $3,200 +$200 (6.7%) 6.81 10.57 -3.76
## # ... with 246 more rows
killall_splash()
标签,并在Python上使用类似的V8引擎,但是它不能比<script>
更容易实现。< / p>
进一步扩展^^:
大多数抓取指南会告诉您执行“Inspect Element”以最终找到要定位的XPath或CSS选择器。检查该表的随机行显示:
对于“普通”网站,这通常有效。
使用JS呈现的XHR请求(或页面上的JS +数据)的网站看起来像^^但是您的定位无效b / c rvest
(并且BeautifulSoup等)无法呈现JavaScript在没有某些渲染引擎帮助的页面上。您可以尝试通过执行View Source以及元素检查来判断是否发生了这种情况。这是该网站的查看源裁剪为最终的数据+ JS + HTML,最终成为表格:
我发布了大量有关如何定位这些read_html()
代码并使用<script>
的SO答案。使用V8
或splashr
会更容易(如果它们已安装并正常工作)。
如果您不想处理Docker并使用最新版本的Chrome,您也可以按照here的指示进行无头工作并执行以下操作:
decapitated
res <- system2("chrome", c("--headless", "--dump-dom", "https://swishanalytics.com/optimus/nba/daily-fantasy-salary-changes?date=2017-11-25"), stdout=TRUE)
然后变为纯HTML,您可以使用res
阅读并删除。
正在开发的包 - rvest
- 使得^^不那么难看:
decapitated
注意:由于新权限和沙盒,无头Chrome在High Sierra上遇到问题。它适用于较旧的macOS系统和Windows / Linux。您只需要正确的版本和正确的环境变量集。