经历过绝望之后,选择去知乎爬了几张图~

本来今天要跟大家分享怎么批量爬取2016年各大上市公司年报的,可是代码刚写了开头,就发现年报这玩意儿,真的不太好爬,还以为自己写的姿势不对,换了好几个网站。

眼睁睁的开着网页源码里排的整整齐齐的pdf文档,可是就是爬不到,NND,还是火候不够,本来打算放弃的,可是想着不干点什么太没成就感了,就跑去知乎爬了人家几张图。

之前分享过知乎爬图的代码,当时利用的Rvest爬的,今天换RCurl+XML包来爬,也算是新知识点了。

用R语言抓取网页图片——从此高效存图告别手工时代

因为害怕爬太多,会被禁IP,毕竟知乎每天必看的,被禁了那就不好了,特意选了个图片不多的摄影外拍的帖子。

外拍帖子地址

代码一共没几行,很好理解,可以作为学习的案例:

数据准备:

1
2
3
4
5
6
#加载包:
library("RCurl")
library(XML)
library(stringr)
library(dplyr)
library(plyr)

爬取过程:

1
2
3
4
5
6
7
8
9
url<-"https://www.zhihu.com/question/31785374/answer/150310292"
#获取目标网页(注意查看网页编码)
rd <-getURL(url,.encoding="UTF-8")
#利用xml包函数整理网页树结构
rdhtml <- htmlParse(rd,encoding="UTF-8")
#获取根目录
root <- xmlRoot(rdhtml)
#获取话题下的所有img标签(里面含有所有的图片网址)
Name<-getNodeSet(root,"//div[@class='zm-editable-content clearfix']/img")

根据Name列表中的内容,img下面有关于三个带图片网址的属性,第一个src是打开帖子直接看到的,后两个data-original\data-actualsrc是该图片的原地址,就是点击图片后大图的网址。

这里选择data-original网址,利用拉laply函数提取该属性下的网址列表。

1
2
3
Name1 <-laply(Name,xmlGetAttr,name='data-original')
#为方便命名,这里截取一部分图片网址后缀作为名称
Name2<-sub("https://pic\\d.zhimg.com/v2-","",Name1)

下载过程

1
2
3
4
5
6
#建立新文件夹
dir.create("D:/R/Image/zhihu/image")
#使用for循环批量下载:
for(i in 1:length(Name1)){
download.file(Name1[i],paste0("D:/R/Image/zhihu/image/",Name2[i],sep = ""), mode = "wb")
}

###最终收获:

爬图的核心要点:

  • 抓img下的图片网址,这里你要学会迅速的进行html结构定位,无论是使用CSS选择器还是Xpath路径,都要稳、准、狠!这是决定你整过过程的首要任务。
  • 建立批量下载任务:无论是使用for循环还是使用其他的向量化函数都可以,图多的话还是建议尝试使用apply组函数或者plyr包内的升级版apply函数族。
  • 如果网页结构复杂且图比较多,可能要考虑伪装报头、设置随机暂停以防被封IP。

联系方式:
wechat:ljty1991
Mail:578708965@qq.com
个人公众号:数据小魔方(datamofang)
团队公众号:EasyCharts
qq交流群:[魔方学院]298236508

个人简介:
杜雨
财经专业研究僧;
伪数据可视化达人;
文科背景的编程小白;
喜欢研究商务图表与地理信息数据可视化,爱倒腾PowerBI、SAP DashBoard、Tableau、R ggplot2、Think-cell chart等诸如此类的数据可视化软件,创建并运营微信公众号“数据小魔方”。
Mail:578708965@qq.com


备注信息:
知识共享许可协议
本作品采用知识共享署名-非商业性使用 4.0 国际许可协议

坚持原创技术分享,您的支持将鼓励我继续创作!