使用R刮取动态弹出窗口的内容

时间:2015-09-27 20:14:51

标签: r popup web-scraping rvest

经过多次搜索,我被困在这个......

我开始从:

中抓取表格的内容

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个项目中每个项目的附加信息...因此我为什么不想手动执行此操作!

希望这是一个简单的,我只是忽略了一些简单的事情。

1 个答案:

答案 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中没有任何反刮条款但是他们没有。