基于Scrapy框架的威胁情报抓取以及处理系统的设计与实现_第1页
基于Scrapy框架的威胁情报抓取以及处理系统的设计与实现_第2页
基于Scrapy框架的威胁情报抓取以及处理系统的设计与实现_第3页
基于Scrapy框架的威胁情报抓取以及处理系统的设计与实现_第4页
基于Scrapy框架的威胁情报抓取以及处理系统的设计与实现_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于Scrapy框架的威胁情报抓取以及处理系统的设计与实现DesignandimplementationofthreatinfornationsystembasedonscrapyTechnology内容摘要随着安全技术的发展,网络安全防御措施成为了一种重要资产,如何通过现有的威胁情报数据进行快速有效的提取和分析数据是目前的一个研究热点。针对开源威胁网站以及博客等海量安全数据采用Scrapy框架设计网络爬虫对数据进行提取,并将其以知识图谱所需要的底层数据存储,通过scrapy爬虫技术,可以使得通过对各个数据源的爬虫文件,针对性的爬取所需要的信息以及信息的解析整合入库,从而在这个基础上进行多方向的研究。安全防范的目标不仅仅是在攻击到达前阻挡它,还应该包括阻断它达到其最终目的。本次的毕业设计课题将围绕基于对开源威胁情报网站的爬取与数据解析系统进行设计与实现。系统将实现由Scrapy爬虫框架爬取开源威胁情报网站上公开的数据进行解析入库,通过Flask_admin+nginx以及pyecharts来展示所抓取的数据以及相对于的查询与导出功能;本系统由爬虫模块、数据解析模块以及数据展示模块组成,很大程度上实现了APT知识图谱的数据需求。关键词:APT知识Scrapy爬虫技术AbstractWiththedevelopmentofsecuritytechnology,networksecuritydefensemeasureshavebecomeanimportantasset.Howtoextractandanalyzedataquicklyandeffectivelythroughtheexistingthreatintelligencedataisaresearchhotspotatpresent.Formassivesecuritydatasuchasopen-sourcethreatwebsitesandblogs,weusethescrapyframeworktodesignwebcrawlerstoextractdata,Itcanstorethebottomdataneededbyknowledgemap,andthroughthetechnologyofcrawler,itcanintegratethecrawlerfilesofeachdatasource,theinformationneededfortargetedcrawlingandtheanalysisofinformationintothedatabase,soastocarryoutmulti-directionalresearchonthisbasis.Thegoalofsecurityisnotonlytoblocktheattackbeforeitarrives,butalsotoblockittoachieveitsultimategoal.Thisgraduationprojectwillfocusonthedesignandimplementationofcrawlinganddataanalysissystembasedonopensourcethreatinformationwebsite.Thesystemwillbeimplementedbyscrapycrawlerframeworktocrawlopen-sourcethreatinformationwebsiteopendataforanalysisandstorage,anddisplaythecaptureddataandrelativequeryandexportfunctionsbyflask_admin+nginxandpyecharts;thesystemiscomposedofcrawlermodule,dataanalysismoduleanddatadisplaymodule,whichlargelyrealizesthedatarequirementsofAPTknowledgemap.Keywords:APTknowledgeScrapyCrawlerTechnology

目录第一章绪论 绪论1.1课题背景及意义高级持续攻击(APT)是指高级持续攻击的概念,由美国于2006年首次正式提出,APT攻击目前被认为是一种具备顶级安全技术和富有资源的强劲对手。它们主要的任务是有目的地去扩大信息根据地,实现更多披露信息或者摧毁和阻碍运营计划或组织,以实现关键任务,或者将它们放在未来能够发挥作用的地方。此外,为了实现其目标,高级持续性威胁将反复持续很长时间,并通过各种手段(自动升级)抵抗防御者的努力。同时与外界保持一定程度的互动以实现其目标。这类型攻击目前大多数已经上升为国家性的网络安全,如何做好抵抗APT攻击已然成为各个国家网络安全建设的重中之重。本系统的设计目的主要是为了尝试使用当前流行的scrapy框架爬虫技术对开源网站上与APT知识图谱有关的知识根据需求解析与入库,为APT知识图谱的知识做底层数据支持。1.2国内外研究现状目前,在安全领域中认为那些具备高技术与安全资源的APT攻击皆来自于国家层次的有目的的间谍活动抑或是民间黑客组织,这些APT攻击具有高级,持久性,以及高威胁的特点。APT攻击目标通常是国家层次重大的信息,高新科研领域技术,国家中的巨型商业公司,无论是哪一方,若是遭受到了APT攻击,将会付出惨痛的代价,这个代价最高可以影响到国家安全。因而各个国家都开始上升对APT攻击的安全防御以及态势感知,在这个方面上的投入不亚于现实中的军备竞赛。国家对于APT攻击的重视有助于提升整个国家对于APT攻击的研究和防御意识的培养,提升国家对于APT攻击的防御能力。APT攻击具有很强的隐蔽性,并且都是以国家级的支持来进行攻击行为,所以传统的一般态势感知系统等安全防御措施很难检测发现得到。APT的单兵的隐藏能力极高,随身携带的IP以及恶意代码都是可更改的,根据某一特征来识别基本是很难检测得到。1.3课题研究内容从震网事件到乌克兰停电事件,再到NSA的方程式组织的行动,APT组织慢慢的跟各国情报机构越来越紧密,例如俄罗斯支持的APT28组织多次影响美国大选,诞生一个“选举安全”的新词。而现在,保障2020选举安全成为美国的政治任务,推特和Facebook忙着删帖,微软等忙着跟踪处理APT28的C&C。而越南政府资助的海莲花组织主要以中国政府、科研等重要部门为攻击对象;顺便攻击了宝马等著名车企。中国工程院院士戴浩在2019CNCERT中国网络安全年会上指出,过去以国家名义发起的网络战鲜有发生,APT攻击属于“暗战”,但近年来为了加强震慑意义,开始出现以国家名义公开宣称发动网络战,网络战开始出现“明暗交织”的情况。基于此,作为一名爱国青年,我将尝试使用当前流行的爬虫技术对开源威胁情报中心的相关数据进行爬取以及按照网上的相关知识进行建表解析入库,为国家安全献上属于自己的力量。本文系统采用Scrapy-redis框架技术进行开发,该框架通过模块化爬虫的各个流程,使得开发简便,只需要编写相对于的爬取规则以及解析入库规则,辅以中间件来反爬虫。系统使用Flask-admin+nginx+bootstrap+sqlalchemy技术来快速搭建展示模块,flask轻小便捷,适合业务逻辑不复杂的web应用,bootstrap可达成快速开发的需求,sqlalchemy的ORM技术可以减少原生sql语句的编写工作。开发技术与工具2.1Scrapy技术简介本系统的数据爬取框架使用的是scrapy+redis,而Scrapy是一套基于Twisted的异步处理框架,充分利用了python的语言优势来实现的爬虫框架,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,例如针对所爬取网页的页面结构分析后编写的爬虫代码,数据管道的设计,爬取过程中的中间件编写等。Scrapy用来抓取大量的网页数据亦或是媒体资源等来说是非常之方便,辅之以redis可在项目后期拓展单机为分布式爬取,加大爬取的速率以及躲避部分反爬虫措施。2.2Python语言介绍Python是目前最为流行的语言之一,目前大多数应用于高新技术领域,就如人工智能与深度学习以及数据处理,但是不置可否的是它在轻量的web应用上面的优势。它适合用于快速开发一个小型的web应用,主流框架Django更是在CMS领域大行其道,在本文中我将使用另外一种基于Python的web框架来进行开发,它比Django还要轻,它就是Flask。2.3Mysql数据库简介在本文中我将使用mysql来作为数据驱动系统,Mysql在我最初接触web的时候就已经在使用了,那个时候PHP+MYSQL是web应用开发的首选,DZ论坛,dede织梦系统都是使用mysql来作为数据库。虽然现在越来越多的程序员转向其他语言,没有使用PHP,但还是无法动摇Mysql在轻量级应用上的地位,它入手快,简洁明了的安装过程,同时还支持在各种web框架中应用,支持范围广。在github上的各种开源项目中,它无处不在。本文中需要用到数据与数据之间的关联关系,所有采用mysql这种sql型数据库是再适合不过了。2.4redis数据库简介Redis是一个no-sql型的数据库,它常用于缓存,在scrapy中它是另外一个身份,不过也跟缓存差不多的功能,它用于爬虫队列的管理,以及指纹信息的录入。它可以建立一个连接池,目前常用于分布式爬虫的部署中,在本系统中虽然是单机爬取,但是我还是选择了用scrapy+redis的框架来爬取,因为redis在爬虫的断点续爬和指纹信息去重中的用处也是极大的。我之前有使用过其他去重方案,例如BerkeleyDB的deltafetch,但是这种方案在爬取任务大的情况下延展性不高,而且如若爬虫被强制中断,会导致相关缓存文件损坏,指纹信息丢弃,去重效果便没有了。Redis在去重环节的使用是十分灵活的,我将在文中着重提到这一点。其次,本系统所使用到的代理池也是基于redis数据库的,将可用代理放入redis中,随机进行抽取,可以很好的筛选和使用代理。2.5Flask_admin简介作为一个微框架,Flask允许您用很少的开销构建Web服务。它给你(设计者)以一种适合你的特定应用的方式实现项目的自由。在微服务和应用编程接口的世界里,Flask-Admin解决了在现有数据模型之上构建管理接口的无聊问题。无需任何努力,它使您能够通过用户友好的界面管理网络服务的数据。Flask-Admin的基本概念是,它允许您通过将类中的视图分组在一起来构建一个复杂的接口:您在前面看到的每个网页都代表一个已经明确添加到接口类中的方法。当绑定到特定的数据库模型时,这些视图类特别有用,因为它们使您能够在逻辑上将所有传统的创建、读取、新,删除(CRUD)视图分组到每个模型的单个独立类中。2.6Nginx简介Nginx是一个反向代理网络服务器,它一开始是主要用来做邮箱服务器的,再后来慢慢的变成了一个高性能的网络服务器,现在得到了更多的普及,很多大型的互联网公司也采用了这种简单高效,配置还相当简单的服务。事实上,它的确是值得信赖的,在大多数情况下,如果具有相同服务器资源配置下,nginx服务器会使得并发的性能更好,负载均衡更优秀,也更稳定。2.7开发环境介绍2.7.1软件环境序号名称版本备注1UbuntuUbuntu18.04.4LTS操作系统2Mysql5.7数据库3Redis4.0.9爬虫支持4Nginx1.14.1Web容器2.7.2硬件环境序号名称版本备注1战神K650D-i5D38G内存+Corei52CPUInteli5-4210M双核处理器2.7.3开发环境序号名称版本备注1Python3.6.9编程语言2Pycharm2019.1.4编译器3NavicatForMysql11.1.13Mysql管理工具4RedisDeskTopManager2019.0.0Redis管理工具5Putty0.72服务器连接工具系统分析与设计3.1可行性分析可行性分析主要是从项目的立项出发,分析项目未来能够取得的收益与面临的风险,项目如何在当前的社会环境经济环境下生存,以及项目后续会面临的财务风险等等,从各个角度出发去分析项目的可行性,并给出决策意见以及各方面的措施。可行性分析需要做到客观,科学化,也要更具有远见。3.1.1技术可行性技术可行性分析主要是评估以目前的技术条件和开发者掌握的技术能力水平,能否满足系统的使用条件和需求。个人比较熟悉Python语言以及scrapy技术的项目构建和代码编写,熟悉爬虫代码以及对html界面结构的掌握良好,熟悉Scrapy框架运行过程,可针对性编写相关中间件,本系统采用的Flask-admin是一个极其强大的开源框架,可快速搭建数据库展示,集成了web服务器以及前端bootstrap框架。Nginx是一个轻量的web服务器,安装以及配置都十分简单。整体来说,开发者技术水平跟软件的灵活性、安全性和易用性都是满足系统平台的开发需要的。3.1.2操作可行性本系统的目的是给后续的安全与大数据开发人员提供数据支持,展示模块主要用于基本的分析以及相关字段的简易查询,无需设置用户相关权限,只需按照后续开发人员的数据格式要求解析好相关的字段以及文件即可。3.1.3运行可行性运行可行性分析即系统对组织及人员的适应性分析;本系统实现的功能主要为采集数据,即是为后续的APT知识图谱构建做准备。其中字典规范作为对不同类型知识属性的描述约束,便于知识的统一表达理解,同时也是外部数据融合消歧的标准。目前APT知识图谱技术对于元数据的要求比较高,需要在元数据的基础上再进行人工决策筛选,展示功能的重要性并不大,所以主要实现数据采集模块便可算是符合。3.1.4经济可行性经济可行性分析包含市场需求、配套成本、资源供应。市场需求:目前各大安全厂商都已经有自身的威胁情报态势感知系统,这也说明基于现有威胁情报知识体系的构建是十分有必要的。配套成本:由于系统主要模块是数据采集,Scrapy框架强大的多线程以及指纹信息录入去重机制可以充分节省服务器资源,目前只需要单机模式便可以符合要求,本系统目前运行于阿里云轻量应用服务器。资源供应:本系统爬虫主要是从开源威胁网站中爬取资源,目前不涉及任何侵权以及需要偿还的内容。3.2系统总体设计本系统的系统总体框架如图3-1所示。图3-1系统框架图1)爬虫模块:针对github上公开的MISP报告编写爬虫规则进行爬取,与开源威胁情报平台的数据信息相匹配关系解析入库,由于scrapy-redis框架自带指纹信息去重,所以不需要再自行去重,在爬取的过程使用各种中间件代理池可以实现高效爬取,在Linux系统中可以使用crontab实现定时爬取。(2)展示模块:使用Flask-admin搭建数据可视化平台,对定义的模型类(即数据库表)进行查看,筛选,搜索以及导出等功能。同时利用pyecharts生成数据统计图表,使用nginx服务器实现轻量的web应用。3.3数据库设计3.3.1数据库需求分析知识图谱所需要的数据是要从大体的决策战术到基本的元数据来构建,从对每个APT组织对象画像构建,属性和关系构建,然后基于APT定义的属性进行去重以及将有关联的关系关联起来,无关的杂数据进行去除,从而输出APT知识库。半结构化数据(如阿利耶夫、MISP和ATTCK)和非结构化数据(如塔罗斯安全博客和GithubAPT报告)。结构化智能数据库通常识别数据类型,因此信息提取方法使用字段映射和其他方法将相似的关联不同字段的数据关联到特定属性的内容中,使用scrapy等网络爬虫技术从开源威胁网站中提取非结构性数据,结合AI智能或是人工决策进行APT对象属性的研究分析,将这些散乱的数据规整起来,输出特定知识表示。除此之外,还可以将各个实体之间的数据有类似于“利用”、“包含”、“模块相似性”等知识关系。APT报告和安全博客等非结构化数据主要使用正则表达式来提取威胁指标(IP、域名、文件哈希,等)。),然后是关键字匹配,以提取报告和组织之间的关系。在对所提取的知识形成了一种统一的表达输出后,仍然存在不少问题。例如不同的安全厂商的信息差不一样,MISP目前来说是收录较多APT威胁主体相关知识的公开报告,但是在类似于ATTCK这类安全研究网站中,对同一个APT组织的定义是会不同的,没有一个统一的APT威胁主体id来定义一个在A网站是张三,B网站是李四的主体,假设A网站记录了张三攻击了一个私营企业,而B网站记录了李四攻击了一个政府企业,由于定义名字的不同,那就无法有效的将两者所持有的属性和行为操作关联起来。3.3.2数据库的配置sudoaptinstallmysql-server-y#安装mysqlsudoapt-getinstallpython-devdefault-libmysqlclient-dev#安装mysqlclient依赖sudomysql_secure_installation修改mysql默认字符集,使用你喜欢的编辑器,如vim或者nano,打开/etc/mysql/conf.d/f,配置文件,注意,需要使用root权限,如vim:sudovim/etc/mysql/conf.d/f删除该文件的[mysql]行并贴入如下内容:[mysqld]character-set-server=utf8mb4collation-server=utf8mb4_unicode_ci[client]default-character-set=utf8mb4[mysql]default-character-set=utf8mb4退出并保存,重启mysql服务,终端下执行:sudo/etc/init.d/mysqlrestart

系统实现4.1系统前端实现本系统采用Flask-admin框架快速开发,前端技术用到了bootstrap3,作为一个微框架,Flask允许以很少的开销构建Web服务。它提供了以适合特定应用程序的方式实现项目的自由。在微服务和API的世界中,Flask-Admin解决了在现有数据模型之上构建管理界面的无聊问题。它可以毫不费力地通过用户友好的界面来管理Web服务的数据。Flask-Admin的基本概念是,它允许您通过将类中的各个视图分组在一起来构建复杂的界面:在前端看到的每个网页都代表已明确添加到界面的类上的方法。这些视图类在绑定到特定数据库模型时特别有用,因为它们可以将所有常规的创建,读取,更新,删除(CRUD)视图逻辑分组到每个模型的单个独立类中。4.1.1主页界面用户可以看到整个页面系统,其界面如图4-1所示图4-1主页图可以看到导航栏上的选项:首页:返回首页的按钮Threator至Report_Substance是所有数据库表的界面点击Substance进入Substance表界面如图4-24.1.2模型类界面图4-2Substance表界面点击Id,type_name,type_cn_name,Value,DetectTime,ModifiedTime这些亮色的字段可以使表格按照所选字段正序或倒序排列。图4-3查看详情页面按钮点击记录数旁边的如图4-3所示的图表,可进入该记录的详情页。如图4-4所示。图4-4记录的详情页面详情页面图可以显示更多字段,例如SubstanceId,source等。图4-5搜索栏点击如图4-5所示的搜索栏,可以根据搜索栏上的字段搜索需要的数据,例如图4-6所示,搜索id为300的substance。图4-6搜索id为300的substance 点击新增筛选器,可以弹出下拉框,如图4-7所示图4-7新增筛选器选择需要筛选的字段,如id,再设置条件后点击应用即可得到反馈,如图4-8图4-8筛选id大于200的数据在这样的筛选条件下,可以点击导出,导出id大于200的substance到一个csv文件中,如图4-9所示,导出的字段和数据便是点击导出时页面显示的字段和数据。图4-9导出id大于200的substance数据统计图点击有下拉如图4-10所示图4-10统计图下拉框4.1.3统计图界面点击可得到由pyecharts生成的图表,导航栏的统计图是指向了几个在服务器启动之时便生成的html文件,运用了pyecharts模块和flask-admin自带的ORM管理。page1=Page("")page1.add(a).add(e)page1.render("/root/python/flask-admin/examples/sqla/admin/templates/showAll.html")我在这里使用了绝对路径,因为本系统只是使用了flask-admin中的一个例子,使用相对路径很大可能找不到文件所在,另外使用了page模块,可以让多张图表在一个html中展示。如图4-11,4-12,4-13,4-14,4-15图4-11近30天指示器增长趋势图4-11显示的是在过去的30天中指示器每日的增长数量,这是通过指示器的发现时间来决定的,而指示器的发现时间由取决于包含它的报告,所以导致增长速度波动有点大是属于正常现象。图4-12昨日指示器增长类型比例(昨日无新增)图4-12是统计了在昨天新增的指示器类型中,各个类型的比例占多少,截图中的日期昨日没有新增,所以数据量都零,各个类型的指示器的增长速度有助于加强安全防范人员对该类型攻击手法的安全预警。图4-13近30天指示器增长类型比例 由图4-13可以看出domain和url类型是过去三十天里新增较多的指示器类型图4-14所有指示器类型比 从图中可以看到ip和domain指示器类型比较多,这也是因为这是最常见的IP域名信誉类情报,这类情报目前来说还上升不到可以利用作为决策分析。但是可以利用起来作为安全态势感知,针对这类指示器,可以用来判断这个IP是否为恶意IP,这个IP是否被人恶意攻击过了,这方面也是需要通过各个安全厂商的数据来进行深一层的分析判断,因为这类IP常有可能是被人攻入后利用其来进行非法流量攻击等等。图4-15所有数据表的数量总和图4-15可以直观的看出目前库中各类数据的记录数,有助于观察最新威胁情报态势。4.1.4威胁情报源界面图4-16其他威胁情报源的链接4.2系统后台实现4.2.1数据库实现(1)threator(威胁主体)表包括(id、threator_id、name、first_seen、last_seen、description、create_time、update_time、source、tags、country、idfentity、motivation、related_target、related_target_category、aliases),如下表4-17所示:表4-1APT组织表字段类型说明备注idbigint主键threator_idvarchar(100)威胁主体iduuidnamevarchar(100)威胁主体名称first_seenbigint威胁主体首次发现时间时间戳(精确到秒级)last_seenbigint威胁主体最近发现活跃时间时间戳(精确到秒级)descriptiontext描述create_timetimestamp记录创建时间时间戳(精确到秒级)update_timetimestamp记录更新时间时间戳(精确到秒级)sourcevarchar(100)信息来源默认为:MISPtagsvarchar(2000)标签逗号分隔countryvarchar(100)地理信息-国家idfentityvarchar(100)身份竞争对手犯罪分子内鬼恐怖份子间谍激进主义者犯罪组织黑客内部误用者自我炒作者无政府主义者motivationvarchar(100)动机个人满足报复破坏意外被迫炫耀意识形态搏出名个人获利组织获利未知related_targetvarchar(5000)攻击目标多个目标以逗号分隔related_target_categoryvarchar(5000)攻击行业多个目标行业以逗号分隔aliasesvarchar(5000)攻击者别名多个别名以逗号分隔(2)report(报告)表包括(id,report_id,name,description,keywords,published_time,modified_time,update_time,create_time,source,link_ref,tlp),如下表4-18所示:表4-2报告表字段类型说明备注idbigint主键report_idvarchar(100)报告iduuidnamevarchar(100)报告名descriptiontext报告描述keywordsvarchar(1000)报告关键词逗号分隔published_timebigint报告发布时间时间戳(精确到秒级)modified_timebigint报告更新时间时间戳(精确到秒级)update_timebigint记录更新时间时间戳(精确到秒级)create_timebigint记录创建时间时间戳(精确到秒级)sourcevarchar(100)报告报告来源默认:alienvaultlink_refvarchar(1000)报告链接urltlpvarchar(100)tlp协议red/yellow/green/white(3)substance(网络实体)表包括(id、substance_id、type、sub_type、value、create_time、update_time、detect_time、modified_time、source)如下表4-19所示:表4-3网络实体表字段类型说明备注idbigint主键substance_idvarchar(100)网络实体iduuidtypeint实体类型,关联substance_type:id1:ip2:domain3:email4:url5:file6:hostname7:yara8:cve9:feature10:processsub_typevarchar(100)实体二级分类目前只有file类型具有二级分类:

MD5/SHA1/SHA256valuetext实体值IP:XXX.XXX.XXX.XXX域名:URL:/demo/index.php邮箱:xxxxx@163.comcreate_timetimestamp记录创建时间时间戳(精确到秒级)update_timetimestamp记录创建时间时间戳(精确到秒级)detect_timetimestampIOC发现时间时间戳(精确到秒级)modified_timetimestampIOC更新时间时间戳(精确到秒级)sourcevarchar(100)信息来源默认:alienvault(4)substance_type(网络实体类型)表包括(id,name,cn_name)共3个字段,如下表4-20所示: 表4-4网络实体类型表字段类型说明备注idbigint主键namevarchar(100)实体类型名cn_namevarchar(100)中文名(5)threator_report(威胁主体-报告关系)表(id,threator_id,report_id)共3个字段,如下表4-21所示 表4-5威胁主体-报告关系表字段类型说明备注idbigint主键threator_idvarchar(100)威胁主体idreport_idvarchar(200)案例id(6)report_substance(报告-实体关系)表(id,report_id,substance_id)共3个字段,如下表4-22所示表4-6报告-实体关系表字段类型说明备注idbigint主键report_idvarchar(100)威胁主体idsubstance_idvarchar(100)实体id(7)threator_threator(threator_threator(威胁主体-威胁主体关系))表(id,threator_src_id,threator_dst_id,relationship_type)共4个字段,如下表4-23所示表4-7威胁主体-威胁主体关系表字段类型说明备注idbigint主键threator_src_idvarchar(100)威胁主体idthreator_dst_idvarchar(200)威胁主体idrelationship_typevarchar(100)关系类型4.2.2Nginx配置终端下执行:sudoaptinstallnginx–y安装Nginx反向代理服务器vimetc/nginx/sites-enabled/default.conf编辑服务器配置server{listen80;server_name2;root/root/python/flask-admin/examples/sqla/;access_log/var/log/nginx/flask_access.log;error_log/var/log/nginx/flask_error.log;location/static/{alias/root/python/flask-admin/examples/sqla/static/;expiresmax;access_logoff;log_not_foundoff;}location~\.py${return403;}location/{proxy_set_headerX-Real-IP$remote_addr;proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;proxy_set_headerHost$http_host;proxy_set_headerX-NginX-Proxytrue;proxy_redirectoff;if(!-f$request_filename){proxy_pass:5000;break;}}}保存并退出。重启nginx:sudo/etc/init.d/nginxrestart4.2.3Redis配置$sudoapt-getupdate$sudoapt-getinstallredis-server启动Redis$redis-server查看redis是否启动?$redis-cli以上命令将打开以下终端:redis:6379>是本机IP,6379是redis服务端口。现在我们输入PING命令。redis:6379>pingPONG以上说明我们已经成功安装了redis。使用configsetrequirepass命令设置密码4.3爬虫系统实现4.3.1Scrapy架构图4-17数据库接口部分代码图4-17描述了一个基于scrapy+redis的爬虫的运转过程。在scrapy的日常使用中,首先是需要新建一个项目组来初始化爬虫的各个处理模块,在setting中配置好需要用到解析方式,如果是采取文件系统存储,可以配置文件系统保存的目录,如果是采取数据库来做数据持久化的话,可以在setting中配置数据库的类型以及端口账号密码等。Scrapy+redis的运转过程是首先由spiders发出request经过引擎分发到调度器,调度器再与redis数据库交互,判断发出的request是否已经存有指纹信息了,如果没有存有指纹信息的话,则调度器将经引擎把request分发到下载器中,去下载指定的页面下的网站信息,下载完成后下载器将会把response返回给爬虫。在下载到返回的这个过程中,会经过下载中间件,可以在爬虫项目的中间件中编写代理中间件,重试中间件等加速爬虫的爬取效率,避过反爬措施等。Spider再将下载器返回的response对象进行解析,然后提取需要的item传递给管道文件进行处理,注意item对象的类型和字段需要提前在items.py中定义,管道文件按照设置好的数据持久化格式将从spider中传递过来的item进行存储,存储完毕后将会把item对象和url经过scrapy-redis的指纹生成系统,生成指纹信息到redis中,等下一次访问相同的url时,将会自动去重,直接跳过发出request请求。4.3.2Spider爬取思路图4.18threator.py文件如图4.18,这是对于APT组织信息爬取的爬虫,从github上公开的MISP报告中,通过raw的二级域名访问原生json文件,可直接解析为python结构进行提取,之后再爬取alienvault的APT组织列表接口,MISP的报告比较权威,所以优先级比较高,即是如果MISP中有的APT组织或是二者皆有的,来源都设置为MISP,如果MISP中不存在的,则来源设置为alienvault。在此次爬取中可爬取threator中大部分的字段以及threator_threator关系表中全部的数据。 由于是使用scrapy+redis爬取,所以需要改写spider默认继承的类为CrawlSpider。这个爬虫继承的是CrawlSpider,它是用来说明Redis的持续性,当我们第一次运行dmoz爬虫,然后Ctrl+C停掉之后,再运行dmoz爬虫,之前的爬取记录是保留在Redis里的。分析起来,其实这就是一个scrapy-redis版CrawlSpider类,需要设置Rule规则,以及callback不能写parse()方法。由于该系统数据量规模还不够大,所以没有采取分布式采集的方式。但是后期可以进行改动,只需要让继承的类改为RedisSpider,同时配置相关的redis服务即可。图4-19alienvault.py部分代码在这个爬虫文件中有多级爬取报告以及指示器的需求,大量对库中数据的判断,在此基础上还要查看redis中是否已有指纹信息,所以其中涉及到大量的数据判断。而scrapy中需要通过yield来传递元素以及构建新的request请求,在这个地方我使用了一个小技巧,通过在传递的request请求中的url中添加相对应的参数来巧妙的构建url,由于scrapy对于url有指纹信息录入的自带去重功能,所以如果能够构建新的url将会及时将报告数量有变化的url列入爬取队列中,那样报告数量没有变化的request将会自动被去重机制筛选下来,这可以大幅度的减少发出的请求数量和提升爬虫效率。4.3.3中间件编写图4-20proxy.py代码在爬取的过程中,需要给request请求添加代理IP来避免网站的反爬措施,本系统是在github开源代理池的基础中加入自己所添加的代理源,图4-20是向代理调度服务器随机请求一个代理,图4-21是代理池的逻辑流程图。图4-21代理池流程图目前网络上的免费代理网站是有许多,但是可用性不高,大多是失效的代理,我这边是买了一个廉价的代理资源,图4-22为代理采集规则,需在代理池配置文件中配置。图4-22代理采集规则图4-23代理中间件使用代理时需在爬虫项目的middlewares.py中编写对应的代理中间件,并在setting.py文件中启用,因为部分网站需要的是https的代理,所以需要在request发送请求的过程中进行更换。图4-24retry中间件同时由于在爬取过程中,可能会出现重定向或者是503等错误,所以需要对返回的情况进行决策,如若需要重新发出请求,可在retry中间件中编写规则。图4-25UA中间件在爬虫伪装技术中最重要的莫过于UserAgent的配置,这是最常见的反爬虫措施,网站会拒绝无UA信息的请求。图4-26setting.py部分代码以上所提的中间件(代理中间件,retry中间件,UA中间件)都是下载中间件,需要在setting中的DOWNLOADER_MIDDLEWARES字典中添加,并按照网络请求逻辑配置优先级。4.3.4管道文件编写图4-27pipelines.py部分代码如图4-27,可以在管道文件中加入open_spider函数,这是内置的函数,即是在爬虫开始的时候调用的函数,这样的设置有助于数据库资源和效率的高效利用,我在这里初始化了数据库配置,同时可以在close_spider函数中设置关闭数据库句柄,有效保护了数据库的使用。图4-28pipelines.py部分代码上图4-28是部分管道处理代码,在管道处理中可以通过isinstance函数,对传入的item进行区分,判断是哪个类哪个爬虫传过来的,然后再进行相应的数据解析,数据解析中由于会有一些值为空,所以我常用的是通过ifin和type来判断该item中是否有相应的数据或者是否是列表,join函数是可以将列表转换为字符串的一个很实用的函数。图4-29数据库接口部分代码由于还是习惯于使用sql语句来进行数据的持久化存储,在该项目中我自己编写了一个跟mysql交互的数据库接口,如图4-29为插入数据时的sql语句操作,支持传入字典类型的数据,数据库接口将会拆分key和value值,并将参数列表传入execute函数中,用try捕捉异常进行回滚操作,确保数据安全可靠。4.3.5

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论