R语言爬虫常用方法总结(以案例说明)

2017 年 11 月 13 日 数萃大数据 周世荣

现在大家对爬虫的兴趣不断高涨,R和PYTHON是两个非常有力的爬虫工具。Python倾向于做大型爬虫,与R相比,语法相对复杂,因此Python爬虫的学习曲线会相对陡峭。对于那些时间宝贵,又想从网上获取数据的初学者而言,用R做爬虫是最好的选择,有三个原因:1、R语法相对直观,规则更加灵活;2、对于数据量不大的用户来数(小于百万级),R也能够非常自如地处理;3、先学习R爬虫,等熟悉爬虫的原理之后,在过渡到Python是很容易的。

这篇博文你会学到什么:

  • 使用XML抓取表格数据(爬取勇士队球员数据)

  • 使用rvest抓取网页数据(爬取关于特朗普的百度新闻)

  • 使用jsonlite抓取json格式数据(爬取高德地图温州各个行政区域的中心)

  • 使用RSelenium模拟登录抓取数据(模拟登录人大经济论坛爬取R语言板块数据)

  • 使用PhantomJS不登陆抓取数据(抓取国家数据各省的近13个月CPI)

  • 另外你也会学到一些数据处理的小技巧

表格数据抓取

表格数据是最容易抓取的数据格式,直接使用XML包中的readHTMLTable函数,一页中的多个表格会使用列表的形式存储,在使用readHTNLTable的时候,header=T可以标记出所抓取的表格是列名,大多说情况抓过来表格的列名是乱码的,你可以使用rvest::repair_encoding对它们进行修复。爬取勇士队球员数据的代码如下:

  
    
    
    
  1. #抓取表格数据(抓取勇士队的球员数据)

  2. library(XML)

  3. url <- 'http://www.stat-nba.com/team/GSW.html'

  4. dt1 <- readHTMLTable(url,header = T)

  5. names(dt1[[1]]) <- rvest::repair_encoding(names(dt1[[1]]))

  6. head(dt1[[1]])

  7. 球员 出场 首发 时间  投篮 命中 出手  三分 命中 出手  罚球 命中 出手 篮板

  8. 1    凯文-杜兰特   12   12 34.7 53.8%  8.9 16.6 46.7%  2.9  6.3 86.9%  4.4  5.1  7.5

  9. 2    斯蒂芬-库里   13   13 32.4 46.7%  7.5 16.2 38.8%  3.6  9.3 94.4%  6.5  6.8  4.7

  10. 3    克莱-汤普森   13   13 32.9 51.4%  8.5 16.5 47.1%  3.7  7.8 75.0%  0.5  0.6  3.8

  11. 4  德雷蒙德-格林   13   13 29.8 49.5%  3.5  7.0 35.7%  1.2  3.2 79.4%  2.1  2.6  7.9

  12. 5    大卫-韦斯特   12    0 11.3 68.6%  2.9  4.3 75.0%  0.3  0.3 80.0%  0.7  0.8  2.3

  13. 6        尼克-杨   12    0 13.0 44.1%  2.2  4.9 41.7%  1.7  4.0 60.0%  0.3  0.4  1.0

  14.  前场 后场 助攻 抢断 盖帽 失误 犯规 得分

  15. 1  0.8  6.8  4.9  0.6  2.4  3.4  2.3 25.2

  16. 2  0.5  4.2  6.7  1.8  0.2  2.6  2.2 25.2

  17. 3  0.5  3.4  2.7  0.7  0.8  1.8  2.2 21.1

  18. 4  1.1  6.8  6.7  1.0  1.3  3.2  3.0 10.2

  19. 5  1.0  1.3  1.3  0.7  1.4  1.4  1.6  6.8

  20. 6  0.3  0.8  0.9  0.8  0.1  0.4  1.1  6.3

rvest抓取网页数据

rvest是R用户使用率最多的爬虫包,它简洁地语法可以解决大部分的爬虫问题。它的使用方法比较固定1、使用read_html读取网页;2、通过CSS或Xpath获取所需要的节点并使用html_nodres读取节点内容;3、结合stringr包对数据进行清理。下面使用它爬取关于特朗普的百度新闻,具体代码如下:

  
    
    
    
  1. library(rvest)

  2. library(stringr)

  3. library(rlist)

  4. url <- 'http://news.baidu.com/ns?cl=2&rn=20&tn=news&word=%E7%89%B9%E6%9C%97%E6%99%AE&ie=utf-8'

  5. #抓取网页

  6. httr_web <- read_html(url,encoding = 'utf-8')

  7. #抓取新闻标题

  8. title <- httr_web%>%html_nodes('h3>a')%>%html_text(trim = T)

  9. #抓取新闻发布者与日期

  10. author <- httr_web%>%html_nodes('p.c-author')%>%html_text(trim = T)

  11. candidate_date=Sys.Date()%>%format('%Y年%m月%d日')

  12. fun <- function(x){

  13.  re=if(length(x)==3){

  14.    re=c(x[1],candidate_date,x[length(x)])

  15.  }else{

  16.    re= x[-2]

  17.  }

  18.  re=data.frame(发布者=re[1],日期=re[2],时间=re[3])

  19.  return(re)

  20. }

  21. news_Trump <- data.frame(标题=title ,

  22.  author%>%str_split('\\s')%>%lapply(fun)%>%list.stack())

  23. tail(news_Trump)

  24.                                          标题     发布者           日期     时间

  25. 15     特朗普访越车队驶过河内歌剧院 引众人围观       网易 20171112  6小时前

  26. 16 特朗普:美俄就政治解决叙利亚问题达成一致协议     环球网 20171112  9小时前

  27. 17  英媒:印度为迎接特朗普女儿 围捕乞丐暂住监狱   腾讯新闻 20171112 14小时前

  28. 18          【独家】他此行的外交礼遇有点不一样     环球网 20171112  7小时前

  29. 19   得分“A+”的不止有特朗普外孙女,更有这支军队   中国军网 20171112  6小时前

  30. 20         多位专家谈中美关系:两国合作前景广阔 中国新闻网 20171112  2小时前

抓取json格式数据

json数据是一些列数据的嵌套,它的一般格式如下 {key1:var1:{key2:var2,...},...}, 这种格式的数据通常为网站的开放数据,可以申请目标网站的API,然后获取数据。获得API后,rvest可以很容易处理这种数据,但由于数据格式比较复杂,后期数据处理会有些繁琐。因此这里建议大家使用jsonlite中的fromJSON函数,它直接以嵌套列表的格式呈现数据,不建议大家使用RJSON中的fromJSON,它你会的到url多重自字符的错误。获取高德地图中温州各行政区域中心坐标的代码如下,你也可使用这个方法获取个行政区的json边界,方法类似,这里不再说明。

  
    
    
    
  1. ##抓取JSON数据(抓取温州各个行政区域的坐标)

  2. library(jsonlite)

  3. name='温州'

  4. encoding_name <- iconv(enc2utf8(name),from='utf-8',to='ISO-8859-1',sub = "byte")%>%

  5.  str_replace_all('><','%')%>%str_sub(1,18)%>%str_to_upper()%>%

  6.  str_replace('<','%')

  7. subdistrict_num=1

  8. key_str='你的API'

  9. url0 <- 'http://restapi.amap.com/v3/config/district?'

  10. url <- paste0(url0,

  11.              'keywords=',encoding_name,'&',

  12.              'subdistrict=',subdistrict_num,'&',

  13.              'key=',key_str)

  14. wz_center<- fromJSON(url)

  15. wz_centers<-wz_center[['districts']][['districts']][[1]]

  16. tail(wz_centers)

  17.   citycode adcode   name               center    level districts

  18. 6      0577 330326 平阳县 120.565793,27.661918 district      NULL

  19. 7      0577 330327 苍南县 120.427619,27.519773 district      NULL

  20. 8      0577 330328 文成县 120.091498,27.786996 district      NULL

  21. 9      0577 330329 泰顺县 119.717649,27.556884 district      NULL

  22. 10     0577 330381 瑞安市 120.655148,27.778657 district      NULL

  23. 11     0577 330382 乐清市 120.983906,28.113725 district      NULL

RSelenium模拟登录抓取数据

使用RSelenium时,你首先要下载Selenium,chromedriver,直接百度,这里不再说明。下载之后要把Selenium放在你当前的工作目录,chromedriver放在chorm的目录下,win10用户Altt+x--cmd---'>'前面的即为工作目录,然后你还需要下载java,并把它放在你的环境变量中(注意区分用户环境还是系统环境),最后在命令窗口输入下面代码: java -jar selenium-server-standalone-3.4.0.jar 上面命令运行成功后我们就可已在R中使用RSelenium了,Selenium是一个模拟人点击网页的自动化测试模块,所有输入和点击的操作都可以用它实现。RSelenium的操作如下:

  • remoteDriver创建远程连接

  • open()打浏览器

  • navigate(url)打开网页

  • findElement、clickElement、sendKeysToElement三剑客进行一些列的选中、点击、输入操作

  • getElementAttribute("outerHTML")[[1]]转为HTML对象,然后使用rvest操作

  
    
    
    
  1. library(RSelenium)  

  2. remDr <- remoteDriver(remoteServerAddr = "127.0.0.1" ,

  3.                      port = 4444,

  4.                      browserName = "chrome")

  5. remDr$open() #打开浏览器

  6. remDr$navigate('http://bbs.pinggu.org/forum-69-1.html')

  7. step1 <- remDr$findElement(using = 'xpath',

  8.                            "//*[@id='nv_forum']/div[6]/div[1]/div/div[4]/ul/li[3]/a")

  9. step1$clickElement()

  10. step21 <- remDr$findElement(using = 'xpath', '//*[@id="username"]')

  11. step21$clickElement()

  12. step21$sendKeysToElement(list(username ='用户名'))

  13. step22 <- remDr$findElement(using = 'xpath', '//*[@id="password"]')

  14. step22$clickElement()

  15. step22$sendKeysToElement(list(password ='密码'))

  16. step23 <- remDr$findElement(using = 'xpath', '/html/body/div[2]/div/div[2]/a')

  17. step23$clickElement()

  18. step3 <- remDr$findElement(using = "xpath","//*[@id='moderate']/table")

  19. web <- step3$getElementAttribute("outerHTML")[[1]]%>%read_html()

  20. dat3=data.frame(

  21. 标题=web%>%html_nodes('a.xst')%>%html_text(trim = T),

  22. 发布者=web%>%html_nodes('a.u')%>%html_text(trim = T),

  23. 发布时间=web%>%html_nodes('p>em>span')%>%html_text(trim = T),

  24. 最后回复者=web%>%html_nodes('p>em>a:nth-child(4)')%>%html_text(trim = T),

  25. 最后回复日期=web%>%html_nodes('p>em>a:nth-child(5)')%>%html_text(trim = T)

  26. )

  27. tail(dat3)

  28.                                                                        标题

  29. 75                                R randomForest  classification  regression

  30. 76                                           求教R语言中的MSBVAR包出现的问题

  31. 77 【经典教材系列】Spatial and Spatio-temporal Bayesian Models with R - INLA

  32. 78                               求助----关于R语言的randomforest包的一个问题

  33. 79                               R绘制水平方向的条形图并在相应位置添加标签

  34. 80                                              如何把散点和曲线花在一张图上

  35.          发布者   发布时间   最后回复者 最后回复日期

  36. 75    fengqifeng  2016-6-26  鱼铃五校名2   2017-11-10

  37. 76 xiaoqiang1789  2013-6-19 涅墨西斯随风   2017-11-10

  38. 77        wwqqer 2015-10-19     苦丁冰茶   2017-11-10

  39. 78       benbobo   2012-5-2  鱼铃五校名2   2017-11-10

  40. 79      慕目穆木  2017-11-9       nkunku   2017-11-10

  41. 80      awen1011  2017-11-2      GOD.M.W   2017-11-10

使用PhantomJS不登陆抓取数据

首先下载phantomjs,然后把下面代码块复制到text,保存后更改后缀名为.js,若需要抓取其他js网页,直接更改open中的内容即可。注意你的到的js文件要和phantomjs.exe放在相同的工作目录下。


  
    
    
    
  1. // NDC.js

  2. var webPage = require('webpage');

  3. var page = webPage.create();

  4. var fs = require('fs');

  5. var path = 'NDC.html'

  6. page.open('http://data.stats.gov.cn/easyquery.htm?cn=E0101', function (status) {

  7.  var content = page.content;

  8.  fs.write(path,content,'w')

  9.  phantom.exit();

  10. });

运行system("./phantomjs NDC.js")后,会在你的工作目录下创建一个NDC.html文档,直接用read_html读就可以,然后获取所需的表格数据。

  
    
    
    
  1. system("./phantomjs NDC.js")

  2. web <- read_html("NDC.html")

  3. dat4 <- (web%>%html_table())[[1]]

  4. tail(dat4)

  5.               地区 20179 20178 20177 20176 20175 20174

  6. 26       西藏自治区     101.7     101.5     101.4     101.2     101.2     101.3

  7. 27           陕西省     102.2     102.7     102.1     102.0     101.8     101.1

  8. 28           甘肃省     102.1     101.8     101.4     101.3     100.8     100.4

  9. 29           青海省     102.3     102.3     101.6     101.6     101.0      99.8

  10. 30   宁夏回族自治区     101.4     101.6     101.3     101.7     101.8     101.3

  11. 31 新疆维吾尔自治区     102.8     101.9     101.7     102.1     102.1     101.5

  12.   20173 20172 20171 201612 201611 201610

  13. 26     102.0     102.4     102.8      103.0      102.9      102.7

  14. 27     100.0      99.7     101.5      101.2      101.5      101.5

  15. 28     100.2     100.3     101.7      101.4      101.2      101.1

  16. 29     100.1     100.5     102.0      101.9      102.0      102.1

  17. 30     100.7     100.3     102.6      102.5      102.3      102.4

  18. 31     101.2     101.5     102.8      102.3      102.4      101.9



欢迎大家关注微信公众号:数萃大数据

课程公告

深度学习培训班【上海站】

时间:2017年12月23日

地点:上海创梦云实训创新中心

更多详情,请扫描下面二维码

登录查看更多
3

相关内容

XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初 XPath 的提出的初衷是将其作为一个通用的、介于XPointer与XSLT间的语法模型。但是 XPath 很快的被开发者采用来当作小型查询语言。
【2020新书】实战R语言4,323页pdf
专知会员服务
102+阅读 · 2020年7月1日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
164+阅读 · 2020年5月14日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
122+阅读 · 2020年5月10日
【经典书】Python数据数据分析第二版,541页pdf
专知会员服务
195+阅读 · 2020年3月12日
算法与数据结构Python,369页pdf
专知会员服务
165+阅读 · 2020年3月4日
手把手教你用R语言制作网络爬虫机器人(一)
R语言中文社区
4+阅读 · 2019年1月26日
R语言数据挖掘利器:Rattle包
R语言中文社区
21+阅读 · 2018年11月17日
比Selenium快100倍的方法爬东方财富网财务报表
程序人生
8+阅读 · 2018年10月31日
R语言之数据分析高级方法「时间序列」
R语言中文社区
17+阅读 · 2018年4月24日
干货 | Python 爬虫的工具列表大全
机器学习算法与Python学习
10+阅读 · 2018年4月13日
Python 爬虫实践:《战狼2》豆瓣影评分析
数据库开发
5+阅读 · 2018年3月19日
教你用Python爬虫股票评论,简单分析股民用户情绪
数据派THU
10+阅读 · 2017年12月12日
【python 自然语言处理】对胡歌【猎场】电视剧评论进行情感值分析
Python3爬虫之入门和正则表达式
全球人工智能
7+阅读 · 2017年10月9日
【宁波站】网络爬虫与文本挖掘
数萃大数据
5+阅读 · 2017年7月19日
The Matrix Calculus You Need For Deep Learning
Arxiv
12+阅读 · 2018年7月2日
Arxiv
3+阅读 · 2018年6月1日
Arxiv
8+阅读 · 2018年1月25日
VIP会员
相关VIP内容
【2020新书】实战R语言4,323页pdf
专知会员服务
102+阅读 · 2020年7月1日
干净的数据:数据清洗入门与实践,204页pdf
专知会员服务
164+阅读 · 2020年5月14日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
122+阅读 · 2020年5月10日
【经典书】Python数据数据分析第二版,541页pdf
专知会员服务
195+阅读 · 2020年3月12日
算法与数据结构Python,369页pdf
专知会员服务
165+阅读 · 2020年3月4日
相关资讯
手把手教你用R语言制作网络爬虫机器人(一)
R语言中文社区
4+阅读 · 2019年1月26日
R语言数据挖掘利器:Rattle包
R语言中文社区
21+阅读 · 2018年11月17日
比Selenium快100倍的方法爬东方财富网财务报表
程序人生
8+阅读 · 2018年10月31日
R语言之数据分析高级方法「时间序列」
R语言中文社区
17+阅读 · 2018年4月24日
干货 | Python 爬虫的工具列表大全
机器学习算法与Python学习
10+阅读 · 2018年4月13日
Python 爬虫实践:《战狼2》豆瓣影评分析
数据库开发
5+阅读 · 2018年3月19日
教你用Python爬虫股票评论,简单分析股民用户情绪
数据派THU
10+阅读 · 2017年12月12日
【python 自然语言处理】对胡歌【猎场】电视剧评论进行情感值分析
Python3爬虫之入门和正则表达式
全球人工智能
7+阅读 · 2017年10月9日
【宁波站】网络爬虫与文本挖掘
数萃大数据
5+阅读 · 2017年7月19日
Top
微信扫码咨询专知VIP会员