RCurl包爬虫学习

作者: 485b1aca799e | 来源:发表于2017-06-18 13:47 被阅读466次

    RCurl包学习

    基础

    
    
    library(RCurl)
    
    
    d = debugGatherer()
    temp <-getURL("http://www.dataguru.cn/",debugfunction=d$update,verbose = TRUE)
    cat(d$value()[3])#提交给服务器的头信息
    cat(d$value()[1])#服务器地址以及端口号
    cat(d$value()[2])#服务器端返回的头信息
    
    
    #将头部结果以列表形式输出
    h = basicHeaderGatherer()
    txtt=getURL("http://www.dataguru.cn/",headerfunction = h$update)
    names(h$value())
    h$value()
    
    
    #将头部结果以字符串形式输出
    headers = basicTextGatherer()
    txt=getURL("http://www.dataguru.cn/",headerfunction = headers$update)
    names(headers$value())#说明是字符串形式
    headers$value()#转换成列表cat(headers$value())
    
    #查看Curl的访问信息
    curl = getCurlHandle()
    d=getURL("http://www.dataguru.cn/", curl = curl)
    getCurlInfo(curl)$response.code
    getCurlInfo(curl)
    
    
    #伪装自己的操作系统的信息
    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"
    )
    
    #伪装成UC浏览器来进行服务器的访问
    myheader<-c(
      "User-Agent: NOKIA5700/ UCWEB7.0.2.37/28/999",
      "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"
    )
    
    
    d = debugGatherer()
    temp <-getURL("http://www.dataguru.cn/",debugfunction=d$update,verbose = TRUE,httpheader=myheader)
    
    
    #getForm数据不用进行加密提交搜索数据
    #PostForm数据需要进行加密提交搜索数据
    
    #对百度搜索的网页进行爬取
    url <- getForm("http://www.baidu.com/s?wd=火影")
    write.table(url,"url.txt")
    

    getURL函数中的参数的解释

    1. verbose:输出访问的交互信息
    2. httpheader:设置访问信息报头,可自定义httpheader=myheader
    3. .encoding="UTF-8" "GBK"
    4. debugfunction,headerfunction,curl
    5. .params:提交的参数组
    6. dirlistonly:仅读取目录
    7. followlocation:支持重定向,比如一个网页<http://www.sina.com > 尾部应该是.cn,如果此时输入错误,则会进行报错,但是加上参数followlocation=T,则网站会进行自行的跳转,跳转到<http://www.sina.cn> 
      8. maxredirs:最大重定向次数,防止跳转链接进入一个死循环
    
    

    抓取网页中文乱码解决方法

    1. 抓取页面时编码没有选对;2. 解析表单时编码没有选对。解决方法如下:
    
    url="http://data.earthquake.cn/datashare/datashare_more_quickdata_new.jsp"
    wp<-getURL(url,.encoding="gb2312") #用网页本身的编码
    wp2=iconv(wp,"gb2312","UTF-8") #转码
    Encoding(wp2) #UTF-8
    doc <- htmlParse(wp2,asText=T,encoding="UTF-8") #选择UTF-8进行网页的解析
    #查看doc的内容时显示有乱码,但没关系,table的解析结果没有乱码
    tables <-readHTMLTable(doc,header=F)
    
    
    
    - 网址:http://f.dataguru.cn/thread-356009-1-1.html
    - 解决RCurl爬虫,首先考虑将Rstudio编码设置为GB2312,然后再考虑使用上述的方法来进行爬虫,可能文件在爬取的过程中会显示是乱码,但是只要使用xpathSapply函数进行文件解析最后的结果是中文的,就能满足要求。
    

    使用getBinaryURL函数下载文件

    url <- "http://10.0.1.8/images/links/bbs1.gif"
    temp <- getBinaryURL(url)#下载一个URL二进制文件
    
    note <- file("hello.gif",open = "wb")#打开一个文件链接,对该文件进行二进制写入操作,注意文件的后缀名
    writeBin(temp,note)#将temp写入note文件中
    close(note)#关闭写入文件
    
    

    批量下载文件

    library(XML)#XML/HTML解析包
    library(RCurl)#RCurl爬虫包
    library(stringr)#文本处理包
    
    
    url <- "http://rfunction.com/code/1202/"#主界面
    html <- getURL(url)#下载二进制html文件
    html_doc <- htmlParse(html)#解析html文件
    url_html <- str_replace_all(unlist(xpathSApply(doc = html_doc,path = "//li/a[contains(./text(),'.R')]",fun=xmlValue)),pattern = " ",replacement = "")
    #使用xpath查询语句将.R文件的名字提取出来,unlist将列表扁平化转换为向量,然后使用stringr包中的函数str_replace_all将字符串向量中的空格删除掉
    
    temp <- NULL;
    #i=1
    for(i in 1:length(url_html))
    {
    url_html_last<- paste(url,url_html[i],sep="");
    #将界面的url链接和.R文件名字连接起来,成为每个.R文件的url路径
    temp <- getBinaryURL(url_html_last);
    #下载每个.R文件的二进制html文件
    note <- file(paste(url_html[i]),open="wb")
    #打开文件,对该文件进行二进制写入操作,文件的名字为.R文件的名字
    writeBin(temp,note)
    #将temp文件写入连接note中
    close(note)
    #关闭文件,运行成功后即可下载完毕
    Sys.sleep(time = 30)
    #每爬一次休息一会儿
    }
    
    

    使用RCurl爬取豆瓣电影评分

    
    
    require(RCurl)
    library(XML)
    x='明日世界'
    search <- getForm("https://movie.douban.com/", search_text = x)
    searchweb<-htmlParse(search,asText=T,encoding="UTF-8")
    #乱码了 searchweb
    searchweb
    # 解析搜索结果页面 
    resnodes<-getNodeSet(searchweb,"//div[@id='wrapper']//table[1]//a")
    #查找id为wrapper的div里面table第一第的数
    resurl<-xmlGetAttr(resnodes[[1]],name="href")
    #找到电影url地址
    resweb<-getURL(resurl,.encoding="UTF-8")  #上该电影主页
    #得到影片页面后第二次解析
    content<-htmlParse(resweb,encoding="UTF-8")
    resnodes<-getNodeSet(content,"//div[@id='interest_sectl']//p[@class='rating_self clearfix']//strong")
    namenodes<-getNodeSet(content,"//div[@id='content']//h1//span")
    #得到影片评分
    score<-xmlValue(resnodes[[1]])
    name<-xmlValue(namenodes[[1]])
    name;
    score;
    

    解决中文乱码的例子

    library(RCurl)
    library(XML)
    library(stringr)
    
     
    url="http://baike.baidu.com/subview/273889/5093882.htm"
    wp<-getURL(url,.encoding="gb2312",followlocation=T) #用网页本身的编码
    #直接进行解析,#加上参数followlocation=T,支持网页跳转
    doc <- htmlParse(wp,asText=T,encoding="UTF-8")
    #doc文件显示的中文是乱码,但是不要紧,使用xpath查询结果是正常的
    xpathSApply(doc,"//dt[@class='basicInfo-item name']",xmlValue)#查询电影的基础信息字段名字
    xpathSApply(doc,"//dd[@class='basicInfo-item value']",xmlValue)#查询电影的基础信息的值
    #二者的长度应该是相等的
    
    
    
    ####考虑是否需要转码的程序
    wp2=iconv(wp,"gb2312","UTF-8") #转码
    Encoding(wp2) #UTF-8
    doc <- htmlParse(wp2,asText=T,encoding="UTF-8") #选择UTF-8进行网页的解析
    #查看doc的内容时显示有乱码,但没关系,table的解析结果没有乱码
    tables <-readHTMLTable(doc,header=F)
    
    
    
    
    #使用百度搜索爬虫的例子
    getwd()
    setwd("./我的R/RCurl包学习/")
    #先使用百度搜索一个例子,比如“碟中谍”,获取参数
    url <- "https://www.baidu.com/s?wd=%E7%A2%9F%E4%B8%AD%E8%B0%8D&rsv_op=LteD3w8Y4BopY7Hr664Ak1Oh37Ol8AKpP2A187anxe7YHooBmDGaNkS96wCFnFd7XgAn50j824I648lYQzUlqvED4jYBAvjPX8d93MMky05546hIl122t2pM7269NN5Q7bRIMidr695Ybd0UgCQNjgVcw2y4dt2wMrk29jh0IG7OXWwuj88fRg&tn=91514441_hao_pg&ie=gbk"
    #得到url链接的参数
    getFormParams(url)
    #修改参数wd,即为百度搜索的内容参数wd,其他参数复制粘贴进函数中,然后运行
    wp <- getForm("http://www.baidu.com/s",wd="RCurl",rsv_op ="LteD3w8Y4BopY7Hr664Ak1Oh37Ol8AKpP2A187anxe7YHooBmDGaNkS96wCFnFd7XgAn50j824I648lYQzUlqvED4jYBAvjPX8d93MMky05546hIl122t2pM7269NN5Q7bRIMidr695Ybd0UgCQNjgVcw2y4dt2wMrk29jh0IG7OXWwuj88fRg" ,tn ="91514441_hao_pg",ie ="gbk" )
    doc <- htmlParse(wp,asText=T,encoding="UTF-8")
    write.table(wp,"百度搜索例子.txt")
    
    
    #使用淘宝搜索的页面爬取的例子
    url <- "https://s.taobao.com/search?q=%E5%9B%BE%E8%A7%A3%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.50862.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20161029"
    #得到url链接的参数
    getFormParams(url)
    #修改参数wd,即为淘宝搜索的内容参数q,其他参数复制粘贴进函数中,然后运行
    wp <- getForm("https://s.taobao.com/search?", q="火影",imgfile="",commend="all" ,ssid="s5-e",search_type="item", 
                  sourceId=
                  "tb.index" ,
                  spm =
                  "a21bo.50862.201856-taobao-item.1" ,
                  ie =
                  "utf8" ,
                  initiative_id= 
                  "tbindexz_20161029"  )
    write.table(wp,"淘宝搜索例子.txt")
    
    
    #使用淘宝搜索的页面爬取的例子
    url <- "https://s.taobao.com/search?q=%E5%9B%BE%E8%A7%A3%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0&imgfile=&commend=all&ssid=s5-e&search_type=item&sourceId=tb.index&spm=a21bo.50862.201856-taobao-item.1&ie=utf8&initiative_id=tbindexz_20161029"
    #得到url链接的参数
    getFormParams(url)
    #修改参数wd,即为淘宝搜索的内容参数q,其他参数复制粘贴进函数中,然后运行
    wp <- getForm("https://s.taobao.com/search?", q="火影",imgfile="",commend="all" ,ssid="s5-e",search_type="item", 
                  sourceId=
                    "tb.index" ,
                  spm =
                    "a21bo.50862.201856-taobao-item.1" ,
                  ie =
                    "utf8" ,
                  initiative_id= 
                    "tbindexz_20161029"  )
    write.table(wp,"淘宝搜索例子.txt")
    
    
    
    library(RCurl)
    library(XML)
    #Rstudio 需要设置默认的编码格式为gb2312,即网页的默认编码格式
    #百度新闻查询结果数据是乱码格式,考虑解决的办法
    #试试新浪首页
    url <- "http://www.sina.com.cn/"
    wp<-getURL(url,.encoding="gb2312",followlocation=T) #用网页本身的编码
    #wp2 <- iconv(wp,"gb2312","UTF-8")#转码
    #Encoding(wp2)#编码
    #直接进行解析,#加上参数followlocation=T,支持网页跳转
    doc <- htmlParse(wp,asText=T,encoding="UTF-8")#解析
    #doc文件显示的中文是乱码,但是不要紧,使用xpath查询结果是正常的
    #write.table(xpathSApply(doc,path = "//a",xmlValue),"百度新闻.txt")
    #xpathSApply(doc,path="//ul[@class='list-a news_top']/li/a",xmlValue)
    #xpathSApply(doc,path="//ul[@class='list-a news_bottom']/li/a",xmlValue)
    xpathSApply(doc,path="//div[@class='top_newslist']/ul/li/a",xmlValue)
    
    
    
    
    
    
    
    #使用RCurl爬取豆瓣电影评分
    require(RCurl)
    library(XML)
    x='明日世界'
    search <- getForm("https://movie.douban.com/", search_text = x)
    searchweb<-htmlParse(search,asText=T,encoding="UTF-8")
    #乱码了 searchweb
    searchweb
    # 解析搜索结果页面 
    resnodes<-getNodeSet(searchweb,"//div[@id='wrapper']//table[1]//a")
    #查找id为wrapper的div里面table第一第的数
    resurl<-xmlGetAttr(resnodes[[1]],name="href")
    #找到电影url地址
    resweb<-getURL(resurl,.encoding="UTF-8")  #上该电影主页
    #得到影片页面后第二次解析
    content<-htmlParse(resweb,encoding="UTF-8")
    resnodes<-getNodeSet(content,"//div[@id='interest_sectl']//p[@class='rating_self clearfix']//strong")
    namenodes<-getNodeSet(content,"//div[@id='content']//h1//span")
    #得到影片评分
    score<-xmlValue(resnodes[[1]])
    name<-xmlValue(namenodes[[1]])
    name;
    score;
    
    
    #爬取豆瓣电影top250
    library(stringr)
    library(RCurl)
    library(XML)
    url <- paste("https://movie.douban.com/top250?start=",seq(0,225,by=25),"&filter=",sep = "")
    y <- NULL;
    for (i in 1:length(url)){
    wp<-getURL(url[i],.encoding="gb2312",followlocation=T) 
    doc <- htmlParse(wp,asText=T,encoding="UTF-8")#解析
    #电影名字
    name <- xpathSApply(doc,path="//span[@class='title'][1]",xmlValue)
    #评分
    score <- xpathSApply(doc,path="//span[@class='rating_num' and @property='v:average']",xmlValue)
    #上映时间
    time <- str_extract(xpathSApply(doc,path="//div[@class='bd']/p[@class='']",xmlValue),pattern = '[1-2][0-9]{3}')
    #生产地区
    for(j in 1:25){
    country[j] <- str_split(str_extract(xpathSApply(doc,path="//div[@class='bd']/p[@class='']",xmlValue),pattern = '[1-2][0-9].*/.*/'),pattern = "/")[[j]][2]
    }
    country <- str_trim(country)
    x <- cbind(name,score,time,country)
    y <- rbind(y,x)
        }
    y <- as.data.frame(y)#存入数据框y
    
    
    #豆瓣大众点评
    #报头设置非常重要,爬虫一定要伪装,另外for循环一定要间隔休息
    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"
    )
    
    #url <- "http://t.dianping.com/list/guangzhou?q=%E7%94%B5%E5%BD%B1"
    url <- "https://www.douban.com/"
    url <- paste(url,"search?q=数学分析",sep = "")
    wp<-getURL(url,.encoding="gb2312",followlocation=T,httpheader=myheader) 
    doc <- htmlParse(wp,asText=T,encoding="UTF-8")#解析
    xpathSApply(doc,path = "//div[@class='result']")
    

    总结:

    • R语言做爬虫,如果是爬静态网页,使用RCurl包和XML包就能很好解决,主要是使用Xpath查询语句和正则表达式,另外,最好是在linux环境中进行R爬虫,考虑到中文编码的问题,最好环境是使用Rstudio-server环境。

    相关文章

      网友评论

        本文标题:RCurl包爬虫学习

        本文链接:https://www.haomeiwen.com/subject/qmbiqxtx.html