首页 > 解决方案 > 使用 Rvest 解决纽约时报数独难题

问题描述

我正在尝试抓取NY Times 数独谜题,但是当我使用rvest它时,它并没有达到我想要的水平。但是,当我使用开发人员工具查看 css 时,所有数据似乎都在那里。看来以下应该工作,

library(rvest)

url <- "https://www.nytimes.com/puzzles/sudoku/easy"
webpage <- read_html(url)

webpage %>%
  html_node(".su-stretch")

它返回一个空列表。理想情况下,我想获取每个单元格中的值,但我无法抓取.pz-game-field节点下方的任何内容。有什么我想念的吗?有没有办法刮掉拼图?


对于那些对我为什么这样做感兴趣的人......我的父母有 ColorKu(颜色而不是数字)并且正在寻找更多的谜题。是的,我可以向他们展示如何自己将数字转换为颜色,但这似乎违反了编码信条......

标签: rweb-scrapingrvest

解决方案


如果您查看该页面的源代码,您会看到该表格是使用 Javascript 呈现的。游戏数据存储在一个变量中,window.gameData.

所以你可以像这样提取Javascript:

js <- webpage %>% 
  html_nodes("script") %>% 
  html_text()

检查显示js[1]包含游戏的数据。您可以将数据转换为 JSON:

js1 <- gsub("window.gameData = ", "", js[1])

然后转换为列表:

library(jsonlite)

js1 <- fromJSON(js1)

然后,例如,“简单”拼图的单元格值作为向量:

js1$easy$puzzle_data$puzzle

[1] 0 0 4 1 0 0 5 2 7 2 1 3 7 0 0 0 0 0 0 0 7 6 2 4 0 0 0 3 5 0 2 7 0 0 0 0 0 0 0 0 3 0 8 7 5 0 4 0 0 0 6 0 1 3 4 7 2 0 1 0 0 5 0 0 3 1 0 6 2 0 0 9 9 0 0 0 0 0 1 8 0

您可以将网格表示为矩阵:

matrix(js1$easy$puzzle_data$puzzle, nrow = 9, byrow = TRUE)

      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
 [1,]    0    0    4    1    0    0    5    2    7
 [2,]    2    1    3    7    0    0    0    0    0
 [3,]    0    0    7    6    2    4    0    0    0
 [4,]    3    5    0    2    7    0    0    0    0
 [5,]    0    0    0    0    3    0    8    7    5
 [6,]    0    4    0    0    0    6    0    1    3
 [7,]    4    7    2    0    1    0    0    5    0
 [8,]    0    3    1    0    6    2    0    0    9
 [9,]    9    0    0    0    0    0    1    8    0

警告 - 提示和解决方案也存储在数据中!


推荐阅读