一份新手友好的R语言爬虫教程

Chrome开发工具

2019-06-03 11.31.42.gif

对网页进行刷新

image.png

Accept

可以接收信息的格式

User-agent

User Agent中文名为用户代理,是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA。它是一个特殊字符串头,是一种向访问网站提供你所使用的浏览器类型及版本、操作系统及版本、浏览器内核、等信息的标识。通过这个标识,用户所访问的网站可以显示不同的排版从而为用户提供更好的体验或者进行信息统计;例如用手机访问谷歌和电脑访问是不一样的,这些是谷歌根据访问者的UA来判断的。UA可以进行伪装。
浏览器的UA字串的标准格式:浏览器标识 (操作系统标识; 加密等级标识; 浏览器语言) 渲染引擎标识版本信息。但各个浏览器有所不同。

Cookie*

但在计算机语言中,Cookie指的是当你浏览某网站时,网站存储在你电脑上的一个小文本文件,伴随着用户请求和页面在 Web 服务器和浏览器之间传递。它记录了你的用户ID,密码、浏览过的网页、停留的时间等信息,用于用户身份的辨别。Cookie通常是以user@domain格式命名的,user是你的本地用户名,domain是所访问的网站的域名。

Referer

跳转之前的链接(反爬)

状态码

1xx提示信息- 表示请求已被成功接收,继续处理

2xx成功。表示请求已被成功接收,理解,接收

3xx重定向-要完成请求必须进行更进一步的处理

4xx客户端错误-请求有语法错误或者请求无法实现

5xx服务器端错误-服务器未能实现合法的请求

爬虫利器SelectorGadget

SelectorGadget是一个Google的扩展程序,它的作用就是可以帮助你快速提取指定目标的xpath,并且操作十分方便,下面我来给大家展示一下如何使用。

如何下载

下载地址

百度网盘

如何安装

1.找到chrome的扩展程序
5c284e5cc1972

注意开发者模式已经打开

2.将下载后的插件程序 拖拽到扩展程序页面,就会提示安装,按照指示操作即可

爬取新浪财经个股点评

需要的程序包

rvest

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

rvest是R用户使用率最多的爬虫包,它简洁的语法可以解决大部分的爬虫问题。

xml2

读取HTML和XML格式数据。

第一次使用要安装程序包
install.package('rvest','xml2')

读取网页

1.以新浪财经为例:

image
library('rvest')
library('xml2')
url<-paste('http://finance.sina.com.cn/roll/index.d.html?cid=56589&page=1') #指定url

2.在网页空白处右键点击“查看网页源码”(本教程使用chrome),结果如下:

image
webpage<-read_html(url,encoding = 'utf-8') #在源码中搜索“charset”查找该网页编码方式

选取目标页面元素

1.利用SelectorGadget 选取目标页面元素,黄色为选中,SelectorGadget下载和安装

2.去到误选,再次单击即可,结果如下:

image
image
news_html<-html_nodes(webpage,'.list_009 a')

提取指定元素中的文本

news<-html_text(news_html)head(news)    #查看前6行

存储结果

news<-write.csv(news,file=paste("C:/Users/Administrator/Desktop/news.csv"))

getwd()

爬取今日特价

  • Rcurl完成网站的访问
  • XML通过HTML树结构筛选提取信息
library(RCurl)
library(XML)

什么要反爬虫

会有人不断的发起请求获取数据,动态服务器会有大量的异常错误/正常的意外流量,如果不反,流量被浪费在了(程序员/组织)获取数据上而不是分发(到用户)数据上能够正常获取数据后爬虫的消耗(相对正常用户)很大。
我们为了顺利完成爬虫任务,我们需要对爬虫身份进行伪装:

myheader<-c(
  
  "User-Agent"="Mozilla/5.0 (Linux; U; Android 1.0; en-us; dream) AppleWebKit/525.10 (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2 ",
  
  "Accept-Language"="en-us",
  
  "Connection"="keep-alive",
  
  "Accept-Charset"="GB2312,utf-8;q=0.7,*;q=0.7")#伪装header,防止不能爬取

getURL()

用于发送请求

temp<-getURL("http://tejia.aili.com/",httpheader=myheader,encoding="UTF-8")#获取链接

htmlParse()

对网页进行解析

k=htmlParse(temp,encoding="UTF-8")#解析
k

getNodeSet()

对需要爬取的元素进行定位
getNodeSet(doc, path...)
doc 就是html树文件对象,path 就是元素路径。可以用/从根元素一层层指定路径,也可以用//直接定位到某一层元素。
下面的元素路径由SelectorGadget进行获取。

youhui=sapply(getNodeSet(k,'//*[contains(concat( " ", @class, " " ), concat( " ", "indx_li", " " ))]//span'),xmlValue)
#其中sapply函数则是为了将xmlvalue类型的数据集合转化为R语言中常见的向量形式
write.table(youhui,"youhui.txt")#将结果保存

今日特价爬虫加强版

仅仅伪装一个身份怎么够神秘,利用sample()对设备信息进行轮换。

UserAgent=c(
  "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
  "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.16 Safari/537.36",
  "Mozilla/5.0 (Windows NT 6.1; Intel Mac OS X 10.6; rv:7.0.1) Gecko/20100101 Firefox/7.0.1",
  "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 OPR/18.0.1284.68",
  "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)",
  "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
  "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)",
  "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36",
  "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
  "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:7.0.1) Gecko/20100101 Firefox/7.0.1",
  "Opera/9.80 (Macintosh; Intel Mac OS X 10.9.1) Presto/2.12.388 Version/12.16",
  "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36 OPR/18.0.1284.68",
  "Mozilla/5.0 (iPad; CPU OS 7_0 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) CriOS/30.0.1599.12 Mobile/11A465 Safari/8536.25",
  "Mozilla/5.0 (iPad; CPU OS 8_0 like Mac OS X) AppleWebKit/600.1.3 (KHTML, like Gecko) Version/8.0 Mobile/12A4345d Safari/600.1.4",
  "Mozilla/5.0 (iPad; CPU OS 7_0_2 like Mac OS X) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A501 Safari/9537.53",
  "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",    
  "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
  "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0"
)
n=length(UserAgent)
myheader<-c(
  "User-Agent"=UserAgent[sample(n-1,1)],#随机选择
  "Accept-Language"="en-us",
  "Connection"="keep-alive",
  "Accept-Charset"="GB2312,utf-8;q=0.7,*;q=0.7")

通过写循环爬取多页,为了减缓服务器的负担,利用Sys.sleep(5),运行前睡眠5秒。

urllist=0
page=1:3
urllist[page]=paste("http://tejia.aili.com/index_",page,".html",sep='')
for(url in urllist){
  temp<-getURL(url,encoding="utf-8",httpheader=myheader)#
  k=htmlParse(temp,asText=T,encoding="utf-8")
  review=sapply(getNodeSet(k,'//*[contains(concat( " ", @class, " " ), concat( " ", "indx_li", " " ))]//span'),xmlValue)
  review[page]
  cat(url,"\n")
  write.table(review,"/Users/song/Desktop/yohui.txt",quote = FALSE,row.names = TRUE,
              col.names = FALSE,append=T)
  Sys.sleep(5)#睡眠5秒
}

你可能感兴趣的:(一份新手友好的R语言爬虫教程)