网络爬虫R语言内html_nodesvlookup函数怎么用运行错误

R语言rvest爬虫实战的一点问题? - 知乎有问题,上知乎。知乎作为中文互联网最大的知识分享平台,以「知识连接一切」为愿景,致力于构建一个人人都可以便捷接入的知识分享网络,让人们便捷地与世界分享知识、经验和见解,发现更大的世界。2被浏览<strong class="NumberBoard-itemValue" title="分享邀请回答con_time[seq(2,length(con_time),4)]
赞同 1 条评论分享收藏感谢收起写回答a). 加载用到的R包
## Warning in doTryCatch(return(expr), name, parentenv, handler): 无法载入共享目标对象&/Library/Frameworks/R.framework/Resources/modules//R_X11.so&::
dlopen(/Library/Frameworks/R.framework/Resources/modules//R_X11.so, 6): Library not loaded: /opt/X11/lib/libSM.6.dylib
Referenced from: /Library/Frameworks/R.framework/Resources/modules//R_X11.so
Reason: image not found
## Could not load tcltk.
Will use slower R code instead.
library(bitops)
library(rvest)
library(stringr)
library(DBI)
library(RSQLite)
library(sqldf)
library(RCurl)
library(ggplot2)
library(sp)
library(raster)
## [1] "C"
b). 自定义一个函数,后续用于爬取信息。
c). 爬取&的博文发布相关的数据 ,我这里只爬1-5页的数据,100条记录。
cnblog&- data.frame()
for(m in 1:5){
cnblog &- rbind(cnblog,getdata(m))
d). 查看一下爬的数据。
dim(cnblog)
## [1] 100
head(cnblog)
title recommendation
## 1 Dynamic CRM 2015学习笔记(3)oData 查询方法及GUID值比较
Unity 之圆环算法
浅谈研发项目经理
JavaScript系列----AJAX机制详解以及跨域通信
MP4视频编码器
article_view article_comment
post_date post_weekday post_year
post_month post_day post_hour
http://www.cnblogs.com/fengwenit/p/4415631.html
## 2 http://www.cnblogs.com/wuzhang/p/wuzhang.html
http://www.cnblogs.com/fancyamx/p/4415521.html
http://www.cnblogs.com/caokai520/p/4409712.html
http://www.cnblogs.com/renlong0602/p/4414872.html 天天向上中
http://www.cnblogs.com/dhenskr/p/4414984.html
http://www.cnblogs.com/fengwenit/
http://www.cnblogs.com/wuzhang/
http://www.cnblogs.com/fancyamx/
http://www.cnblogs.com/caokai520/
## 5 http://www.cnblogs.com/renlong0602/
http://www.cnblogs.com/dhenskr/
tail(cnblog)
title recommendation article_view
前端资源预加载并展示进度条
Android中的Handler的机制与用法详解
JS学习笔记3_函数表达式
iOS-MVVM设计模式
HTML5简单入门系列(七)
【Win 10应用开发】认识一下UAP项目
article_comment
post_date post_weekday post_year post_month
post_day post_hour
http://www.cnblogs.com/lvdabao/p/resource-preload-plugin.html 每日一bo
http://www.cnblogs.com/JczmDeveloper/p/4403129.html
http://www.cnblogs.com/ayqy/p/4403086.html Jamy Cai
http://www.cnblogs.com/xqios/p/4403071.html
http://www.cnblogs.com/cotton/p/4403042.html
http://www.cnblogs.com/tcjiaan/p/4403018.html 棉花年度
http://www.cnblogs.com/caokai520/
http://www.cnblogs.com/lvdabao/
http://www.cnblogs.com/JczmDeveloper/
http://www.cnblogs.com/ayqy/
http://www.cnblogs.com/xqios/
http://www.cnblogs.com/cotton/
e). 我这里只查看Mar.02-Mar.29四个周的博文数据,下面对数据进行简单处理。
f). 简单数据分析&&图表呈现
Mar.02-Mar.29,博客发布数量按周分布
ggplot(data=cnblog_Mar,aes(post_weekday))+geom_bar()
每日博文数量分布
ggplot(data=cnblog_Mar,aes(post_date))+geom_bar()
## stat_bin: binwidth defaulted to range/30. Use 'binwidth = x' to adjust this.
每个小时博文发布量分布
ggplot(data=cnblog_Mar,aes(post_hour))+geom_bar()
用R 写的这种爬虫总共是两部分 1.自定义一个函数,将原型写出来。2.利用自定义函数,写个循环就可以欢乐的爬数据了。其中第一步找准确html_nodes是关键
Google chrome 浏览器结合 CSS selector 使用,寻找html_nodes 非常方便。
存在table的网站,爬数据更方便。例如,若不存在table,则需要一个字段一个字段的爬取了,例如。
商业网站的数据都是他们的宝藏,例如淘宝,京东,等
接下来打算爬一些招聘网站的数据,分析一下自己感兴趣的行业的薪资待遇,以及是哪些公司在招聘,工作地点在哪里,岗位对技术要求是什么,是R,是python,是SAS,还是数据库等等。
我的前两次爬虫在博客园写了一篇博客,有兴趣的可以去看看
阅读(...) 评论()R语言爬虫初尝试-基于RVEST包学习 - R语言中文社区 | 十条
微信号:R_shequ
介绍:国内最大的R语言专业综合学习平台.R前沿资讯、R线上交流、R线下培训、R案例、R资料分享、R视频学习、R网站学习、R付费资料、R爱好者等,聚焦R语言学习,传播大数据价值.关注我,你就是R大牛.
R语言爬虫初尝试-基于RVEST包学习
本文作者:天善智能社区专家尾巴AR
本文来自天善智能社区:https://ask.hellobi.com/blog/weibaar/2963
在学完coursera的getting and Cleaning data后,继续学习用R弄爬虫网络爬虫。主要用的还是Hadley Wickham开发的rvest包。再次给这位矜矜业业开发各种好用的R包的大神奉上膝盖
查阅资料如下:
rvest的github
rvest自身的帮助文档
rvest + CSS Selector 网页数据抓取的最佳选择-戴申: 里面有提及如何快速获得html的位置。看完这篇,想想我之前看代码看半天分段真是逗比。。经测试,遨游浏览器,右键,审查元素可以得到类似结果。戴申的blog里面还有若干相关文章,国内RVEST资料基本就靠他的BLOG了,感激!
言归正传,拿了几个网页练手。包括对拉勾网爬了一下虫,还尝试了对国外某黄页爬虫,对ebay用户评价爬虫分析其卖家卖的东西主要在哪个价格段(我查的那个卖家,卖8.99和39.99最多,鞋子类),做了一下文本挖掘,还有爬了一下股票数据,基金买入情况等等。
之所以放拉勾网为例子,因为这个大家都比较熟一点?其他的都有点小众=_=而且虽然我没有跳槽的心,但年初却是很多人跳槽的热点。另外,因为之前听人说过,要了解一个公司的动态,有一个办法是去看这个公司放出来的招聘岗位,可以知道他们最近哪个业务线要扩张了,哪个业务线要跑人了,以及了解技术需求。
&rvest基础语法:
library(rvest)lagou&-"http://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?kd=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90&spc=2&pl=&gj=&xl=&yx=&gx=&st=&labelWords=&lc=&workAddress=&city=%E6%B7%B1%E5%9C%B3&requestId=&pn=3"web&-html(lagou,encoding="UTF-8") #读取数据,规定编码#之前我是用关键字搜索,阅读html代码,获得html_nodes里需要什么属性,不过许多浏览器有开发者工具,可以直接获得层级信息。如遨游position&-web %&% html_nodes("li div.hot_pos_l a") %&% html_text()#上面就是直接读取数据,获得位置信息#不过在后面做其他网站时发现,有时候信息储存在同类数据里(如div没有class等等),建议是找一个大的分类,先获得表格信息,再做数据list_lagou&-web %&% html_nodes("li.clearfix")#这里正确找准正确的划分点很重要。有&li class="odd clearfix"&,其实用li.clearfix一样可以取(对于空格二选一,如"li.odd"或者"li.clearfix")#接下来的company/position照选即可,因为事先已经分好了list,所以每一个出多少心里有数。。
在讲完原理之后,现在开始尝试写代码
因为里面涉及太多的选取数据工作。为了避免出现太多变量,我最后是编了一个函数,输出数据库
#下面开始写代码,首先写一个函数getdata,会输出一个数据框getdata&-function(page,urlwithoutpage){ & & & &url=paste0(urlwithoutpage,page) #这里输入拉勾网没有页码的url & & & &web&-html(url,encoding="UTF-8") #读取数据,规定编码,access用 & & & &list_lagou&-web %&% html_nodes("li.clearfix") #获得一个清单,15个职位 & & & &title&-list_lagou %&% html_nodes("div.hot_pos_l div.mb10 a")%&%html_text() & & & &company&-list_lagou %&% html_nodes("div.hot_pos_r div.mb10 a")%&%html_text() & & & &link&-gsub("\\?source\\=search","",list_lagou %&% html_nodes("div.hot_pos_l div.mb10 a")%&%html_attr("href"))#接下来的由于数据都存在span里,没有很好的划分。这个取数要复杂一些。我在这里,研究他们的表,先取15个完整list,然后用seq等序列取数#之后要研究是否有更好的方法#如果有table,可以直接用data.table取数更快。。。 & & & &temp&-list_lagou %&% html_nodes("div.hot_pos_l span") & & & &city&-temp[seq(1,90,by=6)] %&% html_text() & & & &salary&-gsub("月薪:","",temp[seq(2,90,by=6)]%&% html_text()) & & & &year&-gsub("经验:","",temp[seq(3,90,by=6)]%&% html_text()) & & & &degree&-gsub("最低学历:","",temp[seq(4,90,by=6)]%&%html_text()) & & & &benefit&-gsub("职位诱惑:","",temp[seq(5,90,by=6)]%&% html_text()) & & & &time&-temp[seq(6,90,by=6)]%&%html_text() & & & &data.frame(title,company,city,salary,year,degree,benefit,time,link)}
&然后是使用该函数,我这里就爬两页
#使用该函数,library(rvest)url&-"http://www.lagou.com/jobs/list_%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90?kd=%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90&spc=2&pl=&gj=&xl=&yx=&gx=&st=&labelWords=&lc=&workAddress=&city=%E6%B7%B1%E5%9C%B3&requestId=&pn="final&-data.frame()for (i in 3:5){ & & & &final&-rbind(final,getdata(i,url)) & & & &} #定义个数,把上面的getdata得到的Data.frame合并head(final)
上面完成了第一个列表。爬出效果如图关于这个数据有什么用呢…… 简单来说,我们可以用它来看这个网上有多少在招的,各公司招人的比例,以及薪资水平,做一点基础的数据分析。
虽然我现在不跳槽,不过了解一下市场状况也是不错的~譬如见下图,从目前这网上的平均薪资与工作年限的关系来看,数据分析岗至少在职位前五年属于薪资增长期,初始涨得快,后面涨得慢,但平均应有13%左右的增长?然后这网上目前没有什么高级岗位开出来(工作5-10年的岗位很少),反而是有些公司搞错分类,放了一堆数据录入的到数据分析栏目。。。
值得一提的是,因为数据分析这个类目里包含了不同的类别,如数据录入的也被归到数据分析,还有高薪也被归到这里,所以不能完全按这个做参考。不过这个研究让我深刻体会到了爬虫的有效性!好玩!实用!可以用到工作中去:) 还可以像个猎头一样了解人才市场~~做个有情调的数据分析师~~
另外,其实我们还可以遍历JD,看近期是什么技术最吃香,是R还是Python还是SQL还是SAS还是别的啥啥啥。下面是我随机抽了个JD做的爬虫。可以直接拿到相关数据。
final[1,9]## [1] http:## 45 Levels: http:url&-as.character(final[1,9])w&-html(url,encoding = "UTF-8")d&-w %&% html_nodes("dd.job_bt p") %&% html_text()d## [1] "1.金融、计算机、财务、经济相关专业;"## [2] "2.有证券从业资格证者优先;" & & & & &## [3] "3.想从事文职类工作,对办公软件熟悉;"## [4] "4.可接收已拿到学历证的应届毕业生。" &## [5] "&U+00A0&"
注意事项:
对于被编码保护的数据(如国外yellow.local.ch,email被编码保护了。需要用 decodeURIComponent函数反编译。)
xpath语句对html_nodes适用。但是它好像是全局语句。。就是如果用div[1]//span[4]取数的话,它直接就只出全局的那个结果。。。
取数,可以用li.da或者li.daew取数,两者等价
正则表达式很有用!!尤其是对网页数据,某些不会写,或者技术高超不愿意被我们爬虫的工程师,用rvest去抓数据,会抓到一堆堆乱码= =这几天练习下来感受到了无尽恶意
中文,html(data,encoding='UTF-8')还有iconv(data,'utf-8','gbk')可以有效避免大部分乱码。但是R对中文支持真的很渣。
rvest对于静态抓取很方便!但是对于脚本访问的网页,还需要继续学习RCurl包。备查资料如下:
  等学会了再写总结。
以及最后的最后,近期研究重点应该是IT金融?受张丹老师的两条均线与R语言)鼓舞好大!我觉得学R嘛,用到实处才是重要的!玩爬虫玩的太开心都没跟JHU的课了。。。。
以后可以尝试按照自己和老爸的看股票习惯开发出类似的选股模型来~~
以及,我之前有看到有个牛人用python爬了各大网站程序员相关的招聘信息:程序员网站codejob&有兴趣的可以去看看。
微信回复关键字即可学习
回复 R&&&&&&&&&&& &&R语言快速入门免费视频&回复 统计&&&&&&& &&统计方法及其在R中的实现回复 用户画像 &&民生银行客户画像搭建与应用&回复 大数据&&& &&大数据系列免费视频教程回复 可视化& & &&利用R语言做数据可视化回复 数据挖掘 & 数据挖掘算法原理解释与应用回复 机器学习 &&R&Python机器学习入门&R语言|Kindle特价书爬榜示例 &#038; 输出HTML小技巧
4,616 阅读
14,560 阅读
2,592 阅读
14,376 阅读
4,056 阅读
淘数宝网(ikddm.com),大数据学习交流平台,我们会把大数据相关的优秀文章转载推荐给大家,如果侵犯了您的版权信息,或作者、出处有误,请与我们联系修正。联系邮箱:
<span class="tipso_style" id="tip-w-j" data-tipso=''>
记住我的登录信息
点击“立即注册”转到用户注册页面。
输入用户名或电子邮箱地址,您会收到一封新密码链接的电子邮件。
用户名或电子邮件地址R语言之网络爬虫
该工具可以与谷歌浏览器结合使用,能够为复杂网站的元素生成CSS选择器,这款神器有助于我们快速找到html的节点信息。这篇文章主要介绍SelectorGadget的安装以及使用。
安装过程:&#9312;下载“SelectorGadget”(可直接在CSDN上搜索“SelectorGadget工具”即可看到上传的资源)
& &&#9313;打开谷歌浏览器,在谷歌浏览器右上角,点击,选择“更多工具”中的“扩展程序”,打开页面后,可直接将下载的SelectorGadget.crx拖拽到该页面即可。
& &#9314;完成后,会在谷歌浏览器页面右上角出现以下图标:
使用过程:&#9312;打开某个网站,例如当当网的图书排行榜:“http://bang.dangdang.com/books/bestsellers/01.00.00.00.00.00-recent7-0-0-1-1”
&&#9313;比如我们想获得书名的html节点信息,此时我们只需要先点击谷歌浏览器上图标,然后再在书名的点击,如图一所示:
在图一中,我们发现很多地方都变成高亮(即黄色部分),但是我们只想获得书名信息,所以我们需要去除多余的信息,此刻只需在不需要的部分再次点击,即可去掉选中部分。例如,我们图一的基础上再点击图上上面的“往年”的“2013年”,即点击图二上的“2013”年
二、爬虫利器Rvest包(摘录自https://zhuanlan.zhihu.com/p/?refer=rdatamining)
&rvest是R语言一个用来做网页数据抓取的包,包的介绍就是“更容易地收割(抓取)网页”。其中html_no
des()函数查找标签的功能非常好用。
相关的函数:
read_html():读取html文档;
html_nodes():获取指定名称的网页元素、节点;
html_text():获取指定名称的网页元素、节点文本;
html_attrs():
提取所有属性名称及内容;
html_attr():
提取指定属性名称及内容;
html_ tag():提取标签名称;
table():解析网页数据表的数据到R的数据框中;
session():利用cookie实现模拟登陆;
guess_encoding():返回文档的详细编码;
repair_encoding():用来修复html文档读入后乱码的问题。
&例子1:以&为例:
&library(rvest) & #加载Rvest包
&web&-read_html("https://book.douban.com/top250?icn=index-book250-all",encoding="UTF-8")&
#用read_html函数读取网页信息(类似Rcurl里的getURL),在这个函数里只需写清楚网址和编码(一般 就是UTF-8)即可
& position&-web %&% html_nodes("p.pl") %&% html_text()
&#获取节点信息。用%&%符号进行层级划分,也是管道操作符,意思是把左边的操作结果作为参数传递给右边的命令。web就是之前存储网页信息的变量,所以我们从这里开始,然后html_nodes()函数获取网页里的相应节点。在下面代码里我简单的重现了原网页里的一个层级结构。可以看到,实际上我们要爬取的信息在25个class属性为pl的标签里的文本。
例子2:抓取广州番禺Q房网二手房信息
library(xml2)
library(rvest)
library(stringr)
basicURL &- "http://guangzhou.qfang.com/sale/fanyu"
WebSpider &- function(m){
& url &- str_c(basicURL,"/f",m)
& web &- read_html(basicURL,encoding =
& name&- web %&%
html_nodes(".showKeyword")%&%html_text() #获取小区名
& address &- web %&%
html_nodes(".address~ span+ span") %&% html_text()#小区地址
& unitprice&- web %&%
html_nodes(".show-price p") %&% html_text() #租金
& data.frame(name,unitprice,address)
results &- data.frame()
for(m in 1:14){ #78为小区信息的总页码&
& results &-
rbind(results,WebSpider(m))#合并每一次循环输出的数据
&例子3:抓取广州番禺链家网二手房信息
library("xml2")
library("rvest")
library("stats")
library("base")
library("dplyr")
library("stringr")
#对爬取页数进行设定并创建数据框
house_inf&-data.frame()
#使用for循环进行批量数据爬取(发现url的规律,写for循环语句)
for (i in 1:100){
read_html(str_c("https://gz.lianjia.com/ershoufang/panyu/pg",i),encoding="UTF-8")
house_name&-web%&%html_nodes(".houseInfo
a")%&%html_text()
house_basic_inf&-web%&%html_nodes(".houseInfo")%&%html_text()
house_basic_inf&-str_replace_all(house_basic_inf," ","")
house_address&-web%&%html_nodes(".positionInfo
a")%&%html_text()
house_totalprice&-web%&%html_nodes(".totalPrice")%&%html_text()
house_unitprice&-web%&%html_nodes(".unitPrice
span")%&%html_text()
& #创建数据框存储以上信息
house&-data_frame(house_name,house_basic_inf,house_address,house_totalprice,house_unitprice)
& house_inf&-rbind(house_inf,house)
例子3:用R来爬取MDB上2016年最热门电影的一些特征。
library(xml2)
library(rvest)
library(stringr)
url &- 'http://www.imdb.com/search/title?
count=100&release_date=&title_type=feature&page=1&ref_=adv_prv'
webpage &- read_html(url,encoding = "UTF-8")
rank&- html_nodes(webpage,'.text-primary')%&%html_text()
%&% as.numeric()#电影序列号
title&- html_nodes(webpage,'.lister-item-header
a')%&%html_text()
description&- html_nodes(webpage,'.ratings-bar+
.text-muted')%&%html_text()
# 移除 '\n'
description&-gsub("\n","",description)
# 爬取runtime section
runtime&- html_nodes(webpage,'.text-muted
.runtime')%&%html_text()
# 数据预处理: 去除“min”并把数字转换为数值型
runtime&- gsub("
min","",runtime)%&%as.numeric()
# 爬取genre
html_nodes(webpage,'.genre')%&%html_text()
# 去除“\n”
genre&-gsub("\n","",genre)
# 去除多余空格
genre&-gsub(" ","",genre)
# 每部电影只保留第一种类型
genre&-gsub(",.*","",genre)
# 转化为因子
genre&-as.factor(genre)
# 爬取IMDB rating
rating&- html_nodes(webpage,'.ratings-imdb-rating
strong')%&%html_text()%&%as.numeric()
# 爬取votes section
votes&- html_nodes(webpage,'.sort-num_votes-visible
span:nth-child(2)')%&%html_text()
# 移除“,”
votes&-gsub(",", "", votes)%&%as.numeric()
# 爬取directors section
directors&- html_nodes(webpage,'.text-muted+ p
a:nth-child(1)')%&%html_text()
# 转为因子
directors&-as.factor(directors)
# 爬取actors section
actors&- html_nodes(webpage,'.lister-item-content .ghost+
a')%&%html_text()
# 转为因子
actors&-as.factor(actors)
# 爬取metascore section
metascore&-
html_nodes(webpage,'.metascore')%&%html_text()
metascore&-gsub(" ","",metascore)
score只有47个数据,可我们却爬取了50部电影。这个问题产生的原型是由3部电影没有Metascore数据。
#这是爬取所有网页都会遇到的常见问题,如果我们只是简单地用NA来填充这3个缺失值,它会自动填充第48到50部电影。
#通过一些可视化检查,我们发缺失matascore的是第33,42和48部电影。
for (i in c(33,42,48)){
& a &- metascore[1:(i-1)]
& b&-metascore[i:length(metascore)]
& metascore&- append(a, list("NA"))
& metascore&- append(metascore, b)
# 转换为数值型
metascore&- as.numeric(metascore)
summary(metascore)
#同样的问题也会发生在Gross变量上,我用同样的方式来解决
# 爬取revenue section
gross&- html_nodes(webpage,'.ghost~ .text-muted+
span')%&%html_text()
# 去除'$' 和 'M' 标记
gross&- gsub("M", "", gross)
gross&- substring(gross, 2, 6)
length(gross)
# 填充缺失值
for (i in c(2,29,33,42,48)){
& a &- gross[1:(i-1)]
& b &- gross[i:length(gross)]
& gross &- append(a, list("NA"))
& gross&- append(gross, b)
# 转为数值
gross&-as.numeric(gross)
#我们已经成功爬取了100部电影的11个特征,让我们创建一个数据框并看看结构。
movies_df &- data.frame(
& Rank = rank,&
& Title = title,
& Description =
description,&
& Runtime = runtime,
& Genre = genre,&
& Rating = rating,
& Metascore =
metascore,&
& Votes = votes, &
& Gross_Earning_in_Mil = gross,
& Director =
directors,&
& Actor = actors
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 vlookup函数的使用方法 的文章

 

随机推荐