设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3473|回复: 6

网页爬虫-R语言实现基本函数

  [复制链接]

11

主题

101

金钱

158

积分

入门用户

发表于 2019-11-5 15:15:26 | 显示全部楼层 |阅读模式

  1. #*************网页爬虫-R语言实现,函数库文件*******#
  2. library(XML);
  3. #****函数:(crawler1)
  4. #****概要:网络抓取的主要函数1,可以抓取n个网页的m个变量。每个xpath只爬取一个数据,如果大于1个则提示有误。(精确抓取)
  5. #****输入:
  6. #        名称           |    数据格式
  7. #        url            |    欲抓取的网站的url                向量:n个
  8. #        xpath          |    给出的抓取变量的xpath            向量:m个
  9. #        content        |    变量是结点的内容还是结点的属性值 向量:m个
  10. #                            "text"是内容(默认),或者是属性名称
  11. #****输出:只有print,无输出
  12. #        名称           |    含义


  13. crawler1<-function(url,xpath,content=rep("text",length(xpath))){
  14.     #如果xpath以及content的数量不同,则输入数据有误
  15.     num_url<-length(url)
  16.     if(length(content)!=length(xpath)){
  17.         print("Error:content和xpath向量的数量不一致!")
  18.         return
  19.     }


  20.     #建立一个num_url行,num_vari列的数据框
  21.     num_vari<-length(xpath)
  22.     result<-data.frame(rep(0,num_url))
  23.     for(i in 2:num_vari){
  24.         cbind(result,rep(0,num_url))
  25.     }


  26.     #遍历url向量,依次对相应网页进行抓取
  27.     i<-1
  28.     j<-1
  29.     for(i_url in url){
  30.         i_url_parse<-htmlParse(i_url,encoding="UTF-8")#读取url网页数据,并使用htmlParse转化。(xml文件使用xmlParse)
  31.         for(j in 1:num_vari){#依次填充一个页面中的不同欲读取的数据值
  32.             node<-getNodeSet(i_url_parse,xpath[j])#通过xpath找到相应变量的xpath结点
  33.             if(length(node)==0){#未爬取到数据,说明xpath有误
  34.                 result[i,j]<-NA
  35.                 print(paste("注意:第",j,"个变量未能在第",i,"个页面中找到,我们会把该数据写为空值"))
  36.             }else if(length(node)==1){#爬取到一个数据,说明正常
  37.                 if(content[j]=="text"){#欲爬取变量的内容
  38.                     result[i,j]<-xmlValue(node[[1]])
  39.                 }else{#欲爬取变量的属性
  40.                     result[i,j]<-xmlGetAttr(node[[1]],content[j])
  41.                     result[i,j]<-iconv(result[i,j],"UTF-8","gbk")#如果是乱码,可以打开此语句。如果是na可以删除此句
  42.                 }
  43.             }else{#爬取到多个数据,本函数不予处理
  44.                 result[i,j]<-NA
  45.                 print(paste("注意:第",j,"个变量能在第",i,"个页面中找到多个,不知您要哪一个,我们会把该数据写为空值"))
  46.             }
  47.         }
  48.         i<-i+1
  49.     }
  50.     result
  51. }


  52. #****函数:(crawler2)
  53. #****概要:网络抓取的主要函数2,可以抓取n个网页的1个变量。该xpath可以爬取多个数据,(批量抓取)
  54. #****输入:
  55. #        名称           |    数据格式
  56. #        url            |    欲抓取的网站的url                向量:n个
  57. #        xpath          |    给出的抓取变量的xpath            向量:1个
  58. #        content        |    变量是结点的内容还是结点的属性值 向量:1个
  59. #                            "text"是内容(默认),或者是属性名称
  60. #****输出:只有print,无输出
  61. #        名称           |    含义
  62. #        url            |    1---n自然数,相同url拥有相同数值
  63. #        vari           |    读取的数据
  64. crawler2<-function(url,xpath,content="text"){
  65.     num_url<-length(url)
  66.     result<-data.frame(url=0,vari=0)
  67.     i<-1#记录第几个url
  68.     tmp<-1#
  69.     for(i_url in url){
  70.         i_url_parse<-htmlParse(i_url,encoding="UTF-8")#读取url网页数据,并使用htmlParse转化。(xml文件使用xmlParse)
  71.         node<-getNodeSet(i_url_parse,xpath)#通过xpath找到相应变量的xpath结点
  72.         if(length(node)==0){#未爬取到数据,说明xpath有误
  73.             result[tmp,1]<-i
  74.             result[tmp,2]<-NA
  75.             print(paste("注意:变量未能在第",i,"个页面中找到,我们会把该数据写为空值"))
  76.             tmp<-tmp+1
  77.         }else{
  78.             for(j in 1:length(node)){
  79.                 result[tmp,1]<-i
  80.                 if(content=="text"){#欲爬取变量的内容
  81.                     result[tmp,2]<-xmlValue(node[[j]])
  82.                 }else{#欲爬取变量的属性
  83.                     result[tmp,2]<-xmlGetAttr(node[[j]],content)
  84.                     #result[tmp,2]<-iconv(result[tmp,2],"UTF-8","gbk")#如果是乱码,可以打开此语句。如果是na可以删除此句
  85.                 }
  86.                 tmp<-tmp+1
  87.             }
  88.         }
  89.         i<-i+1
  90.     }
  91.     result
  92. }


  93. #test


  94. #测试crawler1
  95. #测试内容
  96. url1<-"http://3c.taobao.com/detail.htm?spm=872.217037.254698.6.deIiSJ&spuid=205341228&cat=1101"
  97. url2<-"http://3c.taobao.com/detail.htm?spm=872.217037.254698.11.deIiSJ&spuid=203228104&cat=1101"
  98. url3<-"http://item.taobao.com/item.htm?spm=1020.3.9.122.SCNhDn&id=15695321398&from="
  99. url<-c(url1,url2,url3)
  100. xpath<-c("//div[@id='idetail']//div[@class='info-area']//div[@class='tlt clearfix']//h1","//div[@id='idetail']//div[@class='info-area']//div[@class='key-info']//span[@class='price']")
  101. crawler1(url,xpath)
  102. #测试属性值
  103. url<-"http://data.caixin.com/macro/macro_indicator_more.html?id=F0001&cpage=2&pageSize=30&url=macro_indicator_more.html#top";
  104. xpath<-"//meta[@name='keywords']"
  105. content<-"content"
  106. crawler1(url,xpath,content)


  107. #测试crawler2
  108. url<-"http://list.taobao.com/itemlist/bao.htm?spm=567.116925.155171.105.9ZYYMX&cat=50072693&isprepay=1&viewIndex=1&yp4p_page=0&commend=all&atype=b&style=grid&olu=yes&isnew=2&smc=1&mSelect=false&user_type=0&fl=50072693#!cat=50072693&isprepay=1&user_type=0&as=0&viewIndex=1&yp4p_page=0&commend=all&atype=b&style=grid&olu=yes&isnew=2&mSelect=false&smc=1&json=on&tid=0"
  109. xpath<-"//li[@class='list-item list-item-grid']"
  110. content<-"data-commenturl"
  111. crawler2(url1,xpath,content)
  112. #疑难:如何破解data-commenturl="{{item.commendHref}}"
  113. #<li class="list-item list-item-grid" data-isrush="{{item.isLimitPromotion}}" data-ismall="{{item.isMall}}" data-item="{{item.itemId}}" data-#params="sellerId={{item.sellerId}}&ip={{extraInfo.userIp}}" data-comment="{{item.commend}}" data-commenturl="{{item.commendHref}}"  data-#virtual="{{item.isVirtual
复制代码

7

主题

362

金钱

3127

积分

中级用户

发表于 2020-1-2 20:33:24 | 显示全部楼层
感谢分享!
ximenyan
回复

使用道具 举报

7

主题

362

金钱

3127

积分

中级用户

发表于 2020-1-2 20:33:47 | 显示全部楼层
thanks!wonderful
ximenyan
回复 支持 反对

使用道具 举报

0

主题

80

金钱

169

积分

入门用户

QQ
发表于 2021-12-22 13:50:55 | 显示全部楼层
:):):)
回复

使用道具 举报

7

主题

141

金钱

2886

积分

中级用户

发表于 2023-2-27 12:26:00 | 显示全部楼层

感谢分享!也想学习一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

客服中心
关闭
在线时间:
周一~周五
8:30-17:30
QQ群:
653541906
联系电话:
010-85786021-8017
在线咨询
客服中心

意见反馈|网站地图|手机版|小黑屋|EPS数据狗论坛 ( 京ICP备09019565号-3 )   

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

快速回复 返回顶部 返回列表