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

一、rvest包简介与安装

rvest包是hadley大神的又一力作,使用它能更方便地提取网页上的信息,包括文本、数字、表格等,本文对rvest包的运用做一个详细介绍,希望能够帮助你在网页抓取的武器库中新添一把利器。

1.rvest包的安装与加载

install.packages("rvest")
library(rvest)

2.rvest包的函数

函数 作用
read_html() 读取 html 页面
html_nodes() 提取所有符合条件的节点
html_node() 返回一个变量长度相等的list,相当于对html_nodes()取[[1]]操作
html_table() 获取 table 标签中的表格,默认参数trim=T,设置header=T可以包含表头,返回数据框
html_text() 提取标签包含的文本,令参数trim=T,可以去除首尾的空格
html_attrs(nodes) 提取指定节点所有属性及其对应的属性值,返回list
html_attr(nodes,attr) 提取节点某个属性的属性值
html_children() 提取某个节点的孩子节点
html_session() 创建会话

二、rvest包应用示例

1. 网页标题的爬取

新浪NBA

R语言代码
library(pacman)
p_load(xml2,rvest,dplyr,stringr,tidyverse)
urlb <- "http://sports.sina.com.cn/nba/"
web<-read_html(urlb)
title<-web %>% html_nodes(".item p a") %>% html_text()
爬取结果
 title
[1] "利拉德挖墙角?点赞联手艾顿言论组冲冠新搭档"
[2] "保罗:我不会在明天退役 有伤在身但不想多谈"
[3] "连续两场大胜共赢60分 东契奇:根本停不下来"
[4] "基德讽刺看不起他们的人 没错,是一场大屠杀"
[5] "艾顿不满被雪藏和主帅爆发冲突 续约前景黯淡"
[6] "保罗正负值-39创生涯纪录 太阳还有比他更糟的"

2. 网页表格的爬取

上海证券交易所_上证综合指数成分股列表 (sse.com.cn)

R语言代码
library(pacman)
p_load(XML,rvest,dplyr,stringr,tidyverse)
urlb <- "http://www.sse.com.cn/market/sseindex/indexlist/s/i000001/const_list.shtml"
#xpath <- '//*[@id="content_ab"]/div[1]/table'
nodes <- html_nodes(read_html(urlb), ".tablestyle")
#nodes<- html_nodes(read_html(urlb), xpath=xpath)
tables <- html_table(nodes)
restab <- tables[[1]]
head(restab)
爬取结果
  <chr>                              <chr>                              <chr>
1 "浦发银行\r\n (600000)" "白云机场\r\n (600004)" "东风~
2 "中国国贸\r\n (600007)" "首创环保\r\n (600008)" "上海~
3 "包钢股份\r\n (600010)" "华能国际\r\n (600011)" "皖通~
4 "华夏银行\r\n (600015)" "民生银行\r\n (600016)" "日照~
5 "上港集团\r\n (600018)" "宝钢股份\r\n (600019)" "中原~
6 "上海电力\r\n (600021)" "山东钢铁\r\n (600022)" "浙能~
爬取结果整理
library(tidyverse)
pat1 <- "^(.*?)\\((.*?)\\)"
tab1 <- restab %>%
## 将三列合并为一列,结果为字符型向量
reduce(c) %>%
## 去掉空格和换行符,结果为字符型向量
stringr::str_replace_all("[[:space:]]", "") %>%
## 提取公司简称和代码到一个矩阵行,结果为字符型矩阵
stringr::str_match(pat1)
tab <- tibble(
name = tab1[,2],
code = tab1[,3])
head(tab)
  name     code
<chr> <chr>
1 浦发银行 600000
2 中国国贸 600007
3 包钢股份 600010
4 华夏银行 600015
5 上港集团 600018
6 上海电力 600021

3. 网页连接的爬取

澎湃精选

R语言代码
library(rvest)
library(stringr)
url <-"https://thepaper.cn/"
web <- read_html(url) #读取html网页的函数
news <- web %>% html_nodes('h2 a')
title <- news %>% html_text() #获取其中的文字部分
link <- news %>% html_attrs() #获取每个标题对应的网址 link1 <- c(1:length(link))
for(i in 1:length(link1))
{
link1[i]<- link[[i]][1]
}
link2 <- paste("https://www.thepaper.cn/",link1,sep="")
爬取结果
link2
[1] "https://www.thepaper.cn/newsDetail_forward_18113579"
[2] "https://www.thepaper.cn/newsDetail_forward_18111927"
[3] "https://www.thepaper.cn/newsDetail_forward_18112840"
[4] "https://www.thepaper.cn/newsDetail_forward_18112721"
[5] "https://www.thepaper.cn/newsDetail_forward_18113483"
[6] "https://www.thepaper.cn/newsDetail_forward_18113503"
[7] "https://www.thepaper.cn/newsDetail_forward_18113375"
[8] "https://www.thepaper.cn/newsDetail_forward_18113493"
爬取整体结果
library(rvest)
library(stringr)
url <-"https://www.thepaper.cn/" web <- read_html(url) #读取html网页的函数
news <- web %>% html_nodes('h2 a')
title <- news %>% html_text() #获取其中的文字部分
link <- news %>% html_attrs() #获取每个标题对应的网址
link1 <- c(1:length(link))
for(i in 1:length(link1))
{
link1[i]<- link[[i]][1]
}
link2 <- paste("https://www.thepaper.cn/",link1,sep="") ##获得每条新闻的全文
news_content<-c(1:length(link2))
for(i in 1:length(link2))
{
web1 <- read_html(link2[i])
{
if(length(html_nodes(web1,'div.news_txt'))==1)
news_content[i]<- html_text(html_nodes(web1,'div.news_txt'))
else
news_content[i]<- trimws(str_replace_all((html_text(html_nodes(web1,'div.video_txt_l p'))), "[\r\n]" , ""))
}
} ##获得每条新闻的时间
news_date <- c(1:length(link2))
for(i in 1:length(link2))
{
web1 <- read_html(link2[i])
{
if(length(html_nodes(web1,'div.news_txt'))==1)
news_date[i]<- trimws(str_replace_all((html_text((html_nodes(web1, "div p"))[2])), "[\r\n]" , ""))
else
news_date[i]<- trimws(str_replace_all((html_text(html_nodes(web1,'div.video_txt_l span'))), "[\r\n]" , ""))
}
} date <- c(1:length(link2))
time <- c(1:length(link2))
for(i in 1:length(link2))
{
date[i] <- substring(news_date[i],1,10)
time[i] <- substring(news_date[i],12,16) # is.character(news_date[i])
} news_01 <- data.frame(title,date,time,url=link2,news_content)
write.csv(news_01,file=" news_information.csv")

爬取结果展示

总结

rvest的确是一个很好地数据抓取工具,不过他的强项更多在于网页解析,你可能惊艳于rvest强大的解析能力,有两套解析语法可选(Xpath、css),短短几个关键词路径就可以提取出来很重要的数据。网络爬虫是讲呈现在网页上以非结构格式(html)存储的数据转化为结构化数据的技术,该技术非常简单易用。rvest是R用户使用率最多的爬虫包,它简洁的语法可以解决大部分的爬虫问题。

参考文献

1.(R语言 网站数据获取 (rvest)——网络爬虫初学)[https://www.cnblogs.com/adam012019/p/14862610.html]

2.(R语言简单动态网页爬虫(rvest包)示例)[https://blog.csdn.net/seeyouer1205/article/details/117218645]

R语言网络数据爬取的更多相关文章

  1. R语言爬虫:爬取百度百科词条

    抓取目标:抓取花儿与少年的百度百科中成员信息 url <- "http://baike.baidu.com/item/%E8%8A%B1%E5%84%BF%E4%B8%8E%E5%B0 ...

  2. R语言爬虫:爬取包含所有R包的名称及介绍

    第一种方法 library("rvest") page <- read_html("https://cran.rstudio.com/web/packages/av ...

  3. python3编写网络爬虫13-Ajax数据爬取

    一.Ajax数据爬取 1. 简介:Ajax 全称Asynchronous JavaScript and XML 异步的Javascript和XML. 它不是一门编程语言,而是利用JavaScript在 ...

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

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

  5. 利用Python网络爬虫爬取学校官网十条标题

    利用Python网络爬虫爬取学校官网十条标题 案例代码: # __author : "J" # date : 2018-03-06 # 导入需要用到的库文件 import urll ...

  6. python实现人人网用户数据爬取及简单分析

    这是之前做的一个小项目.这几天刚好整理了一些相关资料,顺便就在这里做一个梳理啦~ 简单来说这个项目实现了,登录人人网并爬取用户数据.并对用户数据进行分析挖掘,终于效果例如以下:1.存储人人网用户数据( ...

  7. 芝麻HTTP:JavaScript加密逻辑分析与Python模拟执行实现数据爬取

    本节来说明一下 JavaScript 加密逻辑分析并利用 Python 模拟执行 JavaScript 实现数据爬取的过程.在这里以中国空气质量在线监测分析平台为例来进行分析,主要分析其加密逻辑及破解 ...

  8. 如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)

    前天给大家分享了如何利用Python网络爬虫爬取微信朋友圈数据的上篇(理论篇),今天给大家分享一下代码实现(实战篇),接着上篇往下继续深入. 一.代码实现 1.修改Scrapy项目中的items.py ...

  9. quotes 整站数据爬取存mongo

    安装完成scrapy后爬取部分信息已经不能满足躁动的心了,那么试试http://quotes.toscrape.com/整站数据爬取 第一部分 项目创建 1.进入到存储项目的文件夹,执行指令 scra ...

  10. Ajax数据爬取

    Ajax的基本原理 以菜鸟教程的代码为例: XMLHTTPRequest对象是JS对Ajax的底层实现: var xmlhttp; if (window.XMLHttpRequest) { // IE ...

随机推荐

  1. function | fastica

    fastica - Fast Independent Component Analysis FastICA for Matlab 7.x and 6.x Version 2.5, October 19 ...

  2. PLC入门笔记5

    定时器指令及其应用 定时器指令介绍 设备启动预热时间.化学反应时间.电机星三角转换时间? 我们需要定时器.PLC计时器指令由时间续电器演变而来. 定时器本质是一个输出指令. 主要功能是,当输入端有能流 ...

  3. centos 挂载共享目录

    共享目录://10.253.47.102/share/文件传递暂用 将共享路径挂载到centos /etc/fstab  添加一行配置,mount -a 生效

  4. git reset命令适用场景详解

    ☆ git reset 场景1:本地开发环境,已提交N个commit.但尚未push,希望:①丢弃本地所有的更改,代码强制回退到某个历史版本. 解决办法:git reset --hard HEAD~回 ...

  5. web后端之连接mysql

    1建立java enterprise项目 2在WEB-INF目录下建立lib目录把jdbc用的mysql-connector-java.jar包复制过来 3添加依赖       4编写class 或在 ...

  6. 3Des加密解密,java c#通用。

    1.需要实现对其他系统的单点登陆,我们实现的方法很简单,就是将当前系统的账号通过加密去获取 需要直接登陆上的系统的token,然后访问需直接登陆的系统就带着token,就相当于登陆了. 2.然后呢,我 ...

  7. redis事务和锁机制、持久化操作RDB/AOF

    一.Redis事务介绍 Redis事务是一个单独的隔离操作 :事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断.Redis事务的主要作用就是串联多个 ...

  8. springmvc接口访问流程排查

    首先找到webapp下面的web.xml文件: 检查前端控制器: 并注意contextConfigLocation配置的springmvc的配置文件路径: 接着找到springmvc配置文件路径,如果 ...

  9. 通过简单实现一个阻塞队列了解ReentraintLock

    MyBlockingQueue 代码 package com.kms.test; import java.util.LinkedList; import java.util.concurrent.lo ...

  10. python跨文件之全局变量

    Python中的global关键字,你了解吗? - 知乎 (zhihu.com)  global 关键字 python跟C不一样,c是在一个文件定义后在另一个文件声明下是extern变量就好.pyth ...