我正在学习如何进行网页抓取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()
Run Code Online (Sandbox Code Playgroud)
调用df结果为 7 列 0 行的 data.frame。我安装了检查器小工具,即使这样也告诉我这id = #stat-table是正确的。该网站的独特之处在于它不想获取表格数据?
作为一个单独的问题,如果我“查看页面源代码”,我可以看到页面上的所有数据,并且我不必用来RSelenium翻阅 DK、FD 或 yahoo 工资。看起来有些键很容易找到(例如查找“FD”>查找所有“玩家名称:”并在后面拾取字符等),但我不知道处理该页面的库/进程来源。有这方面的资源吗?
谢谢。
理论上,您可以从标签中提取数据<script>,然后使用 来处理它V8,但这也很容易使用splashr或 来完成seleniumPipes。我写了splashr所以我会证明:
library(splashr)\nlibrary(rvest)\n\nstart_splash()\n\npg <- render_html(url="https://swishanalytics.com/optimus/nba/daily-fantasy-salary-changes?date=2017-11-25")\n\nhtml_node(pg, "table#stat-table") %>% \n html_table() %>% \n tibble::as_tibble() \n## # A tibble: 256 x 7\n## Position Player Salary Change `Proj Fantasy Pts` `Avg Fantasy Pts` Diff\n## <chr> <chr> <chr> <chr> <dbl> <chr> <chr>\n## 1 PF Thon Maker $3,900 +$600 (18.2%) 12.88 13.24 -0.36\n## 2 PG DeAndre Liggins $3,500 +$500 (16.7%) 9.68 7.80 +1.88\n## 3 PG Elfrid Payton $6,400 +$700 (12.3%) 32.77 28.63 +4.14\n## 4 C Jahlil Okafor $3,000 -$400 (-11.8%) 1.71 12.63 -10.92\n## 5 PF John Collins $5,200 +$400 (8.3%) 29.65 24.03 +5.63\n## 6 SG Buddy Hield $4,600 -$400 (-8.0%) 17.96 21.84 -3.88\n## 7 SF Aaron Gordon $7,000 +$500 (7.7%) 32.49 36.91 -4.42\n## 8 PG Kemba Walker $7,600 -$600 (-7.3%) 36.27 38.29 -2.02\n## 9 PG Lou Williams $6,600 -$500 (-7.0%) 34.28 30.09 +4.19\n## 10 PG Raul Neto $3,200 +$200 (6.7%) 6.81 10.57 -3.76\n## # ... with 246 more rows\n\nkillall_splash()\nRun Code Online (Sandbox Code Playgroud)\n\nBeautifulSoup 也不会读取此数据。好吧,您可以<script>以 JS 形式定位包含它的标签,并在 Python 上使用类似的 V8 引擎,但它不会比rvest.
进一步扩展^^:
\n\n大多数抓取指南都会告诉您执行“检查元素”以最终找到要定位的 XPath 或 CSS 选择器。检查该表的随机行显示:
\n\n\n\n对于“普通”网站,这通常是有效的。
\n\n具有 JS 渲染的 XHR 请求(或页面上的 JS+数据)的站点看起来像 ^^ 但您的定位不起作用 b/c read_html()(以及 BeautifulSoup 等效项)无法在没有帮助的情况下在页面上渲染 JavaScript一些渲染引擎。您可以尝试通过查看源代码和元素检查来判断是否发生这种情况。这是该网站的查看源代码,裁剪为很长的数据行 + JS + HTML,最终形成表格:
我已经发布了许多关于如何定位这些<script>标签并使用V8. 使用splashrordecapitated更容易(如果它们已安装并工作)。
如果您不想使用 Docker 并使用最新版本的 Chrome,您还可以按照此处的指南进行无头工作并执行以下操作:
\n\nres <- system2("chrome", c("--headless", "--dump-dom", "https://swishanalytics.com/optimus/nba/daily-fantasy-salary-changes?date=2017-11-25"), stdout=TRUE)\nRun Code Online (Sandbox Code Playgroud)\n\nres然后变成纯 HTML,您可以阅读rvest并刮掉它。
开发中的包 \xe2\x80\x94-\xc2\xa0 decapitated- 使 ^^ 变得不那么难看:
install_github("hrbrmstr/decapitated")\nlibrary(decapitated)\nlibrary(rvest)\n\nchrome_version()\n## Google Chrome 63.0.3239.59 beta\n\npg <- chrome_read_html("https://swishanalytics.com/optimus/nba/daily-fantasy-salary-changes?date=2017-11-25")\n\nhtml_node(pg, "table#stat-table") %>% \n html_table() %>% \n tibble::as_tibble() \n## # A tibble: 256 x 7\n## Position Player Salary Change `Proj Fantasy Pts` `Avg Fantasy Pts` Diff\n## <chr> <chr> <chr> <chr> <dbl> <chr> <chr>\n## 1 PF Thon Maker $3,900 +$600 (18.2%) 12.88 13.24 -0.36\n## 2 PG DeAndre Liggins $3,500 +$500 (16.7%) 9.68 7.80 +1.88\n## 3 PG Elfrid Payton $6,400 +$700 (12.3%) 32.77 28.63 +4.14\n## 4 C Jahlil Okafor $3,000 -$400 (-11.8%) 1.71 12.63 -10.92\n## 5 PF John Collins $5,200 +$400 (8.3%) 29.65 24.03 +5.63\n## 6 SG Buddy Hield $4,600 -$400 (-8.0%) 17.96 21.84 -3.88\n## 7 SF Aaron Gordon $7,000 +$500 (7.7%) 32.49 36.91 -4.42\n## 8 PG Kemba Walker $7,600 -$600 (-7.3%) 36.27 38.29 -2.02\n## 9 PG Lou Williams $6,600 -$500 (-7.0%) 34.28 30.09 +4.19\n## 10 PG Raul Neto $3,200 +$200 (6.7%) 6.81 10.57 -3.76\n## # ... with 246 more rows\nRun Code Online (Sandbox Code Playgroud)\n\n注意:由于新的权限和沙箱,Headless Chrome 在 High Sierra 上存在问题。它适用于较旧的 macOS 系统和 Windows/Linux。您只需要正确的版本和正确的环境变量集。
\n