大红鹰葡京会R语言从小木虫网页批量提考研调剂信息。R语言从小木虫网页批量领考研调剂信息。

一律、从URL读博并回到html树

一致、从URL读博并返html树

    1.1
Rcurl包

    1.1
Rcurl包

       动Rcurl包可一本万利的为服务器发出请求,捕获URI,get 和
post 表单。比R socktet连接而供更强水准的彼此,并且支持
FTP/FTPS/TFTP,SSL/HTTPS,telnet
和cookies等。本文用到的函数是basicTextGatherer和getURL。想详细了解这个包之可以点击参考资料的链接。

       动用Rcurl包可便宜之为服务器发出请求,捕获URI,get 和
post 表单。比R socktet连接要供更强品位的彼此,并且支持
FTP/FTPS/TFTP,SSL/HTTPS,telnet
和cookies等。本文用到的函数是basicTextGatherer和getURL。想详细了解之保险的足点击参考资料的链接。

        R命令:

        R命令:

        h <- basicTextGatherer( )  
# 查看服务器返回的头信息
        txt <- getURL(url,
headerfunction = h$update,.encoding=”UTF-8…”)  # 返回字符串形式html

        h <- basicTextGatherer( )  
# 查看服务器返回的腔信息
        txt <- getURL(url,
headerfunction = h$update,.encoding=”UTF-8…”)  # 返回字符串形式html

      
参数url即为需要拜访的url这里参数用headerfunction用到齐同一长长的命令归来的条信息,.encoding指定网页的编码方式为“UTF-8″。

      
参数url即为要拜访的url这里参数用headerfunction用到上同条命令归来的头信息,.encoding指定网页的编码方式为“UTF-8″。

      
网页的编码方式有好多,一般以UTF-8,一些汉语网页编码方式为“gbk”,可以于浏览器的网页代码查看或getURL返回的字符串看到。

      
网页的编码方式有成千上万,一般以UTF-8,一些国语网页编码方式为“gbk”,可以以浏览器的网页代码查看或getURL返回的字符串看到。

       小木虫网页代码查看

       小木虫网页代码查看

                                 
大红鹰葡京会 1

                                 
大红鹰葡京会 2

      可见小木虫网页编码方式为gbk。

      可见小木虫网页编码方式为gbk。

     1.2  XML包

     1.2  XML包

       R语言XML包
具有读取或者创造XML(HTML)文件的功能,可以本地文件为支持HTTP 或者 FTP
,也提供Xpath(XML路径语言)解析方法。此处函数htmlparse,将文件分析为XML或者HTML树,便于进一步数据的领到或者编辑。

       R语言XML包
具有读取或者创造XML(HTML)文件之成效,可以本地文件为支持HTTP 或者 FTP
,也供Xpath(XML路径语言)解析方法。此处函数htmlparse,将文件分析为XML或者HTML树,便于进一步数据的提取或者编辑。

        R命令:

        R命令:

       
htmlParse(file,asText=T,encoding=”UTF-8″…) #参数file
即为XML或者HTML文件名或者text,asText参数是T指定file是text,encoding指定网页编码方式。

       
htmlParse(file,asText=T,encoding=”UTF-8″…) #参数file
即为XML或者HTML文件名或者text,asText参数是T指定file是text,encoding指定网页编码方式。

 

 

       这里我们用读取网页,并且将到拖欠网页的html树内容

       这里我们要读取网页,并且将到该网页的html树内容

        自定义函数download,输入strURL,strURL为网址,返回html树内容

        自定义函数download,输入strURL,strURL为网址,返回html树内容

            download <- function(strURL){
              h <- basicTextGatherer( )# 查看服务器返回的腔信息
              txt <- getURL(strURL, headerfunction =
h$update,.encoding=”gbk”) ## 字符串形式
               htmlParse(txt,asText=T,encoding=”gbk”)     
#选取gbk进行网页的剖析
             }

            download <- function(strURL){
              h <- basicTextGatherer( )# 查看服务器返回的条信息
              txt <- getURL(strURL, headerfunction =
h$update,.encoding=”gbk”) ## 字符串形式
               htmlParse(txt,asText=T,encoding=”gbk”)     
#选gbk进行网页的辨析
             }

次、获得一个网页所有的URL

亚、获得一个网页所有的URL

   
有时候我们要上每个网页上的子链接取分析数据,这个时节可就此到XML包之getHTMLLinks函数。

   
有时候我们要上每个网页上的子链接取分析数据,这个时段可就此到XML包的getHTMLLinks函数。

    R命令:

    R命令:

        getHTMLLinks(doc,  xpQuery =
“//a/@href”…)
#doc为剖后底HTML树文件,xpQuery指定想匹配的Xpath元素(下面会详细讲一些Xpath基础)。

        getHTMLLinks(doc,  xpQuery =
“//a/@href”…)
#doc为剖后的HTML树文件,xpQuery指定想匹配的Xpath元素(下面会详细讲一点Xpath基础)。

    此处我们要得到小木虫“导师招生”页面下的富有话题链接。

    此处我们需要取得小木虫“导师招生”页面下之持有话题链接。

    2.1
首先我们设博取导师招生的率先页,第二页,第三页,甚至到最终一页的网址。

    2.1
首先我们要博导师招生的首先页,第二页,第三页,甚至到终极一页的网址。

        导师招生首页

        导师招生首页

                        大红鹰葡京会 3

                       
大红鹰葡京会 4

       导师招生第二页,第三页。

       导师招生第二页,第三页。

                      大红鹰葡京会 5

                     
大红鹰葡京会 6

                   大红鹰葡京会 7

                  
大红鹰葡京会 8

       
发现首页网址是http://muchong.com/html/f430.html,余下的网址符合http://muchong.com/html/f430\_ 
+   第几页   +.html 

       
发现首页网址是http://muchong.com/html/f430.html,余下的网址符合http://muchong.com/html/f430\_ 
+   第几页   +.html 

        于是网址我们得手动编辑。

        于是网址我们可手动编辑。

        strURLs=”http://muchong.com/html/f430.html”

        strURLs=”http://muchong.com/html/f430.html”

        n=50

        n=50

        strURLs <-
c(strURLs,paste(rep(“http://muchong.com/html/f430\_",n),c(2:n),".html",sep=””))

        strURLs <-
c(strURLs,paste(rep(“http://muchong.com/html/f430\_",n),c(2:n),".html",sep=””))

        strURLs包括了拥有1暨50页导师招生网页的网址。

        strURLs包括了具有1交50页导师招生网页的网址。

    2.2取得各国一样页导师招生中大多单话题之链接

    2.2赢得各一样页导师招生中基本上个话题之链接

             

             

       
以教师招生页面下,有为数不少话题,我们用获得各个话题的链接。

       
以先生招生页面下,有好多话题,我们要得到各个话题之链接。

        用getHTMLLinks函数查看导师招生中装有URL,再对照话题网址。

        用getHTMLLinks函数查看导师招生中有着URL,再比话题网址。

 

 

        大红鹰葡京会 9

       
大红鹰葡京会 10

        http://muchong.com/html/201702/11075436.html

        http://muchong.com/html/201702/11075436.html

        发现话题网址是组成成分是http://muchong.com/ +
html/201702/11075436.html 类似的URL

        发现话题网址是成成分是http://muchong.com/ +
html/201702/11075436.html 类似的URL

        这时我使用先从老师招生网页提取所有URL,再配合配 html *
.html格式的URL,最后还前面加上http://muchong.com/ 的策略。

        这时我以先打老师招生网页提取所有URL,再配合配 html *
.html格式的URL,最后又前面加上http://muchong.com/ 的策略。

        自定义greg函数用于正则相当,并且获得匹配到的字符串。
            greg <- function(pattern,istring){
                gregout <- gregexpr(pattern,istring)  
#pattern为配合模式,istring为索要匹配的字符串
               
substr(istring,gregout[[1]],gregout[[1]]+attr(gregout[[1]],’match.length’)-1)
             }

        自定义greg函数用于正则匹配,并且获得匹配到之字符串。
            greg <- function(pattern,istring){
                gregout <- gregexpr(pattern,istring)  
#pattern为配合模式,istring为用匹配的字符串
               
substr(istring,gregout[[1]],gregout[[1]]+attr(gregout[[1]],’match.length’)-1)
             }

         自定义extradress函数,用于取strURL网页的面临之 URL
,最后处理回来各个话题网页的链接。

         自定义extradress函数,用于取strURL网页的遭之 URL
,最后处理回来各个话题网页的链接。

            extradress <- function(strURL){
                 prefix <- “http://muchong.com/”
                 pattern <- “html/[0-9/]+.html”
                 links <- getHTMLLinks(strURL)
                 needlinks <- gregexpr(pattern,links)
                 needlinkslist <- list()
                for (i in which(unlist(needlinks)>0)){
                    preadress <-
substr(links[i],needlinks[[i]],needlinks[[i]]+attr(needlinks[[i]],’match.length’)-1)
                    needlinkslist<-
c(needlinkslist,list(preadress))
                   adresses <-
lapply(needlinkslist,function(x)paste(prefix,x,sep=””))
                 }
                return (adresses)
                 }

            extradress <- function(strURL){
                 prefix <- “http://muchong.com/”
                 pattern <- “html/[0-9/]+.html”
                 links <- getHTMLLinks(strURL)
                 needlinks <- gregexpr(pattern,links)
                 needlinkslist <- list()
                for (i in which(unlist(needlinks)>0)){
                    preadress <-
substr(links[i],needlinks[[i]],needlinks[[i]]+attr(needlinks[[i]],’match.length’)-1)
                    needlinkslist<-
c(needlinkslist,list(preadress))
                   adresses <-
lapply(needlinkslist,function(x)paste(prefix,x,sep=””))
                 }
                return (adresses)
                 }

     

     

其三、从HTML树被收获我们所设的数目

其三、从HTML树被取我们所假设的数额

    3.1 XML文档基本知识

    3.1 XML文档基本知识

    下是微木虫的组成部分html:

    下面是小木虫的有些html:

 

 

    大红鹰葡京会 11

   
大红鹰葡京会 12

 

 

  
html为根元素,head和body是html的子元素,div是body的子元素,div有总体性id,style,属性后面对应着属于性值。“小木虫—“一行是p元素的文书内容。

  
html为根元素,head和body是html的子元素,div是body的子元素,div有总体性id,style,属性后面对应着属于性值。“小木虫—“一行是p元素的公文内容。

    3.2 获得某元素的情节

    3.2 获得某元素的情

       此处用到XML包吃的getNodeSet函数,getNodeSet函数

       此处用到XML包被之getNodeSet函数,getNodeSet函数

        R命令:

        R命令:

        getNodeSet(doc, path…)
#doc 就是html树文件对象,path
就是素路径。可以据此/从根元素一少有指定路线,也可以用//直接定位及有平叠元素。

        getNodeSet(doc, path…)
#doc 就是html树文件对象,path
就是因素路径。可以就此/从根元素一百年不遇指定路线,也可以用//直接固定及某一样层元素。

        例如要一定到html下之body下之div,path
即为/html/body/div,也可//body/div直接从body开始稳定。返回列表,如果一定及几近个要素,将回到多单元素的列表。此次我们设肯定为到网页的话题内容:

        例如要稳及html下的body下的div,path
即为/html/body/div,也可//body/div直接从body开始定点。返回列表,如果固定到多单要素,将赶回多只元素的列表。此次我们如果一定为到网页的话题内容:

 

 

                      大红鹰葡京会 13

                     
大红鹰葡京会 14

     我们这里直接定位及p元素,再打列表中筛选。

     我们这边一直定位及p元素,再从列表中筛选。

     先输入指令

     先输入指令

      getNodeSet(doc,’//p’)

      getNodeSet(doc,’//p’)

 

 

      大红鹰葡京会 15

     
大红鹰葡京会 16

 

 

      getNodeSet(doc,’//p’)[[2]]就算是咱们用之始末。

      getNodeSet(doc,’//p’)[[2]]就是是咱需要的内容。

 

 

      大红鹰葡京会 17

     
大红鹰葡京会 18

     

     

     
但是回去的结果是独对象,要扭转为字符串要就此到函数xmlValue获得首届素值。

     
但是回去的结果是独对象,要转变也字符串要就此到函数xmlValue获得正素值。

       xmlValue(x…) #
x就是getNodeSet得到的目标

       xmlValue(x…) #
x就是getNodeSet得到的靶子

       此处

       此处

  xmlValue(getNodeSet(a,'//p')[[2]]) 得到我们所要的内容


  


   此时,我们获得了每一个话题的内容,我们就可以从内容中提取有效信息,是否招调剂,大学名,导师名字,研究方向,联系人,邮箱,电话等。
  xmlValue(getNodeSet(a,'//p')[[2]]) 得到我们所要的内容


  


   此时,我们获得了每一个话题的内容,我们就可以从内容中提取有效信息,是否招调剂,大学名,导师名字,研究方向,联系人,邮箱,电话等。

季、从小木虫获取调剂信息实例

季、从小木虫获取调剂信息实例

   
我师妹是生物正式的要调剂的学生,现在急需从小木虫网站提取别人宣布的信,做成一个表格形式,便于筛选查看和发送邮件。

   
我师妹是生物正式的内需调剂的学员,现在欲从小木虫网站提取别人宣布的信,做成一个表格形式,便于筛选查看和发送邮件。

   以下是百分之百代码内容

   以下是总体代码内容

 

 

library(RCurl)
library(XML)

library(RCurl)
library(XML)

download <- function(strURL){
    h <- basicTextGatherer()# 查看服务器返回的腔信息
    txt <- getURL(strURL, headerfunction = h$update,.encoding=”gbk”)
## 字符串形式
    htmlParse(txt,asText=T,encoding=”gbk”)     
#选gbk进行网页的剖析
}

download <- function(strURL){
    h <- basicTextGatherer()# 查看服务器返回的条信息
    txt <- getURL(strURL, headerfunction = h$update,.encoding=”gbk”)
## 字符串形式
    htmlParse(txt,asText=T,encoding=”gbk”)     
#摘gbk进行网页的辨析
}

extradress <- function(strURL){
  prefix <- “http://muchong.com/”
  pattern <- “html/[0-9/]+.html”
  links <- getHTMLLinks(strURL)
  needlinks <- gregexpr(pattern,links)
  needlinkslist <- list()
  for (i in which(unlist(needlinks)>0)){
    preadress <-
substr(links[i],needlinks[[i]],needlinks[[i]]+attr(needlinks[[i]],’match.length’)-1)
    needlinkslist<- c(needlinkslist,list(preadress))
    adresses <-
lapply(needlinkslist,function(x)paste(prefix,x,sep=””))
  }
  return (adresses)
}

extradress <- function(strURL){
  prefix <- “http://muchong.com/”
  pattern <- “html/[0-9/]+.html”
  links <- getHTMLLinks(strURL)
  needlinks <- gregexpr(pattern,links)
  needlinkslist <- list()
  for (i in which(unlist(needlinks)>0)){
    preadress <-
substr(links[i],needlinks[[i]],needlinks[[i]]+attr(needlinks[[i]],’match.length’)-1)
    needlinkslist<- c(needlinkslist,list(preadress))
    adresses <-
lapply(needlinkslist,function(x)paste(prefix,x,sep=””))
  }
  return (adresses)
}

gettopic <- function(doc){
    xmlValue(getNodeSet(doc,’//p’)[[2]])
}

gettopic <- function(doc){
    xmlValue(getNodeSet(doc,’//p’)[[2]])
}

greg <- function(pattern,istring){
    gregout <- gregexpr(pattern,istring)
   
substr(istring,gregout[[1]],gregout[[1]]+attr(gregout[[1]],’match.length’)-1)
}

greg <- function(pattern,istring){
    gregout <- gregexpr(pattern,istring)
   
substr(istring,gregout[[1]],gregout[[1]]+attr(gregout[[1]],’match.length’)-1)
}

getinf <- function(topic){
pattern1 <-
“招[\u4E00-\u9FA5]+[0-9-]*[\u4E00-\u9FA5]*[:、;,,;]*[\u4E00-\u9FA5]*[:、;,,;]*[\u4E00-\u9FA5]*[:、;,,;]*[\u4E00-\u9FA5]*[:、;,,;]*[\u4E00-\u9FA5]*(研究生)|(调剂)”
pattern2 <- “([\u4E00-\u9FA5]*课题组|[\u4E00-\u9FA5]*团队)”
 
pattern21 <- “[\u4E00-\u9FA5]*[:、;,,;]*(教授|博士)”
pattern3 <-
“[\u4E00-\u9FA5]*[:、;,,;]*[-A-Za-z0-9_.%]+@[-A-Za-z0-9_.%]+\\.[A-Za-z]+[.A-Za-z]*”
    #配合配@163.com类要么@abc.edu.cn两接近邮箱
pattern4 <- “[\u4E00-\u9FA5]+老师”  #匹配有先生
pattern5 <-
“[\u4E00-\u9FA5]*[::]*1[3,5,8]{1}[0-9]{1}[0-9]{8}|0[0-9]{2,3}-[0-9]{7,8}(-[0-9]{1,4})?”
#匹配联系人和数码
pattern6 <-
“(主|从事)*[\u4E00-\u9FA5]*(的研究|方向)为*[:、;,,;]*[\u4E00-\u9FA5]*”
pattern7 <- “[\u4E00-\u9FA5]+(大学|学院|研究院|研究所)”
pattern8
<-“[-A-Za-z0-9_.%]+@[-A-Za-z0-9_.%]+\\.[A-Za-z]+[.A-Za-z]*”
#标准匹配邮箱

getinf <- function(topic){
pattern1 <-
“招[\u4E00-\u9FA5]+[0-9-]*[\u4E00-\u9FA5]*[:、;,,;]*[\u4E00-\u9FA5]*[:、;,,;]*[\u4E00-\u9FA5]*[:、;,,;]*[\u4E00-\u9FA5]*[:、;,,;]*[\u4E00-\u9FA5]*(研究生)|(调剂)”
pattern2 <- “([\u4E00-\u9FA5]*课题组|[\u4E00-\u9FA5]*团队)”
 
pattern21 <- “[\u4E00-\u9FA5]*[:、;,,;]*(教授|博士)”
pattern3 <-
“[\u4E00-\u9FA5]*[:、;,,;]*[-A-Za-z0-9_.%]+@[-A-Za-z0-9_.%]+\\.[A-Za-z]+[.A-Za-z]*”
    #相当配@163.com类或@abc.edu.cn两看似邮箱
pattern4 <- “[\u4E00-\u9FA5]+老师”  #匹配有先生
pattern5 <-
“[\u4E00-\u9FA5]*[::]*1[3,5,8]{1}[0-9]{1}[0-9]{8}|0[0-9]{2,3}-[0-9]{7,8}(-[0-9]{1,4})?”
#配合联系人和数码
pattern6 <-
“(主|从事)*[\u4E00-\u9FA5]*(的研究|方向)为*[:、;,,;]*[\u4E00-\u9FA5]*”
pattern7 <- “[\u4E00-\u9FA5]+(大学|学院|研究院|研究所)”
pattern8
<-“[-A-Za-z0-9_.%]+@[-A-Za-z0-9_.%]+\\.[A-Za-z]+[.A-Za-z]*”
#精确匹配邮箱

cate <- greg(pattern1,topic)
proj <- greg(pattern2,topic)
PI <- greg(pattern21,topic)
email <- greg(pattern3,topic)
man <- greg(pattern4,topic)
phone <- greg(pattern5,topic)
direc <- greg(pattern6,topic)
univ <- greg(pattern7,topic)
print(cate)
if (greg(“(分子|生物|植物|细胞|医学|动物|水)+”,topic) !=””){
    if (man ==”” && proj != “”){
        man <- unlist(strsplit(proj,”课题组”)[1])
    }
 
    if (email != “”){
      email <- greg(pattern10,email)
    }
    
   
data.frame(“类别”=cate,”大学”=univ,”课题”=proj,”PI”=PI,”联系人”=man,”邮箱”=email,”方向”=direc,”电话”=phone)
}
else{
  return(“”)
}
}

cate <- greg(pattern1,topic)
proj <- greg(pattern2,topic)
PI <- greg(pattern21,topic)
email <- greg(pattern3,topic)
man <- greg(pattern4,topic)
phone <- greg(pattern5,topic)
direc <- greg(pattern6,topic)
univ <- greg(pattern7,topic)
print(cate)
if (greg(“(分子|生物|植物|细胞|医学|动物|水)+”,topic) !=””){
    if (man ==”” && proj != “”){
        man <- unlist(strsplit(proj,”课题组”)[1])
    }
 
    if (email != “”){
      email <- greg(pattern10,email)
    }
    
   
data.frame(“类别”=cate,”大学”=univ,”课题”=proj,”PI”=PI,”联系人”=man,”邮箱”=email,”方向”=direc,”电话”=phone)
}
else{
  return(“”)
}
}

strURLs=”http://muchong.com/html/f430.html”
n=50
dat <-
data.frame(“URL”=”URL”,”类别”=”类别”,”大学”=”大学”,”课题”=”课题”,”PI”=”PI”,”联系人”=”联系人”,”邮箱”=”邮箱”,”方向”=”方向”,”电话”=”电话”)
strURLs <-
c(strURLs,paste(rep(“http://muchong.com/html/f430\_",n),c(2:n),".html",sep=””))
output1 <- “a2017.2.21.txt” #不处理数量,用于更处理
output2 <- “b2017.2.21.txt” #更进一步筛选的数码,用于查看

strURLs=”http://muchong.com/html/f430.html”
n=50
dat <-
data.frame(“URL”=”URL”,”类别”=”类别”,”大学”=”大学”,”课题”=”课题”,”PI”=”PI”,”联系人”=”联系人”,”邮箱”=”邮箱”,”方向”=”方向”,”电话”=”电话”)
strURLs <-
c(strURLs,paste(rep(“http://muchong.com/html/f430\_",n),c(2:n),".html",sep=””))
output1 <- “a2017.2.21.txt” #匪处理数量,用于更处理
output2 <- “b2017.2.21.txt” #尤为筛选的多少,用于查看

for ( strURL in strURLs){
    adresses <- extradress(strURL)
    for (adress in adresses){
      message(adress)
      doc <- download(adress)
      topic <- gettopic(doc)
      inf <- getinf(topic)
      if (inf != “”){
        URL <- data.frame(“URL”=adress)
        inf <- cbind(URL,inf)
        dat<- rbind(dat,inf)
      }
    }
}

for ( strURL in strURLs){
    adresses <- extradress(strURL)
    for (adress in adresses){
      message(adress)
      doc <- download(adress)
      topic <- gettopic(doc)
      inf <- getinf(topic)
      if (inf != “”){
        URL <- data.frame(“URL”=adress)
        inf <- cbind(URL,inf)
        dat<- rbind(dat,inf)
      }
    }
}

write.table(dat, file = output1, row.names = F, col.names=F,quote = F,
sep=”\t”)  # tab 分隔的文本
message(“完成!”)

write.table(dat, file = output1, row.names = F, col.names=F,quote = F,
sep=”\t”)  # tab 分隔的公文
message(“完成!”)

dat <- read.table(output1,sep=”\t”,header=T)
dat <- dat[dat$邮箱, ] #除去没有邮箱数据
dat <- dat[!duplicated(dat$邮箱), ]  #除去重复邮箱数据
dat$index <- as.numeric(rownames(dat))
dat <- dat[order(dat$index,decreasing=F),]
#用乱序后的数目重复按index排序
dat$index <- NULL
write.table(dat, file = output2, row.names = F, col.names=F,quote = F,
sep=”\t”)  # tab 分隔的文件
message(“完成!”)

dat <- read.table(output1,sep=”\t”,header=T)
dat <- dat[dat$邮箱, ] #删除没有邮箱数据
dat <- dat[!duplicated(dat$邮箱), ]  #剔除重复邮箱数据
dat$index <- as.numeric(rownames(dat))
dat <- dat[order(dat$index,decreasing=F),]
#拿乱序后的多寡重复按index排序
dat$index <- NULL
write.table(dat, file = output2, row.names = F, col.names=F,quote = F,
sep=”\t”)  # tab 分隔的文件
message(“完成!”)

 

 

 

 

末了祝所有考研人都能够成为心仪的院校选用!

最后祝愿所有考研人数还能够不负众望让心仪之学录取!

 

 

 

 

参考资料:

参考资料:

Rcurl包 :https://cran.r-project.org/web/packages/RCurl/RCurl.pdf

Rcurl包 :https://cran.r-project.org/web/packages/RCurl/RCurl.pdf

XML包:https://cran.r-project.org/web/packages/XML/XML.pdf

XML包:https://cran.r-project.org/web/packages/XML/XML.pdf

XML基本知识:http://www.cnblogs.com/thinkers-dym/p/4090840.html

XML基本知识:http://www.cnblogs.com/thinkers-dym/p/4090840.html

 

 

相关文章

admin

网站地图xml地图