我开始从:
中抓取表格的内容http://www.skatepress.com/skates-top-10000/artworks/
这很容易:
url <- ("http://www.skatepress.com/skates-top-10000/artworks/?painting_id=576")
site <- html(url)
但是,当您单击站点列表中的每个名称(以及图稿标题)时,我还需要另外刮取弹出框中包含的详细信息。
我不能为我的生活弄清楚如何通过面包屑(或艺术家身份或绘画身份)来实现这一目标。由于直接使用rvest访问节点的内容不起作用,我尝试了以下内容:
我尝试在这个网址中传递绘画ID:
node1 <- "bread-crumb > ul > li.activebc"
site %>% html_nodes(node1) %>% html_text(trim = TRUE)
character(0)
但是在抓取时它仍然会给出一个空的结果:
$(function(){
$("form[autocomplete=off]").find('input').attr('autocomplete', 'false');
});
我(显然)不是刮刮专家所以非常感谢任何和所有的帮助!我需要一种方法来捕获列表中10,000个项目中每个项目的附加信息...因此我为什么不想手动执行此操作!
希望这是一个简单的,我只是忽略了一些简单的事情。
答案 0 :(得分:3)
这将是一个更有效的基础刮刀,您可以使用pbapply
包免费获得进度条:
library(xml2)
library(httr)
library(rvest)
library(dplyr)
library(pbapply)
library(jsonlite)
base_url <- "http://www.skatepress.com/skates-top-10000/artworks/%d/"
n <- 100
bind_rows(pblapply(1:n, function(i) {
mutate(html_table(html_nodes(read_html(sprintf(base_url, i)), "table"))[[1]],
`Sale Date`=as.Date(`Sale Date`, format="%m.%d.%Y"),
`Premium Price USD`=as.numeric(gsub(",", "", `Premium Price USD`)))
})) -> skatepress
我添加了琐碎的日期&amp;数字转换。
我相信您的主要问题是该网站需要登录才能获取其他数据。您应该使用httr
给予(即登录)一个镜头并从该努力中获取wordpress_logged_inXXXXXXX…
cookie。我只是通过使用Chrome中的开发人员工具查看会话来抓住它,这对您也有用(但是值得花时间学习如何通过httr
完成)。
您需要从每个表格行中抓取另外两个<a …
标记。那个&#34;艺术家&#34;看起来像:
<a href="#" data-type="artist" data-id="pab_pica_1881">Pablo Picasso</a>
你可以用以下内容抓取内容:
POST("http://www.skatepress.com/wp-content/themes/skatepress/scripts/query_artist.php",
set_cookies(wordpress_logged_in_XXX="userid%XXXXXreallylongvalueXXXXX…"),
encode="form",
body=list(id="pab_pica_1881"),
verbose()) -> artist_response
fromJSON(content(artist_response, as="text"))
(返回值太大,无法在此处发布)
&#34;艺术品&#34;看起来像:
<a href="#" data-type="artwork" data-id="576">Les femmes d′Alger (Version ′O′)</a>
你可以用类似的方式得到它:
POST("http://www.skatepress.com/wp-content/themes/skatepress/scripts/query_artwork.php",
set_cookies(wordpress_logged_in_XXX="userid%XXXXXreallylongvalueXXXXX…"),
encode="form",
body=list(id=576),
verbose()) -> artwork_response
fromJSON(content(artwork_response, as="text"))
这不是很大但是我不会因为这个问题而变得混乱。
请注意,您还可以使用rvest
html_session
进行登录(免费获取Cookie),然后继续在抓取中使用该会话(vs { {1}})这意味着您不必执行read_html
httr
/ GET
。
您必须弄清楚如何将数据合并到数据框中,或者通过数据框中的各种ID(或其他策略)将其与数据框相关联。
你可以看到它通过开发人员工具调用这两个php脚本,它还会显示它传入的数据。我也非常震惊的是,该网站在其ToS中没有任何反刮条款但是他们没有。