R-大数据分析挖掘(2-R爬虫)
RCurl作者:
==RCurl、XML、RSPython、Rmatlab
个人主页:http://anson.ucdavis.edu/~duncan/
(一)什么是curl
curl:利用URL语法在命令行的方式下工作的开元文件传输工具
curl背后的库就是libcurl
功能为:获得页面,有关认证,上传下载,信息搜索
(二)Http协议目前使用的是HTTP/1.1
它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器
(三)Rcurl三大函数
- getUrl()
- getForm()
- postForm()
利用getUrl查看相关信息 url.exists()
(1)
实验代码:
(2)
(3)
实验:
(4)
myheader <- c(
"User-Agent"="Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.6) ",
"Accept"="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Language"="en-us",
"Connection"="keep-alive",
"Accept-Charset"="GB2312,utf-8;q=0.7,*;q=0.7")
注:
和
(5)
(三)curl部分参数设置
(四)XMLParse
需要安装:XML
表格、 网页节点
对标准 XML 文件的解析函数xmlParse
对html的解析函数htmlTreeParse
下载表格:
(五)
抓取地震数据:
url <-" http://data.earthquake.cn/datashare/datashare_more_quickdata_new.jsp";
wp <- getURL(url)
doc <-htmlParse(wp,asText = TRUE)
tables <- readHTMLTable(doc,header=F)
参数which:
出错::
(六)Xpath
综合实例:R抓取CSDN数据
crawler<-function(url,xpath,content="text"){ num_url<-length(url) result<-data.frame(url=0,vari=0) i<-1#记录第几个url tmp<-1# for(i_url in url){ i_url_parse<-htmlParse(i_url,encoding="UTF-8")#读取url网页数据,并使用htmlParse转化。(xml文件使用xmlParse) node<-getNodeSet(i_url_parse,xpath)#通过xpath找到相应变量的xpath结点 if(length(node)==0){#未爬取到数据,说明xpath有误 result[tmp,1]<-i result[tmp,2]<-NA print(paste("注意:变量未能在第",i,"个页面中找到,我们会把该数据写为空值")) tmp<-tmp+1 }else{ for(j in 1:length(node)){ result[tmp,1]<-i if(content=="text"){#欲爬取变量的内容 result[tmp,2]<-xmlValue(node[[j]]) }else{#欲爬取变量的属性 print(node[[j]]) result[tmp,2]<-xmlGetAttr(node[[j]],content) } tmp<-tmp+1 } } i<-i+1 } result } url1<-"http://www.csdn.net/tag/" xpath<-"//div[@class='overflow']/a" content<-"text" crawler(url1,xpath,content)
注意:
1.抓取地震数据
2.爬虫的多线程
1. 爬取任务的管理问题:
需要先将爬取的url列表,分成一些task,不同的task由不同的r程序进行处理
任务的处理状态,需要r 更新到任务的维护列表
出现任务挂掉时,需要可以读取上次任务爬取的点,数据库
如果量很大:可以通过redis
2.爬取程序,需要写成r程序脚本
linux: crontab
windows: 计划任务
3.爬取动态ip的问题
1.爬虫的动态代理
1.先获取一个iP池,百度搜索ip代理
2.在程序中,动态的换 http 的ip属性
爬的过程要保持一个间隔,4秒