出发点:相信在工作中,其实很多时候都在做重复性的事情,而爬虫是一种有效避免重复性工作的手段!
下面举例说明:
工作中,偶尔需要设计宣传单页、三折页和画册等宣传资料,每次交给外面做,成品也就那样,毕竟咱也不需要多专业的设计。因此,简单学习下,自己就可以干这部分宣传资料设计的活了。开展这类工作,我的方法就是选择好模板,然后将自家产品内容放上去,整体美观和谐即可。为此,经常浪费很多时间去找合适的模板,很累效率又低下,通过爬虫可以很好的解决这类工作。目前爬虫比较主流的是Python,但由于我之前完全没接触过Python,为了爬虫特地去学也是比较浪费时间的。退而求其次,R语言也可以爬取,而正好有R基础,相对可以较快的掌握。
素材收集方法
- 收集大号分享的各种素材(如单页、三折页、画册等),费时间
- 批量爬取网站素材(目前能力也只能爬取免费素材)
- 直接去淘宝或其他平台购买别人整理收集好的素材,费钱
4. 需要筛选出与行业相符的素材,可以参考行业大佬的网站风格、它们的单页、三折页、画册的样式。
素材网站整理
稍微检索下,超多这样的素材网站,素材内容质量又高又新的(大部需要收费),如千图、昵图。我的要求不高,直接忽略这类,最后定位在素材中国这家网站,免费同时网页结构简单。
爬取案例—素材中国
素材中国是家免费网站,相对来说,爬虫的难度会低些,适用我这种菜鸟级。本次爬虫目的:爬取网站上的宣传页。
打开素材中国主页(用Google Chrome浏览器),在搜索框内输入关键词“宣传单”,检索得到如下界面,发现共计255页,近4000个素材。
第一步:爬取第一页(详情页链接)
首先观察第一页,页面上直接看到就是各个素材的缩略图,而我们要下载它,就需要点击进去,如下图
而我们要下载它,就需要点击进去,如下图,得到该素材详细页面的链接 ,同时该页面也显示了素材的下载地址。简单通过这样一个过程,初步得出简单的获取流程:获取 首页面所有素材的详细页面网址——再获取每个详细页面上的下载地址——素材下载到本地。
# 加载相应的包
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")
运行界面如下,速度还是可以的。
保存至本地的结果如下,做到这里,可能大家觉得貌似没有什么意义。最初目的是为了下载素材,现在整一堆下载链接是什么鬼?不还得自己一个个点击下载。
- 为什么没有直接下载至本地?
想直接通过R爬虫直接将素材下载到本地,但发现下载速度超级慢(还不如手动下载,每个素材大小在40M左右)。而目前知识储备不够,也不知道如何改进下载速度。同时,即使下载成功,也将特别占用空间,重点是里面很多素材不一定使用,还是得自己做初步筛选(因为通过网站的关键词检索,匹配度不是特别好)。
最终诉求:本地爬虫目的在于建立宣传页的汇总库,里面需要包括素材的名字描述、下载链接、图片缩略图,可以先从缩略图上初步看下是否符合自己的设计,然后再针对性的下载素材。这样既可以迅速查阅宣传单样式,又可以避免大量下载一堆素材,占内存又不好找。
在现有excel表格上,需要添加缩略图(前提下载好素材的缩略图,本次爬虫已将缩略图下载到本地文件夹results/),步骤如下:
整理汇总如下,每次需要查找宣传单模板时,可以先看看哪种符合,然后再通过下载链接到本地。
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技能修炼”~~~