网络爬虫的设计与实现

上传人:仙*** 文档编号:130295445 上传时间:2022-08-04 格式:DOC 页数:52 大小:169KB
收藏 版权申诉 举报 下载
网络爬虫的设计与实现_第1页
第1页 / 共52页
网络爬虫的设计与实现_第2页
第2页 / 共52页
网络爬虫的设计与实现_第3页
第3页 / 共52页
资源描述:

《网络爬虫的设计与实现》由会员分享,可在线阅读,更多相关《网络爬虫的设计与实现(52页珍藏版)》请在装配图网上搜索。

1、精品文档,仅供学习与交流,如有侵权请联系网站删除摘 要本课题的主要目的是设计面向定向网站的网络爬虫程序,同时需要满足不同的性能要求,详细涉及到定向网络爬虫的各个细节与应用环节。搜索引擎作为一个辅助人们检索信息的工具。但是,这些通用性搜索引擎也存在着一定的局限性。不同领域、不同背景的用户往往具有不同的检索目的和需求,通用搜索引擎所返回的结果包含大量用户不关心的网页。为了解决这个问题,一个灵活的爬虫有着无可替代的重要意义。网络爬虫应用智能自构造技术,随着不同主题的网站,可以自动分析构造URL,去重。网络爬虫使用多线程技术,让爬虫具备更强大的抓取能力。对网络爬虫的连接网络设置连接及读取时间,避免无限

2、制的等待。为了适应不同需求,使网络爬虫可以根据预先设定的主题实现对特定主题的爬取。研究网络爬虫的原理并实现爬虫的相关功能,并将爬去的数据清洗之后存入数据库,后期可视化显示。关键词:网络爬虫,定向爬取,多线程,Mongodb【精品文档】第 48 页ABSTRACTThe main purpose of this project is to design subject-oriented web crawler process, which require to meet different performance and related to the various details of the

3、 targeted web crawler and application in detail.Search engine is a tool to help people retrieve information. However, these general search engines also have some limitations. Users in different fields and backgrounds tend to have different purposes and needs, and the results returned by general sear

4、ch engines contain a large number of web pages that users dont care about. In order to solve this problem, it is of great significance for a flexible crawler.Web crawler application of intelligent self construction technology, with the different themes of the site, you can automatically analyze the

5、structure of URL, and cancel duplicate part. Web crawler use multi-threading technology, so that the crawler has a more powerful ability to grab. Setting connection and reading time of the network crawler is to avoid unlimited waiting. In order to adapt to the different needs, the web crawler can ba

6、se on the preset themes to realize to filch the specific topics. Whats more, we should study the principle of the web crawler ,realize the relevant functions of reptiles, save the stolen data to the database after cleaning and in late achieve the visual display.Keywords:Web crawler,Directional climb

7、,multi-threading,mongodb目录第一章概述11.1课题背景11.2网络爬虫的历史和分类1第二章 文献综述72.1网络爬虫理论概述72.2网络爬虫框架介绍8第三章 研究方案163.1网络爬虫的模型分析163.2URL构造策略193.3数据提取与存储分析19第四章 网络爬虫模型的设计和实现214.1网络爬虫总体设计214.2网络爬虫具体设计21第五章实验与结果分析39 5.2结果分析42参考文献36致谢37附录138附录247第一章概述1.1课题背景 网络爬虫,是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁,自动索引,模拟程序或者蠕虫。

8、 网络检索功能起于互联网内容爆炸性发展所带来的对内容检索的需求。搜索引擎不断的发展,人们的需求也在不断的提高,网络信息搜索已经成为人们每天都要进行的内容.如何使搜索引擎能时刻满足人们的需求。最初的检索功能通过索引站的方式实现,而有了网络机器人。但是,这些通用性搜索引擎也存在着一定的局限性。不同领域、不同背景的用户往往具有不同的检索目的和需求,通用搜索引擎所返回的结果包含大量用户不关心的网页。为了解决这个问题,一个灵活的爬虫有着无可替代的重要意义。1.2网络爬虫的历史和分类1.2.1网络爬虫的历史在互联网发展初期,网站相对较少,信息查找比较容易。然而伴随互联网爆炸性的发展,普通网络用户想找到所需

9、的资料简直如同大海捞针,这时为满足大众信息检索需求的专业搜索网站便应运而生了。现代意义上的搜索引擎的祖先,是1990年由蒙特利尔大学学生Alan Emtage发明的Archie。虽然当时World Wide Web还未出现,但网络中文件传输还是相当频繁的,而且由于大量的文件散布在各个分散的FTP主机中,查询起来非常不便,因此Alan Archie工作原理与现在的搜索引擎已经很接近,它依靠脚本程序自动搜索网上的文件,然后对有关信息进行索引,供使用者以一定的表达式查询。由于 Archie深受用户欢迎,受其启发,美国内华达System Computing Services大学于1993年开发了另一个

10、与之非常相似的搜索工具,不过此时的搜索工具除了索引文件外,已能检索网页。当时,“机器人”一词在编程者中十分流行。电脑“机器人”(Computer Robot)是指某个能以人类无法达到的速度不间断地执行某项任务的软件程序。由于专门用于检索信息的“机器人”程序象蜘蛛一样在网络间爬来爬去,因此, 搜索引擎的“机器人”程序就被称为“蜘蛛”程序。世界上第一个用于监测互联网发展规模的“机器人”程序是Matthew Gray开发的World wide Web Wanderer。刚开始它只用来统计互联网上的服务器数量,后来则发展为能够检索网站域名。与Wanderer相对应,Martin Koster于1993

11、年10月创建了ALIWEB,它是Archie的HTTP版本。ALIWEB不使用“机器人”程序,而是靠网站主动提交信息来建立 自己的链接索引,类似于现在我们熟知的Yahoo。随着互联网的迅速发展,使得检索所有新出现的网页变得越来越困难,因此,在Matthew Gray的Wanderer基础上,一些编程者将传统的“蜘蛛”程序工作原理作了些改进。其设想是,既然所有网页都可能有连向其他网站的链接,那么从跟踪 一个网站的链接开始,就有可能检索整个互联网。到1993年底,一些基于此原理的搜索引擎开始纷纷涌现,其中以JumpStation、The World Wide Web Worm(Goto的前身,也就

12、是今天Overture),和Repository-Based Software Engineering (RBSE) spider最负盛名。然而JumpStation和WWW Worm只是以搜索工具在数据库中找到匹配信息的先后次序排列搜索结果,因此毫无信息关联度可言。而RBSE是第一个在搜索结果排列中引入关键字串匹配程 度概念的引擎 最早现代意义上的搜索引擎出现于1994年7月。当时Michael Mauldin将John Leavitt的蜘蛛程序接入到其索引程序中,创建了大家现在熟知的Lycos。同年4月,斯坦福(Stanford)大学的两名博士生,David Filo和美籍华人杨致远(Ge

13、rry Yang)共同创办了超级目录索引Yahoo,并成功地使搜索引擎的概念深入人心。从此搜索引擎进入了高速发展时期。目前,互联网上有名有姓的搜索引擎已 达数百家,其检索的信息量也与从前不可同日而语。比如最近风头正劲的Google,其数据库中存放的网页已达30亿之巨。随着互联网规模的急剧膨胀,一家搜索引擎光靠自己单打独斗已无法适应目前的市场状况,因此现在搜索引擎之间开始出现了分工协作,并有了专业的搜索引 擎技术和搜索数据库服务提供商。象国外的Inktomi,它本身并不是直接面向用户的搜索引擎,但向包括Overture(原GoTo)、 LookSmart、MSN、HotBot等在内的其他搜索引擎

14、提供全文网页搜索服务。国内的百度也属于这一类(注),搜狐和新浪用的就是它的技术。 从这个意义上说,它们是搜索引擎的搜索引擎。1.2.2网络爬虫的分类网络爬虫种类繁多,如果按照部署在哪里分,可以分成:1,服务器侧:一般是一个多线程程序,同时下载多个目标HTML,可以用PHP, Java, Python等做,一般综合搜索引擎的爬虫这样做。但是,如果对方讨厌爬虫,很可能封掉服务器的IP,服务器IP又不容易改,另外耗用的带宽也是较贵。2,客户端:很适合部署定题爬虫,或者叫聚焦爬虫。做一个与Google,百度等竞争的综合搜索引擎成功的机会微乎其微,而垂直搜索或者竞价服务或者推 荐引擎,机会要多得多,这类

15、爬虫不是什么页面都取的,而是只取关心的页面,而且只取页面上关心的内容,例如提取黄页信息,商品价格信息,还有提取竞争对手 广告信息的。这类爬虫可以部署很多,而且可以很有侵略性。可以低成本大量部署,由于客户端IP地址是动态的,所以很难被目标网站封锁。1.3网络爬虫的发展趋势目前,大多数的搜索引擎都是基于关键词的搜索引擎。基于关键字匹配的搜索技术有较大的局限性:首先,它不能区分同形异义。其次,不能联想到关键字的同义词。Web商业化至今,搜索引擎始终保持着网络上被使用最多的服务项目的地位,然而,随着网上内容的爆炸式增长和内容形式花样的不断翻新,搜索引擎越来越不能满足挑剔的网民们的各种信息需求。搜索引擎

16、的发展面临着两大难题:一是如何跟上Internet的发展速度,二是如何为用户提供更精确的查询结果。所以,传统的引擎不能适应信息 技术的高速发展,新一代智能搜索引擎作为一种高效搜索引擎技术的在当今的网络信息时代日益引起业界人士的关注。搜索引擎己成为一个新的研究、开发领域。因为它要用到信息检索、人工智能、计算机网络、分布式处理、数据库、数据挖掘、数字图书馆、自然语言处理等多领域的理论和技术,所以具有综合性和挑战性。又 由于搜索引擎有大量的用户,有很好的经济价值,所以引起了世界各国计算机科学界和信息产业界的高度关注,目前的研究、开发十分活跃,并出现了很多值得注意的动向。目前传统搜索引擎下,百度、谷歌

17、等大厂商垄断了网络索引市场,因为它们的存在,日益庞大的互联网内容才能突破网络黑暗状态,变成可知的一个世界。然而,传统搜索引擎并不能支持定制搜索和信息处理、挖掘,只能以WEB1.0的形式存在。可以预见将来互联网信息抓取、挖掘和再处理,将成为人们越来越多的需求,而满足这种需求的,就是各种各样的爬虫与相关的信息处理工具。现在网络上流 行的信息采集工具、网站聚合工具,都是未来新一代爬虫的先驱,甚至已经具备其特点。但是互联网本身,不管1.0还是2.0,还没有为爬虫时代的到来做好充分准备。现在流行的SEO,就是强势搜索引擎条件下对网站结构产生的影响。爬虫时代到来之后,互联网上会出现专门的信息站点,就是提供

18、给爬虫看的站点。 传统的网络爬虫技术主要应用于抓取静态Web 网页,随着AJAX/Web2.0的流行,如何抓取AJAX 等动态页面成了搜索引擎急需解决的问题,因为AJAX颠覆了传统的纯HTTP 请求/响应协议机制,如果搜索引擎依旧采用“爬”的机制,是无法抓取到AJAX 页面的有效数据的。 AJAX 采用了JavaScript 驱动的异步请求/响应机制,以往的爬虫们缺乏JavaScript语义上的理解,基本上无法模拟触发JavaScript的异步调用并解析返回的异步回调逻辑和内容。 另外,在AJAX的应用中,JavaScript 会对DOM结构进行大量变动,甚至页面所有内容都通过JavaScri

19、pt 直接从服务器端读取并动态绘制出来。这对习惯了DOM 结构相对不变的静态页面简直是无法理解的。由此可以看出,以往的爬虫是基于协议驱动的,而对于AJAX 这样的技术,所需要的爬虫引擎必须是基于事件驱动的。第二章 文献综述2.1网络爬虫理论概述网络爬虫是一个自动提取网页的程序,它为搜索引擎从Web上下载网页,是搜索引擎的重要组成部分。通用网络爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL列表;在抓取网页的过程中,不断从当前页面上抽取新的URL放入待爬行队列,直到满足系统的停止条件。主题网络爬虫就是根据一定的网页分析算法过滤与主题无关的链接,保留主题相关的链接并将其放入待抓取的UR

20、L队列中;然后根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。所有被网络爬虫抓取的网页将会被系统存储,进行一定的分析、过滤,并建立索引,对于主题网络爬虫来说,这一过程所得到的分析结果还可能对后续的抓取过程进行反馈和指导。如果网页p中包含超链接l,则p称为链接l的父网页。如果超链接l指向网页t,则网页t称为子网页,又称为目标网页。主题网络爬虫的基本思路就是按照事先给出的主题,分超链接和已经下载的网页内容,预测下一个待抓取的URL及当前网页的主题相关度,保证尽可能多地爬行、下载与主相关的网页,尽可能少地下载无关网页1。2.2网络爬虫框架介绍2.

21、2.1Scrapy Scrapy 是一套基于Twisted的异步处理框架,是纯python实现的爬虫框架,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容或者各种图片。如图2-1显示了Scrapy的大体架构,其中包含了scheduler、item pipeline、downloader、spider以及engine这几个组件模块,而其中的绿色箭头则说明了整套系统的数据处理流程。图2-1Scrapy大体架构组件说明:Scrapy Engine(Scrapy引擎)Scrapy引擎是用来控制整个系统的数据处理流程,并进行事务处理的触发。更多的详细内容可以看下面的数据处理流程。Sc

22、heduler(调度)调度程序从Scrapy引擎接受请求并排序列入队列,并在Scrapy引擎发出请求后返还给他们。Downloader(下载器)下载器的主要职责是抓取网页并将网页内容返还给蜘蛛( Spiders)。Spiders(蜘蛛)蜘蛛是有Scrapy用户自己定义用来解析网页并抓取制定URL返回的内容的类,每个蜘蛛都能处理一个域名或一组域名。换句话说就是用来定义特定网站的抓取和解析规则。蜘蛛的整个抓取流程(周期)是这样的: 1)首先获取第一个URL的初始请求,当请求返回后调取一个回调函数。第一个请求是通过调用start_requests()方法。该方法默认从start_urls中的Url中

23、生成请求,并执行解析来调用回调函数。 2)在回调函数中,你可以解析网页响应并返回项目对象和请求对象或两者的迭代。这些请求也将包含一个回调,然后被Scrapy下载,然后有指定的回调处理。 3)在回调函数中,你解析网站的内容,同程使用的是Xpath选择器(但是你也可以使用BeautifuSoup, lxml或其他任何你喜欢的程序),并生成解析的数据项。 4)最后,从蜘蛛返回的项目通常会进驻到项目管道。Item Pipeline(项目管道)项目管道的主要责任是负责处理有蜘蛛从网页中抽取的项目,他的主要任务是清晰、验证和存储数据。当页面被蜘蛛解析后,将被发送到项目管道,并经过几个特定的次序处理数据。每

24、个项目管道的组件都是有一个简单的方法组成的Python类。他们获取了项目并执行他们的方法,同时他们还需要确定的是是否需要在项目管道中继续执行下一步或是直接丢弃掉不处理。项目管道通常执行的过程有:1) 清洗HTML数据2) 验证解析到的数据(检查项目是否包含必要的字段)3) 检查是否是重复数据(如果重复就删除)4) 将解析到的数据存储到数据库中Downloader middlewares(下载器中间件)下载中间件是位于Scrapy引擎和下载器之间的钩子框架,主要是处理Scrapy引擎与下载器之间的请求及响应。它提供了一个自定义的代码的方式来拓展 Scrapy的功能。下载中间器是一个处理请求和响应

25、的钩子框架。他是轻量级的,对Scrapy尽享全局控制的底层的系统。Spider middlewares(蜘蛛中间件)蜘蛛中间件是介于Scrapy引擎和蜘蛛之间的钩子框架,主要工作是处理蜘蛛的响应输入和请求输出。它提供一个自定义代码的方式来拓展Scrapy的功能。蛛中间件是一个挂接到Scrapy的蜘蛛处理机制的框架,你可以插入自定义的代码来处理发送给蜘蛛的请求和返回蜘蛛获取的响应内容和项目。Scheduler middlewares(调度中间件)调度中间件是介于Scrapy引擎和调度之间的中间件,主要工作是处从Scrapy引擎发送到调度的请求和响应。他提供了一个自定义的代码来拓展Scrapy的功

26、能。数据处理流程Scrapy的整个数据处理流程由Scrapy引擎进行控制,其主要的运行方式为:1) 引擎打开一个域名,时蜘蛛处理这个域名,并让蜘蛛获取第一个爬取的URL。2) 引擎从蜘蛛那获取第一个需要爬取的URL,然后作为请求在调度中进行调度。3) 引擎从调度那获取接下来进行爬取的页面。4) 调度将下一个爬取的URL返回给引擎,引擎将他们通过下载中间件发送到下载器。5) 当网页被下载器下载完成以后,响应内容通过下载中间件被发送到引擎。7) 引擎收到下载器的响应并将它通过蜘蛛中间件发送到蜘蛛进行处理。8) 蜘蛛处理响应并返回爬取到的项目,然后给引擎发送新的请求。9) 引擎将抓取到的项目项目管道

27、,并向调度发送请求。10) 系统重复第二部后面的操作,直到调度中没有请求,然后断开引擎与域之间的联系2。 2.2.2Xpath 它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初 XPath 的提出的初衷是将其作为一个通用的、介于XPointer与XSLT间的语法模型。但是 XPath 用起来非常顺手很快的被开发者采用来当作小型查询语言来使用。XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。路径表达式是从一个XML节点(当

28、前的上下文节点)到另一个节点、或一组节点的书面步骤顺序。这些步骤以“/”字符分开,每一步有三个构成成分:1) 轴描述(用最直接的方式接近目标节点)2) 节点测试(用于筛选节点位置和名称)3) 节点描述(用于筛选节点的属性和子节点特征)一般情况下,我们使用简写后的语法。虽然完整的轴描述是一种更加贴近人类语言,利用自然语言的单词和语法来书写的描述方式,但是相比之下也更加啰嗦3。 2.2.3Mongodb对于大数据量、高并发、弱事务的互联网应用,MongoDB则是一个如瑞士军刀般的利剑。例如:为了产品中的某个实体的查询操作,我们需要把一个本属于该实体的数据拆分至另一个表中,以便进行连接查询。于是无论

29、是创建,删除还是更新,我们要涉及的操作便增加了许多。更别说互联网项目时刻都在发展和变动,改变一个存储单元结果是常事,至今关系型数据库的在线模式更新依旧不是件简单的事情。选择MongoDB,是因为它的集合支持松散的模式,易于灵活调整;支持复杂的属性,并可为之建立索引,作为查询条件。MongoDB的系统管理员上辈子是折翼的天使,使他们牺牲自己,方便了整个团队2.3 数据可视化2.3.1 Laravel Laravel是一套web应用开发框架,它具有富于表达性且简洁的语法。我们相信,开发过程应该是愉悦、创造性的体验。Laravel努力剔除开发过程中的痛苦,因此我们提供了验证(authenticati

30、on)、路由(routing)、session和缓存(caching)等开发过程中经常用到的工具或功能。 Laravel的目标是给开发者创造一个愉快的开发过程,并且不牺牲应用的功能性。快乐的开发者才能创造最棒的代码!为了这个目的,我们博取众框架之长处集中到Laravel中,这些框架甚至是基于Ruby on Rails、ASP.NET MVC、和Sinatra等开发语言或工具的。 Laravel是易于理解并且强大的,它提供了强大的工具用以开发大型、健壮的应用。杰出的IoC、数据库迁移工具和紧密集成的单元测试支持,这些工具赋予你构建任何应用的能力。我学习过很多框架,但laravel是目前最前面最灵

31、活的一个,所以选择此框架完成数据可视化。2.3.2 BootstrapBootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架。在现代 Web 开发中,有几个几乎所有的 Web 项目中都需要的组件。Bootstrap 为您提供了所有这些基本的模块 - Grid、Typography、Tables、Forms、Buttons 和 Responsiveness。此外,还有大量其他有用的前端组件,比如 Dropdowns、Navigation、Modals、Typehead、Pagination、Carousal、Breadcrumb、Tab、Thumbnails、Headers 等

32、等。有了这些,你可以搭建一个 Web 项目,并让它运行地更快速更轻松。此外,由于整个框架是基于模块的,您可以通过您自己的 CSS 位,甚至是项目开始后的一个大整改,来进行自定义。 它是基于几种最佳实践,我们认为这是一个很好的开始学习现代 Web 开发的时机,一旦您掌握了 HTML 和 JavaScript/jQuery 的基本知识,您就可以在 Web 开发中运用这些知识。虽然,也有批评,所有通过 Bootstrap 构建的项目看起来相同,您可以不需要知道太多的 HTML + CSS 知识就可以构建一个网站。但是,我们需要明白,Bootstrap 是一个通用的框架,就像任何其他通用的东西,您需要

33、定制才能让它具有独特性。当您要定制时,您需要深入研究,没有良好的 HTML + CSS 基础是不可行的4。 当然除了 Bootstrap,还有很多其他好的前端框架,但是laravel与Bootstrap就是绝配,在之前开发过的几个项目中,Bootstrap的前台效果惊艳绝伦。第三章 研究方案3.1网络爬虫的模型分析 本网络爬虫的开发目的,通过网络爬虫技术一个自动提取网页的程序,实现搜索引擎从自己想访问的网上下载网页,再根据已下载的网页上继续访问其它的网页,并将其下载直到满足用户的需求。根据现实中不同用户的实际上的各种需求,本项目简单实现主题爬虫,本网络爬虫需要达到如下几个目标:1) 设计基于多

34、线程的网络爬虫,客户端向服务器发送自己设定好请求。如图3-1所示URL配置文件URL构造策略客户端互联网线程1发起http请求:线程2搜索元URL如线程N图3-1 多线程网络爬虫概要设计图模型2) 通过 http将Web服务器上协议站点的网页代码提取出来。3) 根据xpath提取出客户端所需要的信息。4) 通过构造url发起新的http请求。 本网络爬虫最终将设计成一个能够在后台自动执行的网络爬虫程序。网络爬虫工作流程图如图3-2所示。图3-2 网络爬虫工作流程图3.2URL构造策略目标网站URL:爬取文章URL:根据网站自身的特性我们为该网站(脚本之家),设计了自动构造URL。我们发现网站的

35、后缀中,最后一位数字表示了该网页的唯一标示。我们一次为基准,初始化变量控制爬取范围。通过字符串拼接来构造在爬取范围内的URL,并自动修改配置文件中的变量。3.3数据提取与存储分析为了便于提取数据我们对目标网站进行了简要的分析。爬取文章URL:图3-3 目标网站网页图首次存储信息。我们选择mongodb数据库,它属于Nosql。不需要解析sql语句,执行速度非常快。对于我们这个依赖关系比较若得项目非常实用。在后期的可视化中我们会加入RBAC机制,所以在在依赖关系上会显得比较复杂。为了方便我们在可视化中使用MySQL。但是从Mongodb数据库中将数据导入MySQL又是一个比较棘手的问题。因为自带

36、CSV方式或者json方式在单个字段过大的情况下都显得很乏力。很多时候都会造成数据的截取,丢失,有时就连字符编码不统一都会出现乱码的情况。不得已我们需要自己编写数据转换脚本程序,已完成数据的全面转换。3.4可视化显示与搜索策略1)可视化框架为了将导入MySQL中的数据做一些简单的应用,我们将其通过网页的形式可视化,我们选用的是目前国外最火的Laravel、Bootstrap框架,laravel用于后台逻辑控制,bootstrap用于前台友好的显示。网页的结构我们依旧选用经典的MVC结构,有底层操作数据库的模型,控制模型的控制器,和显示层。2)搜索策略在web中我们加入了搜索功能,多个字段的模糊

37、搜索。但是有多搜索字段过多,MySQL对于中文的模糊搜索做的很不尽人意。当然也有解决方案,要么放弃MySQL,或者使用插件sphinx,建立分词查询机制,这样就可以在大数据中快速的模糊查询中文关键词了。由于文章的特性我们分别为数据库中的“title”、“tag”、“desc”建立模糊查询,以提高搜索的精准度,但是会增加我们服务器的压力。所以我们只能用硬件来换取软件上的缺陷了。第四章 网络爬虫模型的设计和实现4.1网络爬虫总体设计根据本网络爬虫的概要设计本网络爬虫是一个自动提取网页的程序,根据设定的主题判断是否与主题相关,再根据配置文件中的页面配置继续访问其它的网页,并将其下载直到满足用户的需求

38、。 1)设计基于多线程的网络爬虫的基本配置。2)通过 http将自动构造的URL中的网页代码提取出来。3)提取出所需要的信息并且通过管道技术将其存储之mongodb中。4)通过url构造算法自动构造下一个URL,再通过递归算法实现下一URL的访问,重复以上步骤。总的来说爬虫程序根据配置获得初始URL种子,把初始种子保存在临界区中,按照构造URL算法,自动构造URL,返回到临届区中,判断是否继续,从而使整个爬虫程序循环运行下去。4.2网络爬虫具体设计4.2.1爬取网页 主要用到的技术如下:1) 继承scrapy.Spider类,通过scrapy.Spider内部封装的start_requests

39、()方法。该方法默认从start_urls中的Url中生成请求,初始化地址:#主要代码如下:import scrapyfrom script_2.items import Script2Itemfrom scrapy.http import Requestclass src2Spider(scrapy.Spider): name = script_2 redis_key = script:start_urls start_urls= url = pageNum = 800002) 设置连接延迟(AUTHTHROTTLE_START_DELAY)时间为5秒,超时时间(AUTOTHROTTLE_M

40、AX_DELAY)设置为60,如果连接超时,则自动跳过该页面,并在shell端显示出提示信息,自适应排错(AUTHTHROTTLE_DEBUG)功能如果出现404或505等未知错误,自动处理,将程序设为工厂模式。配置mongodb的连接信息,并在本地打开mongodb服务器端,供后期数据存储使用,引入管道文件(script_2.pipelines.Script2Pipeline)为其他文件使用,初始化Spider模型,并为递归初始化自身模型script_2.spiders#主要代码如下:BOT_NAME = script_2SPIDER_MODULES = script_2.spidersNE

41、WSPIDER_MODULE = script_2.spidersITEM_PIPELINES = script_2.pipelines.Script2Pipeline#mongodb configMONGODB_HOST = 127.0.0.1MONGODB_PORT = 27017MONGODB_DBNAME = scriptMONGODB_DOCNAME = script_8# The initial download delayAUTOTHROTTLE_START_DELAY=5# Enable showing throttling stats for every response r

42、eceived:AUTOTHROTTLE_DEBUG=Ture# The maximum download delay to be set in case of high latenciesAUTOTHROTTLE_MAX_DELAY=604.2.2提取网页信息算法实现步骤和算法描述:Parse是Spider默认调用函数,start_requests()方法会将下载下来的网页信息,以response类为参数的方式传入该函数。使用的是Xpath选择器,首先实例化选择器,并将下载器下载到的response作为初始参数传入选择器,通过选择器中的xpath方法,提取出我们所需要的信息,使用extrac

43、t()方法将其文本化,然后返回存储至python变量中。#主要代码如下:def parse(self, response): sel = scrapy.selector.Selector(response) title = sel.xpath(/divclass=title/h1/text().extract() desc = sel.xpath(/divid=art_demo/text().extract() content = sel.xpath(/divid=content).extract() tag = sel.xpath(/divclass=tags mt10/a/text().e

44、xtract()4.2.3自动构造URL判断目前爬取页面(pageNum)是否在允许爬取范围内(total),如果是,修改配置信息pageNum,利用初始化url模型拼接出新的URL(new_url),并调用,Request()方法递归的调用自身,再次爬取新的内容,直到将允许范围内的所有页面全部爬取完毕,则停止构造,退出程序。#主要代码如下:pageNum = 80000total = 85000self.pageNum = self.pageNum + 1if(self.pageNum self.total): new_url = self.url + str(self.pageNum) +

45、 .htm yield Request(new_url, callback = self.parse)4.2.4多线程的实现最大请求线程数(CONCURRENT_REQUESTS),通过该配置项,调度器中间件(Scheduler middlewares)会同时调取32个http请求头信息,同时发出请求,调度下载器,将下载下来的数据以response类作为参数传递给默认初始化方法parse(),由于分析数据非常简单,所以实现多线程请求,单线程分析。COOKIES_ENABLED设为开启状态,在每次的http请求中会检查js、css、图片、等静态信息,判断如果文件名相同则直接使用,不必重复下载,以

46、此来减少网络带宽、内存、I/O系统和CPU的占用,提高爬取效率。#主要代码如下:# Disable cookies (enabled by default)COOKIES_ENABLED = True# Configure maximum concurrent requests performed by Scrapy (default: 16)CONCURRENT_REQUESTS=324.2.5伪造头信息和开启HTTPCACHE1)为了防止目标网站具有反扒功能,经过单个IP的测试发现目标网站没有添加IP反扒功能,我们使用简单的代理信息就可以了。我们添加了代理信息(USER_AGENT)、头信

47、息(DEFAULT_REQUEST_HEADERS),这两项信息会包含到http请求的头文件中,一块发送到目标网站的服务器中,既可以获得该页面的网页代码。2)开启了http缓存(HTTPCACHE_ENABLED)机制,每次发送http请求时,则不用再去配置文件中读取配置头信息,可直接读取缓存中的http头信息,减少I/O开销,提高爬取速度。#主要代码如下:# Crawl responsibly by identifying yourself (and your website) on the user-agentUSER_AGENT = Mozilla/5.0 (Macintosh; Int

48、el Mac OS X 10_8_3) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.54 Safari/536.5# Enable and configure HTTP caching (disabled by default)HTTPCACHE_ENABLED=True# Override the default request headers:DEFAULT_REQUEST_HEADERS = Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;

49、q=0.8, Accept-Language: en,4.2.6数据库设计和存储转换1)存储数据容器的定义:我们的容器继承于scrapy.Item类,使用scrapy.Field()方法初始化我们所需要的字段变量,我们所提取的字段一共四个,分别表示:标题(title)、描述(desc)、内容(content)、类别或标签(tag)。#主要代码如下:class Script2Item(scrapy.Item): title = scrapy.Field() desc = scrapy.Field() content = scrapy.Field() tag = scrapy.Field()2)

50、返回并增强数据适应能力:将Xpath提取出来的集合信息经过判断复制,如果为空或为假,则为其复制空字符串,tag集合中的多个集合通过join()方法,以“,”为分隔符,转换为一个集合,并使用yield返回到管道中。#主要代码如下:item = Script2Item()if title: title = title0else: title = if content: content = content0else: content = if desc: desc = desc0else: desc = if tag: tag = tagelse: tag = itemtitle = titleit

51、emdesc = descitemtag = ,.join(tag)itemcontent = contentyield item3) 启动mongodb服务器端:编写简单的启动bat脚本,将数据存储至,服务器目录上一文件夹中的data文件夹中,以BSON格式存储在磁盘上,每次启动真的很方便。#主要代码如下:mongod -dbpath ./data4) 数据处理的管道类:需要引入pymongo包才能在python中操作mongodb数据库,初始化函数(_init_)的编写,读出settings文件中的初始化信息,并赋予变量,用pymongo。MongoClient()方法连接到mongodb

52、数据库,选择数据库名称(clientdbName),选择操作表(tdbsettingMONGODB_DOCNAME), 数据库连接完毕后,由于mongodb是以字典的形式存储的,所有将主爬虫文件返回的item容器里的信息,强制转换为字典(dict),并使用插入语句将该字典插入数据库。#主要代码如下:from scrapy.conf import settingsimport pymongoclass Script2Pipeline(object): def _init_(self): host = settingsMONGODB_HOST port = settingsMONGODB_PORT

53、 dbName = settingsMONGODB_DBNAME client = pymongo.MongoClient(host=host, port=port) tdb = clientdbName self.post = tdbsettingsMONGODB_DOCNAME def process_item(self, item, spider): scriptInfo = dict(item) self.post.insert(scriptInfo) return item5)数据存储形式转换:由于可视化中依赖关系较强,所以将Mongodb中的数据转换至MySQL中,连接Mongod

54、b数据库,连接MySQL数据库,并取出Mongodb表里所有的信息,然后经过增强适应程序的处理后,拼接sql语句,将其插入到MySQL数据库中。#主要代码如下:script-script_5;$mongo_info = $mongo-find();$mysql_connect = mysql_connect(127.0.0.1,root,zhiyingbao);mysql_select_db(artical, $mysql_connect);mysql_query(SET NAMES utf8); foreach ($mongo_info as $v) if(empty($vtitle) $v

55、title = . ; if(empty($vdesc) $vdesc = . ; if(empty($vcontent) $vcontent = . ; if(empty($vtag) $vtag = . ; $sql = INSERT INTO script.artical_2 (title, desc, content, tag) VALUES (.$vtitle., .$vdesc., .$vcontent., .$vtag.); $res = mysql_query($sql, $mysql_connect); if($res) echo success!; else echo fa

56、il!;4.2.7可视化1) 首页文章智能推荐控制器:更具查询浏览量来推荐出经典文章,更具喜欢量来推荐出最好的文章,更具不同的关键字查询出不同类别的文章,并在前台友好的显示。#主要代码如下:class IndexController extends Controller public function index() $featured = Artical:where(scans, , 20)-orderBy(scans)-take(6)-get(); $latest = Artical:where(favorite, , 50)-orderBy(favorite)-take(6)-get()

57、; $php = Artical:where(title, like ,%php%)-orderBy(favorite)-take(4)-get(); $js = Artical:where(title, like, %JavaScript%)-orderBy(favorite)-take(4)-get(); $asp = Artical:where(title, like, %asp%)-orderBy(favorite)-take(4)-get(); $python = Artical:where(title, like, %python%)-orderBy(favorite)-take(

58、4)-get(); $linux = Artical:where(title, like, %linux%)-orderBy(favorite)-take(4)-get(); $Android = Artical:where(title, like, %Android%)-orderBy(favorite)-take(4)-get(); return view(index, featured = $featured, latest = $latest, php = $php, js = $js, linux = $linux, android = $Android, asp = $asp, p

59、ython = $python,2) 详细页面主控制器:通过传过来的被加密的id(作为反扒机制,和安全机制的考虑),进行解密之后,在数据库中查询该文章,并返回给前台有好的显示。Search()方法,是为用户提供了良好的搜索接口。首先验证输入信息的合法性,然后通过多个字段的模糊查询,提高文章精准率,然后返回给用户。#主要代码如下:class ArticalController extends Controllerpublic function articalInfo($id)$id = Crypt:d return view(artical, info = $articalpublic function search(Request $req)$this-validate($req, search = required|max:255, $info = Artical:where(title, like, %.$req-searc

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!