注意:这文章是2月份写的,拉勾网早改版了,代码已经失效了,大家意思意思就好,主要看代码的使用方法吧。。

最近一直在用且有维护的另一个爬虫是KINDLE 特价书爬虫,blog地址见此: http://www.cnblogs.com/weibaar/p/4824578.html

博客内容简介及目录 http://www.cnblogs.com/weibaar/p/6644261.html

R语言爬虫初尝试-基于RVEST包学习

Thursday, February 26, 2015

在学完coursera的getting and Cleaning data后,继续学习用R弄爬虫网络爬虫。主要用的还是Hadley Wickham开发的rvest包。再次给这位矜矜业业开发各种好用的R包的大神奉上膝盖

查阅资料如下:

  1. rvest的github
  2. rvest自身的帮助文档
  3. 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://www.lagou.com/jobs/378361.html
## 45 Levels: http://www.lagou.com/jobs/113293.html ...
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>"

注意事项:

  1. 对于被编码保护的数据(如国外yellow.local.ch,email被编码保护了。需要用 decodeURIComponent函数反编译。)

  2. xpath语句对html_nodes适用。但是它好像是全局语句。。就是如果用div[1]//span[4]取数的话,它直接就只出全局的那个结果。。。

  3. 取数,可以用li.da或者li.daew取数,两者等价
  4. 正则表达式很有用!!尤其是对网页数据,某些不会写,或者技术高超不愿意被我们爬虫的工程师,用rvest去抓数据,会抓到一堆堆乱码= =这几天练习下来感受到了无尽恶意

  5. 中文,html(data,encoding='UTF-8')还有iconv(data,'utf-8','gbk')可以有效避免大部分乱码。但是R对中文支持真的很渣。

  6. rvest对于静态抓取很方便!但是对于脚本访问的网页,还需要继续学习RCurl包。备查资料如下:

  等学会了再写总结。

以及最后的最后,近期研究重点应该是IT金融?受张丹老师的两条均线与R语言)鼓舞好大!我觉得学R嘛,用到实处才是重要的!玩爬虫玩的太开心都没跟JHU的课了。。。。

以后可以尝试按照自己和老爸的看股票习惯开发出类似的选股模型来~~

以及,我之前有看到有个牛人用python爬了各大网站程序员相关的招聘信息:程序员网站codejob 有兴趣的可以去看看。

我的博客

博客总目录:http://www.cnblogs.com/weibaar/p/4507801.html

R语言爬虫初尝试-基于RVEST包学习的更多相关文章

  1. 用R语言 画条形图(基于ggplot2包)

    1.用qplot(x,data=data,geom.=”bar”,weight=y)+scale_y_continuous("y")画出y关于x的条形. 图中提示binwidth这 ...

  2. R语言网络爬虫学习 基于rvest包

    R语言网络爬虫学习 基于rvest包 龙君蛋君:2015年3月26日 1.背景介绍: 前几天看到有人写了一篇用R爬虫的文章,感兴趣,于是自己学习了.好吧,其实我和那篇文章R语言爬虫初尝试-基于RVES ...

  3. R 语言爬虫 之 cnblog博文爬取

    Cnbolg Crawl a). 加载用到的R包 ##library packages needed in this case library(proto) library(gsubfn) ## Wa ...

  4. 简单R语言爬虫

    R爬虫实验 R爬虫实验 PeRl 简单的R语言爬虫实验,因为比较懒,在处理javascript翻页上用了取巧的办法. 主要用到的网页相关的R包是: {rvest}. 其余的R包都是常用包. libra ...

  5. 给社团同学做的R语言爬虫分享

    大家好,给大家做一个关于R语言爬虫的分享,很荣幸也有些惭愧,因为我是一个编程菜鸟,社团里有很多优秀的同学经验比我要丰富的多,这次分享是很初级的,适用于没有接触过爬虫且有一些编程基础的同学,内容主要有以 ...

  6. R爬虫实战1(学习)—基于RVEST包

    这里用Hadley Wickham开发的rvest包.再次给这位矜矜业业开发各种好用的R包的大神奉上膝盖. 查阅资料如下: rvest的github rvest自身的帮助文档 rvest + CSS ...

  7. R语言爬虫:Rvest包函数介绍(表格)

    Rvest 包中常用函数一览: 函数 作用 read_html() 读取 html 页面 html_nodes() 提取所有符合条件的节点 html_node() 返回一个变量长度相等的list,相当 ...

  8. 在R语言环境中无法载入rJava包的解决办法

    问题描述: 安装包xlsx包后,运行library("xlsx")后弹出错误窗口: RGui (64-bit): Rgui.exe - 系统错误 无法启动此程序,因为计算机中丢失 ...

  9. 第一篇:R语言数据可视化概述(基于ggplot2)

    前言 ggplot2是R语言最为强大的作图软件包,强于其自成一派的数据可视化理念.当熟悉了ggplot2的基本套路后,数据可视化工作将变得非常轻松而有条理. 本文主要对ggplot2的可视化理念及开发 ...

随机推荐

  1. MongoDB官方C#驱动中查询条件Query用法

    Query.All("name", "a", "b");//通过多个元素来匹配数组 Query.And(Query.EQ("nam ...

  2. MongoDB数据库用户名和密码的设置

    首先是对MongoDB用户和权限的设置,如果不设置用户的话,直接使用mongo命令就可以进入客户端shell界面进行操作了,但是如果没有设置用户的话,总感觉少了点什么,于是经过半天的查找和实践,差不多 ...

  3. MySQL双主(主主)架构方案

    在企业中,数据库高可用一直是企业的重中之重,中小企业很多都是使用mysql主从方案,一主多从,读写分离等,但是单主存在单点故障,从库切换成主库需要作改动.因此,如果是双主或者多主,就会增加mysql入 ...

  4. 【2016-10-25】【坚持学习】【Day12】【WPF】【Telerik】【VirtualtionData 虚拟化数据】

    VirtualQueryableCollectionView When working with the UI components that enable UI Virtualization, yo ...

  5. HDU3466 Proud Merchants[背包DP 条件限制]

    Proud Merchants Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) ...

  6. sql left join on

    select sysuser.userid,       sysuser.groupid,       sysuser.sysid,       nvl( userjd.mc,nvl(useryy.m ...

  7. bootstrap 组件

      bootstrap  组件 1下拉菜单(dropdown)  下拉菜单切换(dropdown-toggle)  下拉菜单对齐(dropdown-menu-right-右对齐) 下拉菜单分割线(di ...

  8. LeetCode:Multiply Strings

    题目链接 Given two numbers represented as strings, return multiplication of the numbers as a string. Not ...

  9. 第一个Android应用--签证无忧 上线

    用了大概1个多星期的时间,把一个简单的应用完成,[签证无忧]是基于在我所在公司办理签证的前提下,为方便客户查询进度所开发,后来我加了淘宝的购买链接,这样客人在以后需要时不需要到淘宝查找了. 签证无忧这 ...

  10. python学习之day5,装饰器,生成器,迭代器,json,pickle

    1.装饰器 import os import time def auth(type): def timeer(func): def inner(*args,**kwargs): start = tim ...