R语言网络数据爬取
现在大家对爬虫的兴趣不断高涨,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. 网页标题的爬取
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语言网络数据爬取的更多相关文章
- R语言爬虫:爬取百度百科词条
抓取目标:抓取花儿与少年的百度百科中成员信息 url <- "http://baike.baidu.com/item/%E8%8A%B1%E5%84%BF%E4%B8%8E%E5%B0 ...
- R语言爬虫:爬取包含所有R包的名称及介绍
第一种方法 library("rvest") page <- read_html("https://cran.rstudio.com/web/packages/av ...
- python3编写网络爬虫13-Ajax数据爬取
一.Ajax数据爬取 1. 简介:Ajax 全称Asynchronous JavaScript and XML 异步的Javascript和XML. 它不是一门编程语言,而是利用JavaScript在 ...
- R语言网络爬虫学习 基于rvest包
R语言网络爬虫学习 基于rvest包 龙君蛋君:2015年3月26日 1.背景介绍: 前几天看到有人写了一篇用R爬虫的文章,感兴趣,于是自己学习了.好吧,其实我和那篇文章R语言爬虫初尝试-基于RVES ...
- 利用Python网络爬虫爬取学校官网十条标题
利用Python网络爬虫爬取学校官网十条标题 案例代码: # __author : "J" # date : 2018-03-06 # 导入需要用到的库文件 import urll ...
- python实现人人网用户数据爬取及简单分析
这是之前做的一个小项目.这几天刚好整理了一些相关资料,顺便就在这里做一个梳理啦~ 简单来说这个项目实现了,登录人人网并爬取用户数据.并对用户数据进行分析挖掘,终于效果例如以下:1.存储人人网用户数据( ...
- 芝麻HTTP:JavaScript加密逻辑分析与Python模拟执行实现数据爬取
本节来说明一下 JavaScript 加密逻辑分析并利用 Python 模拟执行 JavaScript 实现数据爬取的过程.在这里以中国空气质量在线监测分析平台为例来进行分析,主要分析其加密逻辑及破解 ...
- 如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)
前天给大家分享了如何利用Python网络爬虫爬取微信朋友圈数据的上篇(理论篇),今天给大家分享一下代码实现(实战篇),接着上篇往下继续深入. 一.代码实现 1.修改Scrapy项目中的items.py ...
- quotes 整站数据爬取存mongo
安装完成scrapy后爬取部分信息已经不能满足躁动的心了,那么试试http://quotes.toscrape.com/整站数据爬取 第一部分 项目创建 1.进入到存储项目的文件夹,执行指令 scra ...
- Ajax数据爬取
Ajax的基本原理 以菜鸟教程的代码为例: XMLHTTPRequest对象是JS对Ajax的底层实现: var xmlhttp; if (window.XMLHttpRequest) { // IE ...
随机推荐
- lvds接口
1.lvds就是差分信号接口,tft-lcd屏幕,一种常用的接口. 2.有3种标准,18bit, 24bit(JEIDA) 与 24bit(VESA) 详细看https://www.topwaydis ...
- C#找出可用TCP端口,仅两行代码就搞定
var start = 2222; var ps = IPGlobalProperties.GetIPGlobalProperties().GetActiveTcpListeners().Select ...
- 上分之路 VP Codeforces Round #744 (Div. 3) ABDE
VP情况 4 / 8 AC: A,B,D,E1 60 minutes WA: C 4 127 +00:02 +00:28 -7 +00:58 +00:39 手速还在线 D pair排个 ...
- PLC入门笔记12
1.边沿应用 (1)边沿开关 (2)上升沿触发 下降沿触发 (3) MOVP K4M0 D0 传送比较 movp (=mov) 脉冲型指令 前面条件成立只能执行一次,仅执行一次扫描周期 不带P MOV ...
- day28_常用模块——hashlib,logging模块
hashlib(摘要算法) Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等. 什么是摘要算法呢?摘要算法又称哈希算法.散列算法.它通过一个函数,把任意长度的数据转换为一个长度 ...
- Hive 操作与应用 词频统计
一.hive用本地文件进行词频统计 1.准备本地txt文件 2.启动hadoop,启动hive 3.创建数据库,创建文本表 4.映射本地文件的数据到文本表中 5.hql语句进行词频统计交将结果保存到结 ...
- vue + vant 移动端适配
1. 设置动态根字号大小,/public/phone-adapt.js,在index.html中引入 (function (doc, win) { const docEl = win.document ...
- C语言基础题 22年5月
(十六进制 %x 20.0f是%f long 是%ld unsigned int %#o ) 编程题: 整数浮点数的上溢下溢 strcpy函数代码 int search(char *s, ch ...
- Oracle-安装问题:Win10系统离线安装framework3.5报0x8024402c的问题
Oracle-安装问题:Win10系统离线安装framework3.5报0x8024402c的问题 像神州信用政府版本相关的系统都不允许联网,也就需要离线安装下,Net3.5之类的文件 具体步骤可以参 ...
- MYSQL 变更账号密码
#1 首先找到Mysql[安装的路径],切换到对应的bin目录,例如安装在D盘 C:User\Administrator> d:(输入盘符回车) D:\> cd D:\MySQL\MySQ ...