赞
踩
本课题的主要目的是设计面向定向网站的网络爬虫程序,同时需要满足不同的性能要求,详细涉及到定向网络爬虫的各个细节与应用环节。
搜索引擎作为一个辅助人们检索信息的工具。但是,这些通用性搜索引擎也存在着一定的局限性。不同领域、不同背景的用户往往具有不同的检索目的和需求,通用搜索引擎所返回的结果包含大量用户不关心的网页。为了解决这个问题,一个灵活的爬虫有着无可替代的重要意义。
网络爬虫应用智能自构造技术,随着不同主题的网站,可以自动分析构造URL,去重。网络爬虫使用多线程技术,让爬虫具备更强大的抓取能力。对网络爬虫的连接网络设置连接及读取时间,避免无限制的等待。为了适应不同需求,使网络爬虫可以根据预先设定的主题实现对特定主题的爬取。研究网络爬虫的原理并实现爬虫的相关功能,并将爬去的数据清洗之后存入数据库,后期可视化显示。
关键词:网络爬虫,定向爬取,多线程,Mongodb
ABSTRACT
The 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 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 search engines contain a large number of web pages that users don't 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 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 base on the preset themes to realize to filch the specific topics. What’s 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,multi-threading,mongodb
第一章 概述 1
1.1 课题背景 1
1.2 网络爬虫的历史和分类 1
第二章 文献综述 7
2.1 网络爬虫理论概述 7
2.2 网络爬虫框架介绍 8
第三章 研究方案 16
3.1 网络爬虫的模型分析 16
3.2 URL构造策略 19
3.3 数据提取与存储分析 19
第四章 网络爬虫模型的设计和实现 21
4.1 网络爬虫总体设计 21
4.2 网络爬虫具体设计 21
第五章 实验与结果分析 39
5.2 结果分析 42
参考文献 36
致谢 37
附录1 38
附录2 47
1.1 课题背景
网络爬虫,是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁,自动索引,模拟程序或者蠕虫。
网络检索功能起于互联网内容爆炸性发展所带来的对内容检索的需求。搜索引擎不断的发展,人们的需求也在不断的提高,网络信息搜索已经成为人们每天都要进行的内容.如何使搜索引擎能时刻满足人们的需求。最初的检索功能通过索引站的方式实现,而有了网络机器人。但是,这些通用性搜索引擎也存在着一定的局限性。不同领域、不同背景的用户往往具有不同的检索目的和需求,通用搜索引擎所返回的结果包含大量用户不关心的网页。为了解决这个问题,一个灵活的爬虫有着无可替代的重要意义。
1.2 网络爬虫的历史和分类
1.2.1 网络爬虫的历史
在互联网发展初期,网站相对较少,信息查找比较容易。然而伴随互联网爆炸性的发展,普通网络用户想找到所需的资料简直如同大海捞针,这时为满足大众信息检索需求的专业搜索网站便应运而生了。
现代意义上的搜索引擎的祖先,是1990年由蒙特利尔大学学生Alan Emtage发明的Archie。虽然当时World Wide Web还未出现,但网络中文件传输还是相当频繁的,而且由于大量的文件散布在各个分散的FTP主机中,查询起来非常不便,因此Alan Archie工作原理与现在的搜索引擎已经很接近,它依靠脚本程序自动搜索网上的文件,然后对有关信息进行索引,供使用者以一定的表达式查询。由于 Archie深受用户欢迎,受其启发,美国内华达System Computing Services大学于1993年开发了另一个与之非常相似的搜索工具,不过此时的搜索工具除了索引文件外,已能检索网页。
当时,“机器人”一词在编程者中十分流行。电脑“机器人”(Computer Robot)是指某个能以人类无法达到的速度不间断地执行某项任务的软件程序。由于专门用于检索信息的“机器人”程序象蜘蛛一样在网络间爬来爬去,因此, 搜索引擎的“机器人”程序就被称为“蜘蛛”程序。世界上第一个用于监测互联网发展规模的“机器人”程序是Matthew Gray开发的World wide Web Wanderer。刚开始它只用来统计互联网上的服务器数量,后来则发展为能够检索网站域名。与Wanderer相对应,Martin Koster于1993年10月创建了ALIWEB,它是Archie的HTTP版本。ALIWEB不使用“机器人”程序,而是靠网站主动提交信息来建立 自己的链接索引,类似于现在我们熟知的Yahoo。
随着互联网的迅速发展,使得检索所有新出现的网页变得越来越困难,因此,在Matthew Gray的Wanderer基础上,一些编程者将传统的“蜘蛛”程序工作原理作了些改进。其设想是,既然所有网页都可能有连向其他网站的链接,那么从跟踪 一个网站的链接开始,就有可能检索整个互联网。到1993年底,一些基于此原理的搜索引擎开始纷纷涌现,其中以JumpStation、The World Wide Web Worm(Goto的前身,也就是今天Overture),和Repository-Based Software Engineering (RBSE) spider最负盛名。
然而JumpStation和WWW Worm只是以搜索工具在数据库中找到匹配信息的先后次序排列搜索结果,因此毫无信息关联度可言。而RBSE是第一个在搜索结果排列中引入关键字串匹配程 度概念的引擎 最早现代意义上的搜索引擎出现于1994年7月。当时Michael Mauldin将John Leavitt的蜘蛛程序接入到其索引程序中,创建了大家现在熟知的Lycos。同年4月,斯坦福(Stanford)大学的两名博士生,David Filo和美籍华人杨致远(Gerry Yang)共同创办了超级目录索引Yahoo,并成功地使搜索引擎的概念深入人心。从此搜索引擎进入了高速发展时期。目前,互联网上有名有姓的搜索引擎已 达数百家,其检索的信息量也与从前不可同日而语。比如最近风头正劲的Google,其数据库中存放的网页已达30亿之巨。
随着互联网规模的急剧膨胀,一家搜索引擎光靠自己单打独斗已无法适应目前的市场状况,因此现在搜索引擎之间开始出现了分工协作,并有了专业的搜索引 擎技术和搜索数据库服务提供商。象国外的Inktomi,它本身并不是直接面向用户的搜索引擎,但向包括Overture(原GoTo)、 LookSmart、MSN、HotBot等在内的其他搜索引擎提供全文网页搜索服务。国内的百度也属于这一类(注),搜狐和新浪用的就是它的技术。 从这个意义上说,它们是搜索引擎的搜索引擎。
1.2.2 网络爬虫的分类
网络爬虫种类繁多,如果按照部署在哪里分,可以分成:
1,服务器侧:一般是一个多线程程序,同时下载多个目标HTML,可以用PHP, Java, Python等做,一般综合搜索引擎的爬虫这样做。但是,如果对方讨厌爬虫,很可能封掉服务器的IP,服务器IP又不容易改,另外耗用的带宽也是较贵。
2,客户端:很适合部署定题爬虫,或者叫聚焦爬虫。做一个与Google,百度等竞争的综合搜索引擎成功的机会微乎其微,而垂直搜索或者竞价服务或者推 荐引擎,机会要多得多,这类爬虫不是什么页面都取的,而是只取关心的页面,而且只取页面上关心的内容,例如提取黄页信息,商品价格信息,还有提取竞争对手 广告信息的。这类爬虫可以部署很多,而且可以很有侵略性。可以低成本大量部署,由于客户端IP地址是动态的,所以很难被目标网站封锁。
1.3 网络爬虫的发展趋势
目前,大多数的搜索引擎都是基于关键词的搜索引擎。基于关键字匹配的搜索技术有较大的局限性:首先,它不能区分同形异义。其次,不能联想到关键字的同义词。
Web商业化至今,搜索引擎始终保持着网络上被使用最多的服务项目的地位,然而,随着网上内容的爆炸式增长和内容形式花样的不断翻新,搜索引擎越来越不能满足挑剔的网民们的各种信息需求。
搜索引擎的发展面临着两大难题:一是如何跟上Internet的发展速度,二是如何为用户提供更精确的查询结果。所以,传统的引擎不能适应信息 技术的高速发展,新一代智能搜索引擎作为一种高效搜索引擎技术的在当今的网络信息时代日益引起业界人士的关注。搜索引擎己成为一个新的研究、开发领域。因为它要用到信息检索、人工智能、计算机网络、分布式处理、数据库、数据挖掘、数字图书馆、自然语言处理等多领域的理论和技术,所以具有综合性和挑战性。又 由于搜索引擎有大量的用户,有很好的经济价值,所以引起了世界各国计算机科学界和信息产业界的高度关注,目前的研究、开发十分活跃,并出现了很多值得注意的动向。
目前传统搜索引擎下,百度、谷歌等大厂商垄断了网络索引市场,因为它们的存在,日益庞大的互联网内容才能突破网络黑暗状态,变成可知的一个世界。然而,传统搜索引擎并不能支持定制搜索和信息处理、挖掘,只能以WEB1.0的形式存在。
可以预见将来互联网信息抓取、挖掘和再处理,将成为人们越来越多的需求,而满足这种需求的,就是各种各样的爬虫与相关的信息处理工具。现在网络上流 行的信息采集工具、网站聚合工具,都是未来新一代爬虫的先驱,甚至已经具备其特点。但是互联网本身,不管1.0还是2.0,还没有为爬虫时代的到来做好充分准备。现在流行的SEO,就是强势搜索引擎条件下对网站结构产生的影响。爬虫时代到来之后,互联网上会出现专门的信息站点,就是提供给爬虫看的站点。
传统的网络爬虫技术主要应用于抓取静态Web 网页,随着AJAX/Web2.0的流行,如何抓取AJAX 等动态页面成了搜索引擎急需解决的问题,因为AJAX颠覆了传统的纯HTTP 请求/响应协议机制,如果搜索引擎依旧采用“爬”的机制,是无法抓取到AJAX 页面的有效数据的。
AJAX 采用了JavaScript 驱动的异步请求/响应机制,以往的爬虫们缺乏JavaScript语义上的理解,基本上无法模拟触发JavaScript的异步调用并解析返回的异步回调逻辑和内容。
另外,在AJAX的应用中,JavaScript 会对DOM结构进行大量变动,甚至页面所有内容都通过JavaScript 直接从服务器端读取并动态绘制出来。这对习惯了DOM 结构相对不变的静态页面简直是无法理解的。由此可以看出,以往的爬虫是基于协议驱动的,而对于AJAX 这样的技术,所需要的爬虫引擎必须是基于事件驱动的。
2.1 网络爬虫理论概述
网络爬虫是一个自动提取网页的程序,它为搜索引擎从Web上下载网页,是搜索引擎的重要组成部分。通用网络爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL列表;在抓取网页的过程中,不断从当前页面上抽取新的URL放入待爬行队列,直到满足系统的停止条件。
主题网络爬虫就是根据一定的网页分析算法过滤与主题无关的链接,保留主题相关的链接并将其放入待抓取的URL队列中;然后根据一定的搜索策略从队列中选择下一步要抓取的网页URL,并重复上述过程,直到达到系统的某一条件时停止。所有被网络爬虫抓取的网页将会被系统存储,进行一定的分析、过滤,并建立索引,对于主题网络爬虫来说,这一过程所得到的分析结果还可能对后续的抓取过程进行反馈和指导。
如果网页p中包含超链接l,则p称为链接l的父网页。如果超链接l指向网页t,则网页t称为子网页,又称为目标网页。
主题网络爬虫的基本思路就是按照事先给出的主题,分超链接和已经下载的网页内容,预测下一个待抓取的URL及当前网页的主题相关度,保证尽可能多地爬行、下载与主相关的网页,尽可能少地下载无关网页[1]。
2.2 网络爬虫框架介绍
2.2.1 Scrapy
Scrapy 是一套基于Twisted的异步处理框架,是纯python实现的爬虫框架,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页内容或者各种图片。如图2-1显示了Scrapy的大体架构,其中包含了scheduler、item pipeline、downloader、spider以及engine这几个组件模块,而其中的绿色箭头则说明了整套系统的数据处理流程。
图2-1Scrapy大体架构
组件说明:
Scrapy Engine(Scrapy引擎)
Scrapy引擎是用来控制整个系统的数据处理流程,并进行事务处理的触发。更多的详细内容可以看下面的数据处理流程。
Scheduler(调度)
调度程序从Scrapy引擎接受请求并排序列入队列,并在Scrapy引擎发出请求后返还给他们。
Downloader(下载器)
下载器的主要职责是抓取网页并将网页内容返还给蜘蛛( Spiders)。
Spiders(蜘蛛)
蜘蛛是有Scrapy用户自己定义用来解析网页并抓取制定URL返回的内容的类,每个蜘蛛都能处理一个域名或一组域名。换句话说就是用来定义特定网站的抓取和解析规则。
蜘蛛的整个抓取流程(周期)是这样的:
1)首先获取第一个URL的初始请求,当请求返回后调取一个回调函数。第一个请求是通过调用start_requests()方法。该方法默认从start_urls中的Url中生成请求,并执行解析来调用回调函数。
2)在回调函数中,你可以解析网页响应并返回项目对象和请求对象或两者的迭代。这些请求也将包含一个回调,然后被Scrapy下载,然后有指定的回调处理。
3)在回调函数中,你解析网站的内容,同程使用的是Xpath选择器(但是你也可以使用BeautifuSoup, lxml或其他任何你喜欢的程序),并生成解析的数据项。
4)最后,从蜘蛛返回的项目通常会进驻到项目管道。
Item Pipeline(项目管道)
项目管道的主要责任是负责处理有蜘蛛从网页中抽取的项目,他的主要任务是清晰、验证和存储数据。当页面被蜘蛛解析后,将被发送到项目管道,并经过几个特定的次序处理数据。每个项目管道的组件都是有一个简单的方法组成的Python类。他们获取了项目并执行他们的方法,同时他们还需要确定的是是否需要在项目管道中继续执行下一步或是直接丢弃掉不处理。
项目管道通常执行的过程有:
2.2.2 Xpath
它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言。XPath基于XML的树状结构,提供在数据结构树中找寻节点的能力。起初 XPath 的提出的初衷是将其作为一个通用的、介于XPointer与XSLT间的语法模型。但是 XPath 用起来非常顺手很快的被开发者采用来当作小型查询语言来使用。
XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。路径表达式是从一个XML节点(当前的上下文节点)到另一个节点、或一组节点的书面步骤顺序。这些步骤以“/”字符分开,每一步有三个构成成分:
2.2.3 Mongodb
对于大数据量、高并发、弱事务的互联网应用,MongoDB则是一个如瑞士军刀般的利剑。
例如:为了产品中的某个实体的查询操作,我们需要把一个本属于该实体的数据拆分至另一个表中,以便进行连接查询。于是无论是创建,删除还是更新,我们要涉及的操作便增加了许多。更别说互联网项目时刻都在发展和变动,改变一个存储单元结果是常事,至今关系型数据库的在线模式更新依旧不是件简单的事情。
选择MongoDB,是因为它的集合支持松散的模式,易于灵活调整;支持复杂的属性,并可为之建立索引,作为查询条件。
MongoDB的系统管理员上辈子是折翼的天使,使他们牺牲自己,方便了整个团队
2.3 数据可视化
2.3.1 Laravel
Laravel是一套web应用开发框架,它具有富于表达性且简洁的语法。我们相信,开发过程应该是愉悦、创造性的体验。Laravel努力剔除开发过程中的痛苦,因此我们提供了验证(authentication)、路由(routing)、session和缓存(caching)等开发过程中经常用到的工具或功能。
Laravel的目标是给开发者创造一个愉快的开发过程,并且不牺牲应用的功能性。快乐的开发者才能创造最棒的代码!为了这个目的,我们博取众框架之长处集中到Laravel中,这些框架甚至是基于Ruby on Rails、ASP.NET MVC、和Sinatra等开发语言或工具的。
Laravel是易于理解并且强大的,它提供了强大的工具用以开发大型、健壮的应用。杰出的IoC、数据库迁移工具和紧密集成的单元测试支持,这些工具赋予你构建任何应用的能力。我学习过很多框架,但laravel是目前最前面最灵活的一个,所以选择此框架完成数据可视化。
2.3.2 Bootstrap
Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架。在现代 Web 开发中,有几个几乎所有的 Web 项目中都需要的组件。Bootstrap 为您提供了所有这些基本的模块 - Grid、Typography、Tables、Forms、Buttons 和 Responsiveness。此外,还有大量其他有用的前端组件,比如 Dropdowns、Navigation、Modals、Typehead、Pagination、Carousal、Breadcrumb、Tab、Thumbnails、Headers 等等。有了这些,你可以搭建一个 Web 项目,并让它运行地更快速更轻松。此外,由于整个框架是基于模块的,您可以通过您自己的 CSS 位,甚至是项目开始后的一个大整改,来进行自定义。
它是基于几种最佳实践,我们认为这是一个很好的开始学习现代 Web 开发的时机,一旦您掌握了 HTML 和 JavaScript/jQuery 的基本知识,您就可以在 Web 开发中运用这些知识。虽然,也有批评,所有通过 Bootstrap 构建的项目看起来相同,您可以不需要知道太多的 HTML + CSS 知识就可以构建一个网站。但是,我们需要明白,Bootstrap 是一个通用的框架,就像任何其他通用的东西,您需要定制才能让它具有独特性。当您要定制时,您需要深入研究,没有良好的 HTML + CSS 基础是不可行的[4]。
当然除了 Bootstrap,还有很多其他好的前端框架,但是laravel与Bootstrap就是绝配,在之前开发过的几个项目中,Bootstrap的前台效果惊艳绝伦。
3.1 网络爬虫的模型分析
本网络爬虫的开发目的,通过网络爬虫技术一个自动提取网页的程序,实现搜索引擎从自己想访问的网上下载网页,再根据已下载的网页上继续访问其它的网页,并将其下载直到满足用户的需求。
根据现实中不同用户的实际上的各种需求,本项目简单实现主题爬虫,本网络爬虫需要达到如下几个目标:
图3-1 多线程网络爬虫概要设计图模型
图3-2 网络爬虫工作流程图
3.2 URL构造策略
目标网站URL:www.jb51.net
爬取文章URL:www.jb51.net/article/1.htm
根据网站自身的特性我们为该网站(脚本之家),设计了自动构造URL。我们发现网站的后缀中,最后一位数字表示了该网页的唯一标示。我们一次为基准,初始化变量控制爬取范围。通过字符串拼接来构造在爬取范围内的URL,并自动修改配置文件中的变量。
3.3 数据提取与存储分析
为了便于提取数据我们对目标网站进行了简要的分析。爬取文章URL:www.jb51.net/article/1.htm。打开所爬取的任意网页,按F12打开调试窗口可见如图3-3,然后锁定所要提取信息的class一遍在xpath中进行定位。
图3-3 目标网站网页图
首次存储信息。我们选择mongodb数据库,它属于Nosql。不需要解析sql语句,执行速度非常快。对于我们这个依赖关系比较若得项目非常实用。在后期的可视化中我们会加入RBAC机制,所以在在依赖关系上会显得比较复杂。为了方便我们在可视化中使用MySQL。但是从Mongodb数据库中将数据导入MySQL又是一个比较棘手的问题。因为自带CSV方式或者json方式在单个字段过大的情况下都显得很乏力。很多时候都会造成数据的截取,丢失,有时就连字符编码不统一都会出现乱码的情况。不得已我们需要自己编写数据转换脚本程序,已完成数据的全面转换。
3.4 可视化显示与搜索策略
1)可视化框架
为了将导入MySQL中的数据做一些简单的应用,我们将其通过网页的形式可视化,我们选用的是目前国外最火的Laravel、Bootstrap框架,laravel用于后台逻辑控制,bootstrap用于前台友好的显示。网页的结构我们依旧选用经典的MVC结构,有底层操作数据库的模型,控制模型的控制器,和显示层。
2)搜索策略
在web中我们加入了搜索功能,多个字段的模糊搜索。但是有多搜索字段过多,MySQL对于中文的模糊搜索做的很不尽人意。当然也有解决方案,要么放弃MySQL,或者使用插件sphinx,建立分词查询机制,这样就可以在大数据中快速的模糊查询中文关键词了。由于文章的特性我们分别为数据库中的“title”、“tag”、“desc”建立模糊查询,以提高搜索的精准度,但是会增加我们服务器的压力。所以我们只能用硬件来换取软件上的缺陷了。
4.1 网络爬虫总体设计
根据本网络爬虫的概要设计本网络爬虫是一个自动提取网页的程序,根据设定的主题判断是否与主题相关,再根据配置文件中的页面配置继续访问其它的网页,并将其下载直到满足用户的需求。
1)设计基于多线程的网络爬虫的基本配置。
2)通过 http将自动构造的URL中的网页代码提取出来。
3)提取出所需要的信息并且通过管道技术将其存储之mongodb中。
4)通过url构造算法自动构造下一个URL,再通过递归算法实现下一URL的访问,重复以上步骤。
总的来说爬虫程序根据配置获得初始URL种子,把初始种子保存在临界区中,按照构造URL算法,自动构造URL,返回到临届区中,判断是否继续,从而使整个爬虫程序循环运行下去。
4.2 网络爬虫具体设计
4.2.1 爬取网页
主要用到的技术如下:
2)设置连接延迟(AUTHTHROTTLE_START_DELAY)时间为5秒,超时时间(AUTOTHROTTLE_MAX_DELAY)设置为60,如果连接超时,则自动跳过该页面,并在shell端显示出提示信息,自适应排错(AUTHTHROTTLE_DEBUG)功能如果出现404或505等未知错误,自动处理,将程序设为工厂模式。配置mongodb的连接信息,并在本地打开mongodb服务器端,供后期数据存储使用,引入管道文件(script_2.pipelines.Script2Pipeline)为其他文件使用,初始化Spider模型,并为递归初始化自身模型’script_2.spiders’
#主要代码如下:
BOT_NAME = ‘script_2’
SPIDER_MODULES = [‘script_2.spiders’]
NEWSPIDER_MODULE = ‘script_2.spiders’
ITEM_PIPELINES = [‘script_2.pipelines.Script2Pipeline’]
#mongodb config
MONGODB_HOST = ‘127.0.0.1’
MONGODB_PORT = 27017
MONGODB_DBNAME = ‘script’
MONGODB_DOCNAME = ‘script_8’
AUTOTHROTTLE_START_DELAY=5
AUTOTHROTTLE_DEBUG=Ture
AUTOTHROTTLE_MAX_DELAY=60
4.2.2 提取网页信息
算法实现步骤和算法描述:
Parse是Spider默认调用函数,start_requests()方法会将下载下来的网页信息,以response类为参数的方式传入该函数。使用的是Xpath选择器,首先实例化选择器,并将下载器下载到的response作为初始参数传入选择器,通过选择器中的xpath方法,提取出我们所需要的信息,使用extract()方法将其文本化,然后返回存储至python变量中。
#主要代码如下:
def parse(self, response):
sel = scrapy.selector.Selector(response)
title = sel.xpath(‘//div[@class=“title”]/h1/text()’).extract()
desc = sel.xpath(‘//div[@id=“art_demo”]/text()’).extract()
content = sel.xpath(‘//div[@id=“content”]’).extract()
tag = sel.xpath(‘//div[@class=“tags mt10”]/a/text()’).extract()
4.2.3 自动构造URL
判断目前爬取页面(pageNum)是否在允许爬取范围内(total),如果是,修改配置信息pageNum,利用初始化url模型拼接出新的URL(new_url),并调用,Request()方法递归的调用自身,再次爬取新的内容,直到将允许范围内的所有页面全部爬取完毕,则停止构造,退出程序。
#主要代码如下:
pageNum = 80000
total = 85000
self.pageNum = self.pageNum + 1
if(self.pageNum < self.total):
new_url = self.url + str(self.pageNum) + “.htm”
yield Request(new_url, callback = self.parse)
4.2.4 多线程的实现
最大请求线程数(CONCURRENT_REQUESTS),通过该配置项,调度器中间件(Scheduler middlewares)会同时调取32个http请求头信息,同时发出请求,调度下载器,将下载下来的数据以response类作为参数传递给默认初始化方法parse(),由于分析数据非常简单,所以实现多线程请求,单线程分析。COOKIES_ENABLED设为开启状态,在每次的http请求中会检查js、css、图片、等静态信息,判断如果文件名相同则直接使用,不必重复下载,以此来减少网络带宽、内存、I/O系统和CPU的占用,提高爬取效率。
#主要代码如下:
COOKIES_ENABLED = True
CONCURRENT_REQUESTS=32
4.2.5 伪造头信息和开启HTTPCACHE
1)为了防止目标网站具有反扒功能,经过单个IP的测试发现目标网站没有添加IP反扒功能,我们使用简单的代理信息就可以了。我们添加了代理信息(USER_AGENT)、头信息(DEFAULT_REQUEST_HEADERS),这两项信息会包含到http请求的头文件中,一块发送到目标网站的服务器中,既可以获得该页面的网页代码。
2)开启了http缓存(HTTPCACHE_ENABLED)机制,每次发送http请求时,则不用再去配置文件中读取配置头信息,可直接读取缓存中的http头信息,减少I/O开销,提高爬取速度。
#主要代码如下:
on the user-agent
USER_AGENT = ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.54 Safari/536.5’
HTTPCACHE_ENABLED=True
DEFAULT_REQUEST_HEADERS = {
‘Accept’: ‘text/html,application/xhtml+xml,application/xml;q=0.9,/;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)返回并增强数据适应能力:将Xpath提取出来的集合信息经过判断复制,如果为空或为假,则为其复制空字符串,tag集合中的多个集合通过join()方法,以“,”为分隔符,转换为一个集合,并使用yield返回到管道中。
#主要代码如下:
item = Script2Item()
if title:
title = title[0]
else:
title = “”
if content:
content = content[0]
else:
content = “”
if desc:
desc = desc[0]
else:
desc = “”
if tag:
tag = tag
else:
tag = “”
item[‘title’] = title
item[‘desc’] = desc
item[‘tag’] = ‘,’.join(tag)
item[‘content’] = content
yield item
3)启动mongodb服务器端:编写简单的启动bat脚本,将数据存储至,服务器目录上一文件夹中的data文件夹中,以BSON格式存储在磁盘上,每次启动真的很方便。
#主要代码如下:
mongod --dbpath …/data
4)数据处理的管道类:需要引入pymongo包才能在python中操作mongodb数据库,初始化函数(init)的编写,读出settings文件中的初始化信息,并赋予变量,用pymongo。MongoClient()方法连接到mongodb数据库,选择数据库名称(client[dbName]),选择操作表(tdb[setting[‘MONGODB_DOCNAME]]), 数据库连接完毕后,由于mongodb是以字典的形式存储的,所有将主爬虫文件返回的item容器里的信息,强制转换为字典(dict),并使用插入语句将该字典插入数据库。
5)
#主要代码如下:
from scrapy.conf import settings
import pymongo
class Script2Pipeline(object):
def init(self):
host = settings[‘MONGODB_HOST’]
port = settings[‘MONGODB_PORT’]
dbName = settings[‘MONGODB_DBNAME’]
client = pymongo.MongoClient(host=host, port=port)
tdb = client[dbName]
self.post = tdb[settings[‘MONGODB_DOCNAME’]]
def process_item(self, item, spider):
scriptInfo = dict(item)
self.post.insert(scriptInfo)
return item
5)数据存储形式转换:由于可视化中依赖关系较强,所以将Mongodb中的数据转换至MySQL中,连接Mongodb数据库,连接MySQL数据库,并取出Mongodb表里所有的信息,然后经过增强适应程序的处理后,拼接sql语句,将其插入到MySQL数据库中。
#主要代码如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。