首页 > 代码库 > 由爬虫引发的思考

由爬虫引发的思考

前言

  花了两天时间写一个简单的爬虫程序。目前所用的技术十分简单。就是获得目标页面的html文档内容,然后解析其中有用的内容。既没有实现模拟登陆,也没有任何防止反爬虫的措施,甚至没有使用多线程。不过在其中遇到的问题还是引发了我很多的思考与问题,比如爬虫的合法性问题以及爬虫的危害等。于是写下这篇文章记录一下。由于本人经验有限,引用参考了大量文章,有问题请指出。

爬虫的作用与危害

爬虫的作用

  网络爬虫(Web Crawler),又称网络蜘蛛(Web Spider)或网络机器人(Web Robot),是一种按照一定的规则自动抓取万维网资源的程序或者脚本,已被广泛应用于互联网领域。搜索引擎使用网络爬虫抓取Web网页、文档甚至图片、音频、视频等资源,通过相应的索引技术组织这些信息,提供给搜索用户进行查询。随着网络的迅速发展,万维网成为大量信息的载体,如何有效地提取并利用这些信息成为一个巨大的挑战。不断优化的网络爬虫技术正在有效地应对这种挑战,为高效搜索用户关注的特定领域与主题提供了有力支撑。网络爬虫也为中小站点的推广提供了有效的途径,网站针对搜索引擎爬虫的优化曾风靡一时。

  传统网络爬虫从一个或若干个初始网页的URL(Universal Resource Locator统一资源定位符)开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定条件停止抓取。现阶段网络爬虫已发展为涵盖网页数据抽取、机器学习、数据挖掘、语义理解等多种方法综合应用的智能工具。

爬虫的安全问题

  由于网络爬虫的策略是尽可能多的“爬过”网站中的高价值信息,会根据特定策略尽可能多的访问页面,占用网络带宽并增加Web服务器的处理开销,不少小型站点的站长发现当网络爬虫光顾的时候,访问流量将会有明显的增长。恶意用户可以利用爬虫程序对Web站点发动DoS攻击,使Web服务在大量爬虫程序的暴力访问下,资源耗尽而不能提供正常服务。恶意用户还可能通过网络爬虫抓取各种敏感资料用于不正当用途,主要表现在以下几个方面:

  1)搜索目录列表

  互联网中的许多Web服务器在客户端请求该站点中某个没有默认页面的目录时,会返回一个目录列表。该目录列表通常包括可供用户点击的目录和文件链接,通过这些链接可以访问下一层目录及当前目录中的文件。因而通过抓取目录列表,恶意用户往往可获取大量有用的资料,包括站点的目录结构、敏感文件以及 Web服务器设计架构及配置信息等等,比如程序使用的配置文件、日志文件、密码文件、数据库文件等,都有可能被网络爬虫抓取。这些信息可以作为挑选攻击目标或者直接入侵站点的重要资料。

  2)搜索测试页面、手册文档、样本程序及可能存在的缺陷程序

  大多数Web服务器软件附带了测试页面、帮助文档、样本程序及调试用后门程序等。这些文件往往会泄漏大量的系统信息甚至提供绕过认证直接访问Web服务数据的方法,成为恶意用户分析攻击Web服务器的有效情报来源。而且这些文件的存在本身也暗示网站中存在潜在的安全漏洞。

  3)搜索管理员登录页面

  许多网络产品提供了基于Web的管理接口,允许管理员在互联网中对其进行远程管理与控制。如果管理员疏于防范,没有修改网络产品默认的管理员名及密码,一旦其管理员登录页面被恶意用户搜索到,网络安全将面临极大的威胁。

  4)搜索互联网用户的个人资料

  互联网用户的个人资料包括姓名、身份证号、电话、Email地址、QQ号、通信地址等个人信息,恶意用户获取后容易利用社会工程学实施攻击或诈骗。

  因此,采取适当的措施限制网络爬虫的访问权限,向网络爬虫开放网站希望推广的页面,屏蔽比较敏感的页面,对于保持网站的安全运行、保护用户的隐私是极其重要的。

  基于网络爬虫技术的Web漏洞扫描

  前面提到的网络爬虫对网站的间接安全威胁,是通过对网络站点的信息收集为不法份子的非法访问、攻击或诈骗作准备。随着安全技术的发展,利用网络爬虫技术对Web漏洞的直接探测已经出现,这会直接影响到Web服务器的安全。Web服务器漏洞中,跨站脚本(Cross Site Script)漏洞与SQL注入(SQL Injection)漏洞所占比例很高,这两种漏洞均可以通过对网络爬虫的改进来进行探测。由于缺乏足够的安全知识,相当多的程序员在编写Web应用程序时对网页的请求内容缺乏足够的检查,使得不少Web应用程序存在安全隐患。用户可以通过提交一段精心构造的包含SQL语句或脚本的URL请求,根据程序的返回结果获得有关的敏感信息甚至直接修改后台数据。基于目前的安全现状,网络爬虫技术在Web漏洞扫描上的应用,大大提高了发现漏洞的效率。

  基于网络爬虫技术的Web漏洞扫描大至分为如下过程:

  1)页面过滤:通过自动化的程序抓取网站页面,对包Web页面进行URL提取处理,这些HTML标签中包含URL信息,便于恶意用户进行更深入的Web访问或提交操作。

  2)URL匹配:对Web页面中的URL进行自动匹配,提取由参数组合而成的动态查询URL或提交URL,进行下一步的漏洞探测。如动态查询 URL“http://baike.xxxx.com/searchword/?word=frameset&pic=1”,其中 frameset为URL中动态的参数部分,可以进行参数变换。提交URL用于把Web用户的输入提交到服务器进行处理,其参数多为用户输入,同样可以进行参数变换。

  3)漏洞试探:根据动态查询URL或提交URL,自动在参数部分进行参数变换,插入引号、分号(SQL注入对其敏感)及script标签(XSS对 其敏感)等操作进行试探,并根据Web服务器返回的结果自动判断是否存在漏洞。如“URL匹配”中的动态查询URL可以变换成 http://baike.xxxx.com/searchword/?word= &pic=1进行跨站脚本漏洞探测。
 
      不过根据16年颁布的《中华人民共和国网络安全法》,上述扫描行为可能违法。

反爬虫的技术以及如何应对反爬虫

反爬虫

由于网络爬虫带来的安全威胁,不少网站的管理人员都在考虑对爬虫访问进行限制甚至拒绝爬虫访问。实际上,根据网站内容的安全性及敏感性,区别对待爬 虫是比较理想的措施。网站的URL组织应该根据是否为适合大范围公开,设置不同的URL路径,在同一Web页面中既有需要完全公开信息也有敏感信息时,应 通过链接、标签嵌入网页等方式显示敏感内容,另外尽可能把静态页面等经评估安全性较高的页面与安全性较差的动态页面从URL上分开。当限制爬虫时可以针对 URL路径的安全性与敏感性对不同种类的爬虫与代理进行限制。

  限制爬虫可以通过以下几种方法实现:

  1) 设置robots.txt文件

  限制爬虫最简单的方法是设置robots.txt文件。robots.txt文件是搜索引擎爬虫访问网站的时候要查看的第一个文件,它告诉爬虫程序在服务器上什么文件是可以被查看的,如设置Disallow: /,则表示所有的路径均不能查看。遗憾的是并不是所有的搜索引擎爬虫会遵守这个规则,因此仅仅设置robots文件是不够的。

  2) User Agent识别与限制

  要对不理会robots.txt文件的爬虫访问进行限制,首先要把爬虫流量与普通用户的访问流量进行区分,即对其进行识别。一般的爬虫程序都可以通过其HTTP请求中的User Agent字段进行识别,该字段使服务器能够识别客户使用的操作系统及版本、CPU类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。爬虫的User Agent字段一般与浏览器的有所不同,如Google搜索引擎爬虫User Agent字段中会有类似Googlebot的字符串,如User-Agent: Googlebot/2.1 ( http://www.google.com/bot.html),百度搜索引擎爬虫则会有类似Baiduspider的字符串。不少Web服务器软件如 Apache,可以设置通过User Agent字段进行访问过滤,可以比较有效的限制大部分爬虫的访问。

  3) 通过访问行为特征识别与限制

  对于在HTTP请求的User Agent字段刻意伪装成浏览器的爬虫,可以通过其访问行为特征进行识别。爬虫程序的访问一般是有规律性的频率比较高,区别于真实用户浏览时的随意性与低 频率。对这类爬虫的限制原理与DDoS攻击的防御原理很相似,都基于统计数据。对于这类爬虫的限制只能通过应用识别设备、IPS等能够做深度识别的网络设 备来实现。用网络设备限制网络爬虫,不仅比较全面,而且非常适合在多服务器情况下进行统一的管理,避免多服务器单独管理有可能造成的疏漏。

如何应对反爬虫

  1)伪造Headers

  从用户请求的Headers反爬虫是最常见的反爬虫策略。很多网站都会对Headers的User-Agent进行检测,还有一部分网站会对Referer进行检测(一些资源网站的防盗链就是检测Referer)。如果遇到了这类反爬虫机制,可以直接在爬虫中添加Headers,将浏览器的User-Agent复制到爬虫的Headers中;或者将Referer值修改为目标网站域名。对于检测Headers的反爬虫,在爬虫中修改或者添加Headers就能很好的绕过。

  2)基于用户行为反爬虫

  一部分网站是通过检测用户行为,例如同一IP短时间内多次访问同一页面,或者同一账户短时间内多次进行相同操作。大多数网站都是前一种情况,对于这种情况,使用IP代理就可以解决。可以专门写一个爬虫,爬取网上公开的代理ip,检测后全部保存起来。这样的代理ip爬虫经常会用到,最好自己准备一个。有了大量代理ip后可以每请求几次更换一个ip,这在requests或者urllib2中很容易做到,这样就能很容易的绕过第一种反爬虫。对于第二种情况,可以在每次请求后随机间隔几秒再进行下一次请求。有些有逻辑漏洞的网站,可以通过请求几次,退出登录,重新登录,继续请求来绕过同一账号短时间内不能多次进行相同请求的限制。

  3)动态页面的反爬虫

  上述的几种情况大多都是出现在静态页面,还有一部分网站,我们需要爬取的数据是通过ajax请求得到,或者通过JavaScript生成的。首先用Firebug或者HttpFox对网络请求进行分析。如果能够找到ajax请求,也能分析出具体的参数和响应的具体含义,我们就能采用上面的方法,直接利用requests或者urllib2模拟ajax请求,对响应的json进行分析得到需要的数据。

  能够直接模拟ajax请求获取数据固然是极好的,但是有些网站把ajax请求的所有参数全部加密了。我们根本没办法构造自己所需要的数据的请求。我这几天爬的那个网站就是这样,除了加密ajax参数,它还把一些基本的功能都封装了,全部都是在调用自己的接口,而接口参数都是加密的。遇到这样的网站,我们就不能用上面的方法了,我用的是selenium+phantomJS框架,调用浏览器内核,并利用phantomJS执行js来模拟人为操作以及触发页面中的js脚本。从填写表单到点击按钮再到滚动页面,全部都可以模拟,不考虑具体的请求和响应过程,只是完完整整的把人浏览页面获取数据的过程模拟一遍。

  用这套框架几乎能绕过大多数的反爬虫,因为它不是在伪装成浏览器来获取数据(上述的通过添加 Headers一定程度上就是为了伪装成浏览器),它本身就是浏览器,phantomJS就是一个没有界面的浏览器,只是操控这个浏览器的不是人。利用 selenium+phantomJS能干很多事情,例如识别点触式(12306)或者滑动式的验证码,对页面表单进行暴力破解等等。它在自动化渗透中还 会大展身手,以后还会提到这个。

网站盈利模式

技术分享

 

参考 

 

 恶意爬虫这样窥探、爬取、威胁你

    机器人协议
  豆瓣robots.txt内容分析
  解读百度就“违反Robots协议”向360巨额索赔:一场数据争夺战
        sitemap文件写法详解及参数说明
        sitemap文件
       脉脉非法抓取、使用微博用户信息
      中华人民共和国网络安全法   
     “今日头条”怎么计算:“网络爬虫+相似矩阵”技术运作流程
      有多少人看过今日头条的版权声明?
       今日头条 App 存在版权问题吗?是如何解决的?
       几种最常见的网站盈利模式分析
      终于有人把P2P、P2C、O2O、B2C、B2B、C2C 的区别讲透了!
     

写在最后

  现阶段还是注重技术。还要好好学习爬虫相关知识。在仔细理解HTTP。

由爬虫引发的思考