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

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

下面举例说明:
工作中,偶尔需要设计宣传单页、三折页和画册等宣传资料,每次交给外面做,成品也就那样,毕竟咱也不需要多专业的设计。因此,简单学习下,自己就可以干这部分宣传资料设计的活了。开展这类工作,我的方法就是选择好模板,然后将自家产品内容放上去,整体美观和谐即可。为此,经常浪费很多时间去找合适的模板,很累效率又低下,通过爬虫可以很好的解决这类工作。目前爬虫比较主流的是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技能修炼”~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343