用 R 抓取 Kickstarter?
Posted
技术标签:
【中文标题】用 R 抓取 Kickstarter?【英文标题】:Scraping Kickstarter With R? 【发布时间】:2017-07-12 16:09:03 【问题描述】:我试图爬取 Kickstarter。但是,当我尝试获取引用项目的 URL 时,我没有得到结果。
这应该是结果之一:
https://www.kickstarter.com/projects/1534822242/david-bowie-hunger-city-photo-story?ref=category_ending_soon
这是我的代码:
代码:
main.page1 <- read_html(x ="https://www.kickstarter.com/discover/advanced?
category_id=1&sort=end_date&seed=2498921&page=1")
urls1 <- main.page1 %>% # feed `main.page` to the next step
html_nodes(".block.img-placeholder.w100p") %>% # get the CSS nodes
html_attr("href") # extract the URLs
有人知道我哪里出错了吗?
【问题讨论】:
看起来页面使用 Ajax 来填充详细信息 - 加载时 .img-placeholder div 是空的(而且似乎也没有 .block 类)。见html_nodes(main.page1,"div.img-placeholder")
@Spacedman 你知道如何将这些脚本放入 R 中的数据框中吗?
实际上看起来占位符是从另一个 div 的“data-project”属性中填充的……等等……,
【参考方案1】:
首先声明你使用的所有包 - 我必须去搜索才能意识到我需要rvest
:
> library(rvest)
> library(dplyr)
获取您的 HTML:
> main.page1 <- read_html(x ="https://www.kickstarter.com/discover/advanced?category_id=1&sort=end_date&seed=2498921&page=1")
就目前而言,每个项目的数据都隐藏在一堆 div 中的 data-project
属性中。浏览器中的一些 javascript(我怀疑是使用 React 框架构建的)通常会填充其他 DIV 并获取图像、格式化链接等。但是您刚刚获取了原始 HTML,因此不可用。但是原始数据是……所以……
相关的 div 似乎是“react-disc-landing”类,因此这会将数据作为文本字符串获取:
> data = main.page1 %>%
html_nodes("div.react-disc-landing") %>%
html_attr("data-project")
这些东西似乎是 JSON 字符串:
> substr(data[[1]],1,80)
[1] "\"id\":208460273,\"photo\":\"key\":\"assets/017/007/465/9b725fdf5ba1ee63e8987e26a1d33"
所以让我们使用rjson
包来解码第一个:
> library(rjson)
> jdata = fromJSON(data[[1]])
jdata
现在是一个非常复杂的嵌套列表。使用str(jdata)
查看其中的内容。我不确定你想要什么,但也许是这个 URL:
> jdata$urls$web$project
[1] "https://www.kickstarter.com/projects/1513052868/sense-of-place-by-jose-davila"
如果不是,您想要的 URL 必须在某个结构中。
重复data[[i]]
以获取所有链接。
请注意,您应该检查允许您执行此操作的站点 T+C,并查看是否有您真正应该使用的 API。
【讨论】:
提醒一下read_html
行会为我抛出此错误:Error in open.connection(x, "rb"): Peer certificate cannot be authenticated with given CA certificates
@Mako212 它与问题中的行相同,所以它对我有用,我认为是提问者。必须是您的本地安装/网络设置。
很好的解决方案!现在我还有一个问题.. 我想获得所有 26,449 个链接,但似乎我只能获得 13 个。即使我将 &page=1 更改为其他数字,它也会给我前 13 个链接。 @Spacedman 你也一样吗?还是我做错了什么?
这显然超出了 T+Cs:“不要使用任何类型的软件或设备(无论是手动的还是自动的)来“爬取”或“爬取”网站的任何部分。” 以上是关于用 R 抓取 Kickstarter?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Python 3.5 和 BeautifulSoup 抓取 href [重复]