美文网首页
R爬虫在工作中的一点妙用

R爬虫在工作中的一点妙用

作者: Clariom | 来源:发表于2020-06-23 20:20 被阅读0次

    出发点:相信在工作中,其实很多时候都在做重复性的事情,而爬虫是一种有效避免重复性工作的手段!

    下面举例说明:
    工作中,偶尔需要设计宣传单页、三折页和画册等宣传资料,每次交给外面做,成品也就那样,毕竟咱也不需要多专业的设计。因此,简单学习下,自己就可以干这部分宣传资料设计的活了。开展这类工作,我的方法就是选择好模板,然后将自家产品内容放上去,整体美观和谐即可。为此,经常浪费很多时间去找合适的模板,很累效率又低下,通过爬虫可以很好的解决这类工作。目前爬虫比较主流的是Python,但由于我之前完全没接触过Python,为了爬虫特地去学也是比较浪费时间的。退而求其次,R语言也可以爬取,而正好有R基础,相对可以较快的掌握。

    素材收集方法

    1. 收集大号分享的各种素材(如单页、三折页、画册等),费时间
    2. 批量爬取网站素材(目前能力也只能爬取免费素材)
    3. 直接去淘宝或其他平台购买别人整理收集好的素材,费钱
      4. 需要筛选出与行业相符的素材,可以参考行业大佬的网站风格、它们的单页、三折页、画册的样式。

    素材网站整理

    稍微检索下,超多这样的素材网站,素材内容质量又高又新的(大部需要收费),如千图、昵图。我的要求不高,直接忽略这类,最后定位在素材中国这家网站,免费同时网页结构简单。


    image
    image

    爬取案例—素材中国

    素材中国是家免费网站,相对来说,爬虫的难度会低些,适用我这种菜鸟级。本次爬虫目的:爬取网站上的宣传页。

    打开素材中国主页(用Google Chrome浏览器),在搜索框内输入关键词“宣传单”,检索得到如下界面,发现共计255页,近4000个素材。

    image image

    第一步:爬取第一页(详情页链接)

    首先观察第一页,页面上直接看到就是各个素材的缩略图,而我们要下载它,就需要点击进去,如下图

    image

    而我们要下载它,就需要点击进去,如下图,得到该素材详细页面的链接 ,同时该页面也显示了素材的下载地址。简单通过这样一个过程,初步得出简单的获取流程:获取 首页面所有素材的详细页面网址——再获取每个详细页面上的下载地址——素材下载到本地

    image
    # 加载相应的包
    library(rvest)
    library(downloader)
    
    url1 <- c("http://so.sccnn.com/search/%E5%AE%A3%E4%BC%A0%E5%8D%95/1.html")#第一页的网址
    web <- read_html(url1,encoding="gb2312")  #注意每个网页的编码格式,可以到头部文件中查看
    #获取素材详细页面链接
    links <- web %>% html_nodes('tbody tr td div a') %>% html_attr("href") # 标题内容解析
    links #结果如下,发现重复了一遍,查看源码,的确存在两次链接
    links<-links[seq(1,32,2)] #seq(from=1,to=32,by=2)构建等差序列,#提取其中一份即可
    
    # [1] "http://www.sccnn.com/gaojingtuku/guanggaosheji/DMxuanchuandan/20200604-261700.html"  
    # [2] "http://www.sccnn.com/gaojingtuku/guanggaosheji/DMxuanchuandan/20200604-261687.html"  
    # [3] "http://www.sccnn.com/dianshuqu/haibaochuandan/20200604-261672.html"                  
    # [4] "http://www.sccnn.com/gaojingtuku/guanggaosheji/DMxuanchuandan/20200603-261628.html"  
    # [5] "http://www.sccnn.com/dianshuqu/yangji/20200603-261605.html"                          
    # [6] "http://www.sccnn.com/gaojingtuku/guanggaosheji/pingmianguanggao/20200602-261549.html"
    # [7] "http://www.sccnn.com/dianshuqu/haibaochuandan/20200602-261544.html"                  
    # [8] "http://www.sccnn.com/gaojingtuku/jierisucai/duanwujie/20200529-261317.html"          
    # [9] "http://www.sccnn.com/gaojingtuku/jierisucai/ertongjie/20200528-261269.html"          
    # [10] "http://www.sccnn.com/gaojingtuku/guanggaosheji/pingmianguanggao/20200528-261268.html"
    # [11] "http://www.sccnn.com/gaojingtuku/guanggaosheji/DMxuanchuandan/20200528-261265.html"  
    # [12] "http://www.sccnn.com/gaojingtuku/jierisucai/ertongjie/20200527-261183.html"          
    # [13] "http://www.sccnn.com/gaojingtuku/guanggaosheji/pingmianguanggao/20200527-261182.html"
    # [14] "http://www.sccnn.com/gaojingtuku/guanggaosheji/pingmianguanggao/20200526-261094.html"
    # [15] "http://www.sccnn.com/gaojingtuku/guanggaosheji/DMxuanchuandan/20200525-260999.html"  
    # [16] "http://www.sccnn.com/gaojingtuku/guanggaosheji/zhanbanmoban/20200525-260998.html"
    

    第二步:爬取第一页(素材名称、缩略图、下载链接)

    #首先针对第一页第一个素材
    url0 <- c("http://www.sccnn.com/gaojingtuku/guanggaosheji/DMxuanchuandan/20200604-261700.html")#首页首图的详情页链接
    web <- read_html(url0,encoding="gb2312")  #注意每个网页的编码格式,可以到头部文件中查看
    #获取素材题目
    Title <- web %>% html_nodes('div.PhotoDiv h2') %>%  html_text()
    Title <- paste0("1.",Title)
    Title
    #获取素材缩略图地址
    jpg.link <-web %>% html_nodes('div.PhotoDiv img') %>% html_attr("src")
    jpg.link
    #下载缩略图到本地
    download.file(jpg.link,paste0("results/",Title,".jpg"),mode = "wb")
    #获取素材下载地址
    download_link <- web %>% html_nodes('div.down a') %>%  html_attr("href")
    download_link <- download_link[1]
    
    
    ##获取第一页所有素材的下载链接
    #每页包含16个素材,需要对每个素材的详情页面进行提取,可以用for循环
    results <- data.frame() #构建空矩阵,用来存放数据
    i=1
    for(i in 1:length(links)){
      web <- read_html(links[i],encoding="gb2312")
      #获取素材题目
      Title <- web %>% html_nodes('div.PhotoDiv h2') %>%  html_text()
      Title <- paste0(i,".",Title)
      Title
      #获取素材缩略图地址
      jpg.link <-web %>% html_nodes('div.PhotoDiv img') %>% html_attr("src")
      #下载缩略图到本地
      download.file(jpg.link,paste0("results/",Title,".jpg"),mode = "wb")
      #获取素材下载地址
      download_link <- web %>% html_nodes('div.down a') %>%  html_attr("href")
      download_link <- download_link[1]
      result <- data.frame(Title=Title,JPG_link=jpg.link,Download_link=download_link)
      #合并所有页面数据成数据框
      results <- rbind(results,result)
    }
    

    第三步:分析网址规律,爬取所有页面

    第1页:http://so.sccnn.com/search/%E5%AE%A3%E4%BC%A0%E5%8D%95/1.html
    第2页:http://so.sccnn.com/search/%E5%AE%A3%E4%BC%A0%E5%8D%95/2.html
    第3页:http://so.sccnn.com/search/%E5%AE%A3%E4%BC%A0%E5%8D%95/2.html
    ...
    第255页:http://so.sccnn.com/search/%E5%AE%A3%E4%BC%A0%E5%8D%95/255.html
    从以上网址,不难看出规律,网址跟着页面,只变动最后数值,因此可以轻松构建出以上网址。

    #以爬取前50页为例
    rm(list = ls())
    library(rvest)
    library(downloader)
    
    url1 <- c("http://so.sccnn.com/search/%E5%AE%A3%E4%BC%A0%E5%8D%95/1.html")#第一页的网址
    web <- read_html(url1,encoding="gb2312")  #注意每个网页的编码格式,可以到头部文件中查看
    #获取素材详细页面链接
    links <- web %>% html_nodes('tbody tr td div a') %>% html_attr("href") # 标题内容解析
    links #结果如下,发现重复了一遍,查看源码,的确存在两次链接
    links<-links[seq(1,32,2)] #seq(from=1,to=32,by=2)构建等差序列,#提取其中一份即可
    
    i=1
    j=1
    results <- data.frame()
    
    for(j in 1:50){
      print(paste0("正在下载:","第",j,"页"))
      url <- c(paste0("http://so.sccnn.com/search/%E5%AE%A3%E4%BC%A0%E5%8D%95/",j,".html"))
      fit<-try(web <- read_html(url,encoding="GB18030"),silent=TRUE)
      if('try-error' %in% class(fit)){
        cat('HTTP error 404\n')
      }else{
        #获取素材详细页面链接
        links <- web %>% html_nodes('tbody tr td div a') %>% html_attr("href") # 标题内容解析
        links<-links[seq(1,32,2)] #seq(from=1,to=32,by=2)
        
        for(i in 1:length(links)){   
          fit<-try(web <- read_html(links[i],encoding="GB18030"),silent=TRUE)
          if('try-error' %in% class(fit)){
            cat('HTTP error 404\n')
          }else{
            #获取素材题目
            Title <- web %>% html_nodes('div.PhotoDiv h2') %>%  html_text()
            Title <- paste0(16*(j-1)+i,".",Title)
            print(paste0("正在下载:","第",j,"页:",Title))
            #获取素材缩略图地址
            jpg.link <-web %>% html_nodes('div.PhotoDiv img') %>% html_attr("src")
            #下载缩略图到本地
            download.file(jpg.link,paste0("results/",Title,".jpg"),mode = "wb")
            #获取素材下载地址
            download_link <- web %>% html_nodes('div.down a') %>%  html_attr("href")
            download_link <- download_link[1]
            result <- data.frame(Title=Title,JPG_link=jpg.link,Download_link=download_link)
            #合并所有页面数据成数据框
            results <- rbind(results,result)
         }
       }
     }
    }
    
    write.csv(results,file = "宣传单素材汇总.csv")
    

    运行界面如下,速度还是可以的。

    image.png

    保存至本地的结果如下,做到这里,可能大家觉得貌似没有什么意义。最初目的是为了下载素材,现在整一堆下载链接是什么鬼?不还得自己一个个点击下载。

    • 为什么没有直接下载至本地?

    想直接通过R爬虫直接将素材下载到本地,但发现下载速度超级慢(还不如手动下载,每个素材大小在40M左右)。而目前知识储备不够,也不知道如何改进下载速度。同时,即使下载成功,也将特别占用空间,重点是里面很多素材不一定使用,还是得自己做初步筛选(因为通过网站的关键词检索,匹配度不是特别好)。

    image

    最终诉求:本地爬虫目的在于建立宣传页的汇总库,里面需要包括素材的名字描述、下载链接、图片缩略图,可以先从缩略图上初步看下是否符合自己的设计,然后再针对性的下载素材。这样既可以迅速查阅宣传单样式,又可以避免大量下载一堆素材,占内存又不好找。

    在现有excel表格上,需要添加缩略图(前提下载好素材的缩略图,本次爬虫已将缩略图下载到本地文件夹results/),步骤如下:

    image

    整理汇总如下,每次需要查找宣传单模板时,可以先看看哪种符合,然后再通过下载链接到本地。

    image

    R爬虫总结

    通过以上这个简单案例,大致展示了R爬虫的操作流程,可以简要地概括为“抓取网页”“分析网页”“存储内容”三个阶段。
    (1)抓取网页:通过程序语言将目标网页抓取下载下来;
    (2)分析网页:应用相关函数对URL进行解析并提取目标数据;
    (3)存储内容:最后将数据存入本地数据库。
    无论一个爬虫框架有多复杂,大体都离不开这三大过程,其间涉及网页遍历、批量抓取、如何设置代理、cookie登入、伪装报头、GET/POST表单提交等复杂的技术细节,这些都增加了爬虫难度。

    完成上述完整R爬虫,初步需要掌握以下几点:

    • 网页的基本知识:Html基础;XML基础、CSS等
    • 网页抓取工具:R包rvest、Rcurl、httr等
    #如rvest这个R包,R爬虫最基础最简单的应用
    #rvest数据抓取的几个核心函数:
    #read_html():下载并解析网页
    #html_nodes():定位并获取节点信息
    #html_text():提取节点属性文本信息
    #html_attrs():提取节点属性
    
    • 信息提取规则:CSS选择器(Selectgade)/Xpath/正则等则等

    今天的内容就先到这里啦~ 后期会穿插记录几期R爬虫必备知识点,以及R爬虫的在工作中的具体实战!更多内容可关注公共号“YJY技能修炼”~~~

    相关文章

      网友评论

          本文标题:R爬虫在工作中的一点妙用

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