之前在学习目标检测时需要识别几个品牌汽车的logo,为了训练需要获取些汽车图片。一个可以从百度上搜索关键词,但是比如搜索雷克塞斯得到的图片不一定是汽车的,而且图片各式各样,重复率高,质量差,有的非常模糊不利于训练。也可以从ImageNet等图片库获取,不过也是大海捞针,不一定有你要的品牌,而且有logo的数量不多。当然还可以自己去街上4S店等地方拍摄好的图片,但是也很少,而且成本很高。
其实汽车之家、易车网这类专业网站都有很多高质量图片,平时收藏、学习研究、用于文案等等也是不错的,但是几张用浏览器下载就好,多了我们就可以编写爬虫自动下载。等等,最近好像又多了很多爬虫被抓的程序员,不过已经有专业人士辟谣了,很多是夸张了的宣传,所以先来看看什么是爬虫。
什么是爬虫
看下百度百科的解释:网络爬虫(又称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。所以爬虫就是个自动程序,就像在互联网大网上爬动的蜘蛛,所以被叫做spider,就像百度等搜索引擎也是用自动程序爬取网络的图片、网页、视频等信息然后分类建立索引,以便大家搜索,如百度的网页搜索被称为Baiduspider,当然搜索引擎是通用爬虫和特定爬虫的技术实现上还是不大一样,所以爬虫是普遍存在于互联网的。写爬虫程序被抓只是断章取义,从技术中立原则来说,关键看爬虫爬取了什么,然后用来做什么。想想没有百度,我们可能很难找到要的信息,我们的网站可能也是个孤岛没人访问,爬虫提高了效率,只是我们要谨慎使用。
当然这只是简单的概念,具体爬虫是怎么爬呢?
爬虫的原理
首先我们想下平时我们是怎么上网的,从电脑打开浏览器,输入网址也就是一个URL,然后回车获取网站上的文字图片和视频等数据下载到本地浏览器,最后按一定顺序展示出来,而这后面的基础是http请求,HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法,是一套通过网络进行计算机数据通信的规则。而爬虫就是用程序模拟人浏览网页的过程,所以也就是自动构建一个http请求来获取数据。
大致的过程是
用户在浏览器的地址栏中输入一个URL并按回车键之后,浏览器会向HTTP服务器发送HTTP请求。HTTP请求主要分为“Get”和“Post”两种方法。GET是获取数据,POST是发送数据。HTTP报文包括请求行、请求头和请求体等组成。请求行就像一个信封告诉服务器我来自哪里,协议和方法等基本信息,而请求体就是告诉服务器我要具体拿什么数据了。
浏览器发送一个Request请求,它是封装了http报文的对象,去获取指定网页的html文件, 服务器把需要的数据封装到Response文件对象,然后发送回给浏览器。
浏览器分析Response中的 HTML,解析里面的文件,也可能有很多其它资源比如图片文件,CSS文件,JS文件。 浏览器会自动再次发送Request去获取图片,CSS文件,或者JS文件,这时候就是在下载数据的过程。当下载后,网页再根据拼接出整个页面显示出来。
什么是robots协议
那问题来了,我不想网页的某些内容被爬虫爬取该怎么办呢,有个叫robots的协议可以规定。Robots协议(也称为爬虫协议、机器人协议等)的全称是“网络爬虫排除标准”(Robots Exclusion Protocol),Robots.txt 是存放在站点根目录下的一个纯文本文件。网站通过Robots协议告诉搜索引擎哪些网站页面可以抓取,哪些网站页面不能被抓取。
Robots.txt文件一般包含一条或更多的记录,这些记录通过空行分开(以CR,CR/NL, or NL作为结束符),每一条记录的格式如下所示:
"
User-agent : 描述spider爬虫的名字,就是描述用户是用什么工具来访问的,可以是爬虫,也可以是浏览器。如果有多条User-agent记录说明有多个robot会受到"robots.txt"的限制,robots.txt文件中,至少要有一条User-agent记录。如果该项的值设为*,则下面的限制对任何robot均成立。
Disallow: 描述不希望被访问到的一个URL,这个URL可以是一条完整的路径,也可以是部分的,也可以为空就表示都可以访问。
Allow: 描述可以被访问的一组URL, 这个URL可以是一条完整的路径,也可以是路径的前缀,以Allow项的值开头的URL 是允许robot访问的。
Sitemap: 就是词面意思站点地图,告诉爬虫网站上有哪些网页可以抓取。最简单的 Sitemap 形式,就是XML 文件,在其中列出网站中的网址以及关于每个网址的其他元数据(上次更新的时间、更改的频率以及相对于网站上其他网址的重要程度为何等),以便搜索引擎可以更加智能地抓取网站。对于商业网站,sitemap就很有利于SEO,让搜索引擎更好搜索和抓取记录,可以参考http://help.bj.cn/ 生成。
实际例子比如访问 http://news.sina.com.cn/robots.txt 页面显示
User-agent: *
Disallow: /wap/
Disallow: /iframe/
Disallow: /temp/
* 表示所有用户,disallow 包括三个网址,也就是禁止爬取 http://news.sina.com.cn/wap/ http://news.sina.com.cn/iframe/ http://news.sina.com.cn/temp/ 三个网址的内容
如果要允许所有用户抓取所有站点的页面可以写成:
User-agent: *
Disallow:
或者
User-agent: *
Allow: /
*代表所有 /代表目录
如果想只让百度索引自己的网站,其它爬虫禁止爬取则可以写成:
User-agent: Baiduspider
Disallow:
User-agent: *
Disallow: /
如果要禁止百度抓取网站的图片文件可以写成:
User-agent: Baiduspider
Disallow: .jpg$
Disallow: .jpeg$
Disallow: .gif$
Disallow: .png$
Disallow: .bmp$
使用“$”的话表示是否允许访问某目录下某个后缀的文件。
如果要禁止特定搜索引擎抓取网站,比如京东的 https://www.jd.com/robots.txt
User-agent: *
Disallow: /?*
Disallow: /pop/*.html
Disallow: /pinpai/*.html?*
User-agent: EtaoSpider
Disallow: /
User-agent: HuihuiSpider
Disallow: /
User-agent: GwdangSpider
Disallow: /
User-agent: WochachaSpider
Disallow: /
EtaoSpider、HuihuiSpider、GwdangSpider、WochachaSpider这些就是一淘 、我查查等著名爬虫。
robots协议就是网站为了保护用户隐私安全、商业数据安全和网站性能安全等行业内自己约定的规范。
Robots协议的使用
网络爬虫:
自动或人工识别robots.txt,再进行内容爬取
约束性:
Robots协议是建议但非约束性,网络爬虫可以不遵守,但存在法律风险
爬虫的危害
影响服务器性能
可见爬虫是模拟用户浏览器访问,如果有短时间大量的用户访问势必影响网站性能,而爬虫这自动程序会有更快的访问速度。
侵犯用户隐私
很多网站有着大量用户的隐私数据,比如个人卡号、电话号、公积金、不动产等等,那么如果泄露这些数据对于用户的隐私权是巨大侵害。
侵犯网站产权
比如爬取的数据是不被公开的商业秘密,或者是网站盈利的主要模式,或者是独创的知识产权,就会构成不正当竞争,例如爬取qq音乐的音乐用于盈利,肯定是侵犯了qq网站的权益。
反爬虫
既然爬虫是有风险的,那么如何限制爬虫,有些常见的策略
一个就是上面所说的robots.txt文件里加入user-agent限制请求,限制一些爬虫,或者对请求Headers的User-Agent进行检测,在网站加入user-agent白名单,只允许部分可以访问。
一种用限制ip的方法来反爬虫,比如短时间一个ip不断快速大量访问,可能就判断爬虫了
还有就是通过页面的js脚本来限制,比如设置数字验证码或是图像验证码
还比如字体反爬虫,网页在开发者模式打开看很多文字是乱码,比如汽车之家
当然这些是比较常见的技术手段,当然还有更为复杂的方式,比如网站只是动态框架页面,抓取后只是框架没内容,还有对动态请求加密的,参数无法解析,也就无法进行抓取。
反反爬虫
看到这很多稍微了解的法律工作者或者用户管理者就会说那很简单,制定反爬虫的相关法规就好了,其实没有一劳永逸的简单方法,道高一尺魔高一丈,总有研究技术的有办法解决,这就是反反爬,比如模拟cookie,多用户登录,多时段爬取等等方法,这里就不再具体讲了,网络上各种爬虫课程都会介绍。而且另一方面,这个robots协议其实也是个行业的技术规范,其实就是个君子协议,没有非常明确的法律案例,没法做更具体更实操性的操作,就像是开源协议等等,而且也是时刻变化的,你只能自觉遵守,如果违反了但是没人投诉也不会有什么,有投诉那也是非常难决策了,耗时耗力成本高。而且就像我们常看的广告里说的最终解释权归商家解释一样,很多robots设定也是网站设置,并不能说明是否可以爬取,那就无法公正解释了,只能从知识产权来说,但也有很多平台也是收集个人原创数据的,那你说如何界定呢。
那么我们该如何决策和更好学习呢
可以从法律一般规则和数据产权角度看,一般要遵守的是
1、个人隐私的暴露
像个人电话、收集短信,聊天记录、所在位置一般是不能公开,属于个人隐私的就避免爬取了。爬了也只能是做内部分析,不能泄露。
2、数据侵权的情况
包括对基本人权的侵害,现在大数据时代,越来越多平台和企业注重大数据,大数据核心价值是分析、评估和预测,比如在股票分析,物价波动等领域,但如果有人盗取暴露相关信息,就会影响社会稳定,也会影响个人,从而削减了社会创新、个人发展,企业创新等等权利。这些数据肯定也只是自己玩下就好了。
第二个是对用户隐私的侵害
这不仅是对个人的保护,也是对一些国家机密的保护
第三个是对数据产权的侵害
这些数据很多是创新的源泉,如果都不能被保护那即是从另一个方面套取商业机密,同时就违反了正当公平的竞争。
所以主要原则是不违背基本法律法规,比如可以参考美国的《消费者隐私权法案》、欧盟的《通用数据保护条例》,我国主要就是参考基本的《反不正当竞争法》、《中华人民共和国网络安全法》、《信息安全技术个人信息安全规范》等相关法规了。
参考:
http://www.liuheng.org/jishu/1156.html
《掘金大数据》 电信数据金矿详解、挖掘及应用
https://blog.csdn.net/mygodit/article/details/83572985