本文概述
- 内容
- 加载必要的软件包
- 用R爬取JavaScript生成的数据
- 总结
(想练习将更多数据导入R吗?请尝试本教程。)
内容
- 加载必要的软件包
- 用R爬取JavaScript生成的数据
- 总结
library(rvest)
library(stringr)
library(plyr)
library(dplyr)
library(ggvis)
library(knitr)
options(digits = 4)
用R爬取JavaScript生成的数据下一步是使用PhantomJS收集TechStars数据。检查以下基本.js文件:
// scrape_techstars.jsvar webPage = require('webpage');
var page = webPage.create();
var fs = require('fs');
var path = 'techstars.html'page.open('http://www.techstars.com/companies/stats/', function (status) {
var content = page.content;
fs.write(path, content, 'w')
phantom.exit();
});
该脚本基本上在基础javascript代码完成其工作之后呈现HTML页面, 从而允许你获取其中包含所有表的HTML页面。为了在本分析的其余部分中停留在R中, 建议你使用system()函数来调用PhantomJS(你必须下载并安装PhantomJS并将其放在工作目录中):
# Let phantomJS scrape techstars, output is written to techstars.html
system("./phantomjs scrape_techstars.js")
经过一小段弯路后, 你最终在我们的本地系统上有了一个HTML文件techstars.html, 可以用rvest抓取。对Techstars网页的检查发现, 我们感兴趣的表位于具有CSS类批处理的div中:
batches <
- html("techstars.html") %>
%
html_nodes(".batch")class(batches)
[1] "XMLNodeSet"
现在, 你有了XMLNodeSet对象的列表:每个对象都包含一个TechStars批处理的数据。在这里, 我们可以找到有关批次位置, 年份, 季节的信息, 还可以找到有关公司, 其当前总部, 当前状态以及所筹集资金总额的信息。我们不会在下面详细介绍数据收集和清理步骤;你可以自己执行代码并检查它们的完成情况。你会看到正在进行一些自定义清除, 以确保每一位信息的格式都正确:
batch_titles <
- batches %>
%
html_nodes(".batch_class") %>
%
html_text()batch_season <
- str_extract(batch_titles, "(Fall|Spring|Winter|Summer)")
batch_year <
- str_extract(batch_titles, "([[:digit:]]{4})")
# location info is everything in the batch title that is not year info or season info
batch_location <
- sub("\\s+$", "", sub("([[:digit:]]{4})", "", sub("(Fall|Spring|Winter|Summer)", "", batch_titles)))# create data frame with batch info.
batch_info <
- data.frame(location = batch_location, year = batch_year, season = batch_season)breakdown <
- lapply(batches, function(x) {
company_info <
- x %>
% html_nodes(".parent")
companies_single_batch <
- lapply(company_info, function(y){
as.list(gsub("\\[\\+\\]\\[\\-\\]\\s", "", y %>
%
html_nodes("td") %>
%
html_text()))
})
df <
- data.frame(matrix(unlist(companies_single_batch), nrow=length(companies_single_batch), byrow=T, dimnames = list(NULL, c("company", "funding", "status", "hq"))))
return(df)
})# Add batch info to breakdown
batch_info_extended <
- batch_info[rep(seq_len(nrow(batch_info)), sapply(breakdown, nrow)), ]
breakdown_merged <
- rbind.fill(breakdown)# Merge all information
techstars <
- tbl_df(cbind(breakdown_merged, batch_info_extended)) %>
%
mutate(funding = as.numeric(gsub(", ", "", gsub("\\$", "", funding))))
结合了核心R, rvest, plyr和dplyr功能, 我们现在有了techstars数据框;所有TechStars公司的数据集, 其所有公开信息的格式都很好:
techstars
## Source: local data frame [535 x 7]
##
##company fundingstatushq location year season
## 1Accountable110000ActiveFort Worth, TXAustin 2013Fall
## 2Atlas 1180000ActiveAustin, TXAustin 2013Fall
## 3Embrace110000FailedAustin, TXAustin 2013Fall
## 4Filament Labs 1490000ActiveAustin, TXAustin 2013Fall
## 5Fosbury300000ActiveAustin, TXAustin 2013Fall
## 6Gone!840000Active San Francisco, CAAustin 2013Fall
## 7MarketVibe110000 AcquiredAustin, TXAustin 2013Fall
## 8Plum 1630000ActiveAustin, TXAustin 2013Fall
## 9ProtoExchange110000ActiveAustin, TXAustin 2013Fall
## 10Testlio 1020000ActiveAustin, TXAustin 2013Fall
## .......................
names(techstars)
## [1] "company""funding""status""hq""location" "year"
## [7] "season"
总结【使用R和PhantomJS进行Web爬取】通过上述工具和代码的组合, 我们设法从使用JavaScript脚本生成其数据的网站上抓取数据。可以看到, 这是一个结构化的过程, 一旦初始代码可用, 就可以轻松完成。是否想学习R, 并寻找数据科学以及R教程和课程?签出srcmini
推荐阅读
- NLP的歌词分析和R的机器学习
- Scikit-Learn教程(Python与机器学习)
- Scikit-Learn教程(棒球分析(1))
- 使用Scikit-Learn检测虚假新闻
- R教程中的算法交易
- 安卓手机开启通过wifi使用adb
- 教你如何实现 Android TextView 文字轮播效果
- [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployDirectory Deployment of web app
- 关于android studio安装过程中的问题