版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于Python的分布式网络爬虫设计实现摘要随着社会经济的快速发展,互联网应用已成为人们日常生活中的一部分,如电商购物、滴滴打车等。随着互联网数据量的日益增多,数据内容及形式越来越丰富,人们开始意识到大量数据的背后蕴含着不小的商业价值和研究价值。数据量增多也给信息挖掘带来了一系列新的挑战。网络爬虫目前最关键的问题在于如何从海量的信息中及时并准确地获取有效信息,这既是挑战,也是机遇。网络爬虫具有抓取数据方便、迅速的特点,可以高效地抓取大量的网页信息,但网络爬虫也存在某些局限性。一方面传统单机式爬虫的抓取效率低下且不稳定,无法应对指数增长的海量数据。另一方面大型的搜索引擎只提供通用搜索服务,不能为用户提供定制搜索。针对上述问题,本文在考虑如何获取网页数据的基础上,对分布式爬虫的设计和架构进行分析。为了实现网页数据的自动化抓取、解析与存储,本文采取Scrapy技术进行开发,并采用Selenium完成页面动态数据的加载。除此之外,利用Scrapy-Redis设计分布式系统来达到稳定、高效地抓取数据的目的,并结合Redis、MySQL等数据库实现数据的存储与管理。本文所做工作有如下几点:(1)对Scrapy的相关组件进行定制开发,实现抓取网页数据的目的。(2)优化URL去重方法,在Redis中实现布隆过滤器,降低去重队列的内存占用率。(3)采用模拟浏览器的方式加载页面的动态信息。关键字:分布式爬虫,Scrapy,Selenium,URL去重,BloomFilterAbstractWiththerapiddevelopmentofsocialeconomy,InternetapplicationshavebecomeapartofPeople'sDailylife,suchase-commerceshopping,Diditaxi,etc.WiththeincreasingamountofdataontheInternet,thecontentandformofdataarebecomingmoreandmorerich.Peoplebegintorealizethatthereisnosmallcommercialvalueandresearchvaluebehindthelargeamountofdata.Theincreasingamountofdataalsobringsaseriesofnewchallengestoinformationmining.Atpresent,themostcriticalproblemforwebcrawlersliesinhowtoobtaineffectiveinformationtimelyandaccuratelyfrommassiveinformation,whichisbothachallengeandanopportunity.Webcrawlerhasthecharacteristicsofconvenientandrapiddatacapture,andcanefficientlycapturealargenumberofwebpageinformation,buttherearesomelimitationsofWebcrawler.Ontheonehand,thecaptureefficiencyoftraditionalstand-alonecrawlerislowandunstable,unabletocopewiththeexponentialgrowthofmassdata.Ontheotherhand,largesearchenginesonlyprovidegeneralsearchservicesandcannotprovidecustomizedsearchforusers.Inviewoftheaboveproblems,thispaperanalyzesthedesignandarchitectureofdistributedcrawleronthebasisofconsideringhowtoobtainwebpagedata.Inordertorealizetheautomaticcapture,parsingandstorageofwebpagedata,thispaperadoptsScrapytechnologytodevelopandSeleniumtocompletetheloadingofdynamicpagedata.Inaddition,thedistributedsystemisdesignedwithScrapy-Redistoachievethepurposeofstableandefficientcaptureofdata,andRedis,MySQLandotherdatabasesarecombinedtoachievedatastorageandmanagement.Theworkdoneinthispaperisasfollows:(1)CustomizeanddeveloprelatedcomponentsofScrapytoachievethepurposeofscrapingwebpagedata.(2)OptimizetheURLde-duplicationmethod,implementtheBloomFilterinRedis,andreducethememoryoccupationofthede-duplicationqueue.(3)Thedynamicinformationofthepageisloadedbysimulatingthebrowser.Keywords:Distributedcrawler,Scrapy,Selenium,URLreduplication,BloomFilter目录第1章绪论 [19]。(1)数据抓取程序 此程序是实现系统数据抓取的核心部分。在此程序中,Scrapy已经封装好了发送请求和接收响应的过程。只需给出目标网页的URL地址就能发送请求,接收响应后结合CSS或者XPATH选择器就可以获取目标信息。在此程序中,使用JdSpider类作为爬虫类,继承RedisSpider。在此类中,设置redis_key属性作为Redis起始爬虫地址的输入。在类中定义了三个处理方法,分别为parse_item_list()、parse_specific_item()、parese_comment_item(),有一个response参数,表示请求的响应。在这些方法中先生成Item实例,然后使用Item实例保存response解析出的数据信息,然后使用Scrapy.Request类封装解析出的新链接,同时设置回调处理函数。部分处理结果如下:图3-1爬虫数据提取图3-2Spider组件图(2)数据处理程序此程序主要用于数据的持久化存储。在程序中,使用MysqlPipeline实现MySQL存储,在初始化方法中,定义MySQL的相关连接信息,如数据库、用户名、密码、端口号等信息。在open_spider()方法中使用pymysql.connect()连接MySQL数据库。最后在process_item()方法中写好相关的MySQL语句,然后提交。语句如下:'insertinto%s(%s)values(%s)'%(item.table,keys,values)。完成上述步骤后,即可将爬虫解析后的Item数据保存入数据库中。(3)数据定义程序Item类是类似于一个字典,用于保存爬虫模块解析后的结构性数据。此程序定义了三个Item类,分别为JdSpiderItem、Specific_item、Comment_item。下面选择一个Item展示。图3-3Item类设计(4)系统配置文件要使Scrapy项目成功运行,还需要设置相关的参数信息,本文主要配置内容如下:1.ROBOTSTXT_OBEY=False:表示爬虫不遵循网站的ROBOTS协议。2.'JDSpider.middlewares.SeleniumMiddleware':543:Selenium中间件,数字表示中间件的优先级3.'JDSpider.pipelines.MysqlPipeline':404:MySQL数据管道。4.'scrapy_redis.pipelines.RedisPipeline':300:Redis数据管道。5.RETRY_ENABLED=True:允许重传。6.RETRY_TIMES=10:重传次数。3.3网页解析设计网页经过解析才能提取出我们想要的数据,爬虫大部分时间都用于页面数据的抓取与解析。网站根据自身的设计需要呈现不同的布局,并且随着时间变换网站也会更新其页面结构,所以在进行页面解析时,需要针对具体的网页指定相应的解析策略。3.3.1网页结构分析在进行页面解析之前,需要打开浏览器的开发者工具,查看网站的设计结构。只有了解网页的总体架构是怎么设计的,这样才能准确地获取到用户所需的数据在网页中的具体位置。在Elements面板中,可以看到网页的源代码信息,通过点击左上角的鼠标,就能定位到页面元素对应的代码位置。同时,通过点击鼠标右键找到Copy属性,选择CSS或XPATH路径,就能快速得到目标的元素在页面中的绝对路径。在Network面板中,在发起网页请求后,通过分析HTTP请求得到的请求信息,就能找到请求对应的动态数据。本文以京东网站为数据抓取网站,整体网页结构为三级结构:即网站主页、关键字搜索页及商品详情页。网站主页作为起始地址,为一级页面。网站主页拥有多个具有某个关键字的分类页面。关键字搜索页作为二级页面,通过一级页面获得。此页面所有URL链接一般具有相同关键字信息。商品详情页作为三级页面,通过二级页面获得。在此页面中的目标信息都会被爬虫抓取,是爬虫主要抓取的地方。分析网页的整体结构后,就在网页的Elements面板中,找到爬虫所需的目标信息和新链接。例如,找到某个商品对应的详情页URL,如下图所示。3.3.2网页解析工具获取到网页的源代码数据后,就要开始使用解析工具从中提取满足系统需要的数据信息。在前文提到过,解析工具有正则表达式、Lxml、BeautifulSoup等,Scrapy也为爬虫解析提供了CSS和XPATH工具。本文系统是基于Scrapy实现的,因此选择使用CSS和XPATH完成页面信息提取。CSS可以实现HTML页面元素一对一、一对多的控制。XPATH通过使用路径表达式来获取节点内容,它按照网站的文档结构进行选取,所以提取的内容十分准确。无论是CSS还是XPATH,它们都只适用于静态网页或内容加载完毕的网页,在目前的网页中,有一部分信息是有触发条件的,如鼠标点击、拖动网页滚动条等。图3-4网页元素分析图下面将展示系统对相关信息的提取:商品ID:response.css('data-id::text').extract_first()商品价格:response.css('div.p-price>strong>i::text').extract_first()商品名称:response.css('div.p-name>a>em::text').extract_first()商品销售量:response.css('div.p-commit>strong>a::text').extract_first()3.3.3页面动态数据加载前文已介绍过网页分为静态网页和动态网页。静态网页的数据直接使用页面解析工具就可以获取,但目前的大型网页还是以动态网页居多。对于动态网页,其数据内容十分丰富,通常需要执行某些浏览器操作才能显示其隐藏内容,例如点击按钮、拉动滚动条等操作。前文已分析过Selenium和Splash的优缺点。最终本文采用Selenium,结合Chrome驱动程序完成页面动态数据的加载。具体操作是在Scrapy的Middlewares组件中创建SeleniumMiddleware类,实现模拟浏览器访问的行为。在该类的初始化方法中,通过webdriver.Chrome()方法加载Chrome驱动程序,设置浏览器的大小及超时时间。在该类的process_request()方法中,有request和spider两个参数,request代表当前请求,spider代表爬虫。在此方法中,通过request.url得到当前请求的URL,然后使用浏览器对象的get方法进行调用,调用后就会弹出Chrome测试页面。在此类中还定义一些执行JavaScript脚本的方法,让浏览器对象执行这些脚本完成浏览器点击按钮和拉动滚动条的操作,从而使浏览器的隐藏数据显示出来。如window.scrollTo(0,i)就是一个让浏览器拉动滚动条的JS脚本。待浏览器页面的数据加载完毕后,生成一个HtmlResponse类对象。在HtmlResponse对象中,封装了请求地址、网页源码以及响应状态码等信息,然后将对象返回给Spider模块,由爬虫对返回的页面数据进行解析。3.4去重设计在完成页面解析工作后,就要考虑如何过滤已抓取的页面。互联网可以看作是一张由多个网页节点组成的图,所以在浏览器在进行页面跳转的时候有可能会访问到之前已访问过的网页。在Scrapy中,由程序内存的空间保存请求的队列,所以无法做到分布式共享,而且在爬虫数据量较大的时候会导致内存资源不足。所以本系统在设计时,使用Redis维护爬虫的待抓取URL队列。因为Redis是基于内存实现的,数据优先存储于内存空间,所以爬虫任务量提升时队列会变大。当队列非常大时,内存不足会影响系统的抓取效率。所以本系统采用布隆过滤器过滤重复URL,以此提高内存空间的使用率。在配置文件中,通过写入DUPEFILTER_CLASS="scrapy_redis_bloomfilter.dupefilter.RFPDupeFilter"实现对布隆过滤器的调用。布隆过滤器是目前使用较为广泛的去重工具。它是基于散列表的思想设计的,查询、插入操作的时间复杂度都十分低,但存在一定的误判率。BloomFilter使用m位初始值为0的二进制容器进行数据存储。图3-5BloomFilter原理图3.5存储设计本系统主要使用了两种的数据库进行数据存储,第一种是MySQL数据库,负责存储数据内容。第二种是Redis数据库,负责维护请求的待抓取URL队列和去重队列。3.5.1MySQL数据库设计使用Item类保存Spider程序解析后的数据信息,然后在数据处理程序中连接MySQL并将Item类中存储的结构性数据转入指定的表中。MySQL中一共有三张表,分别为商品分类表(goods_items)、商品具体表(specific_items)以及商品评论表(comment_items)。商品分类表中,表字段有商品标题、商品类型、商品价格、商品店铺、商品销售量以及商品链接等。商品具体表中,表字段有图片、描述信息、评论数量以及好评率等。商品评论表中,表字段有:评论内容、评论时间、商家回复等。三个表中都有主键sku_id,用于表示商品的唯一ID,表的创建存储表的范式,不存在冗余字段。3.5.2Redis数据库设计在Redis数据库中使用了四个字段,第一个是JD_start_urls,它是List类型,用于在Redis中输入爬虫的初始地址。第二个字段是JD:items,用于存储爬虫模块解析后的结构性数据。第三个字段是JD:dupefilter,表示Redis中保存的过滤器。第四个字段是JD:requests,表示Redis中保存的待抓取URL队列。3.6分布式设计前文已介绍过分布式相关的理论和架构。本系统选择使用AP架构实现,即满足可用性和分区容错性,不能保证强一致性。当分布式系统的节点发生故障时,其他节点仍可以继续提供爬虫服务,发生故障的节点由于出现故障会导致一部分爬虫任务丢失。除此之外,本文已分析过主从式与对等式的优缺点,最终选择主从式作为本系统的总体集群架构。在系统中,由Redis内存数据库作为主节点,维护爬虫系统的请求队列和去重队列,负责向其他从节点发送URL链接。从节点由每台机器的爬虫程序组成,爬虫程序接收主节点的URL来执行爬虫任务,并将解析出的新链接发送给主节点,作为下一次抓取的页面。同时从节点连接指定的MySQL数据库,将解析后的数据存储到指定的表中。前文已分析过Scrapy只是单机式爬虫,需要使用Scrapy-Redis才能实现分布式爬虫。单机式爬虫是一个调度器对应一个下载器,而在分布式系统中可以通过扩展多个调度器和下载器来实现系统的分布式部署。本系统采用Scrapy-Redis框架并结合主从式架构进行设计。系统由一个主节点和两个从节点组成,主节点负责系统的任务分发,从节点从主节点的队列中提取URL链接,然后进行数据抓取。具体实现流程如下:(1)部署分布式爬虫的相关环境。安装Scrapy、Scrapy-Redis、pymysql等工具包,并设置Python、MySQL、Redis等版本。除此之外,必须在配置文件中给出Redis和MySQL数据库的连接参数。(2)搭建分布式系统。修改Scrapy的相关组件来实现分布式部署,修改的主要内容有几点。第一,在dupefilter.py文件中,指定去重的方法,以此设计爬虫的去重模块。第二,在系统配置文件中将Scheduler设置Scrapy-Redis的调度器。第三,在数据抓取程序中使用RedisSpider作为爬虫类。同时设置Redis_Key参数,这个参数在Redis中是一个队列,通过在Redis客户端中使用lpush命令向队列中添加指定的爬虫起始地址。第四,在配置文件中在ITEM_PIPELINES中设置'scrapy_redis.pipelines.RedisPipeline':300,用于将解析后的链接保存进Redis数据库中。同时MySQL和Redis的连接地址改为连接目标主机的IP地址和数据库端口号,使用localhost不能实现分布式存储。(3)修改Redis配置文件。在Redis中输入configsetprotected-modeno,表示Redis数据库允许网络远程访问,否则从节点会显示连接主节点失败。除此之外,在配置文件中添加相关的连接参数。第4章系统优化设计本章将根据上章所讲述的爬虫系统设计进行详细的实现,主要说明系统运行所涉及的功能、实现以及系统优化。4.1页面动态加载优化为了让系统获取到动态数据,本文在中间件组件中采用Selenium技术模拟浏览器实现。在重写的中间件类中,Selenium的API方法会代替原生的爬虫中间件,以此来实现网页数据的动态加载。本文已定义了一个SeleniumMiddleware类来实现Chrome页面的自动化测试,在该类的process_request方法中先使用正则表达式判断当前请求是属于哪一个网页,再决定具体的加载方法。本文在前面已实现数据的动态加载功能,实现完动态数据加载的功能后,就要考虑对加载过程进行优化。比如,每次加载网页的时候若加载没有必要的图片或视频,那么就会浪费资源。可以采取如下措施进行优化:(1)设置浏览器相关驱动参数,不加载一些系统不需要的内容。(2)使用Scrapy框架的信号机制,爬虫关闭时通知浏览器进程关闭。本系统除了使用Selenium加载网页数据外还有其他方面的考虑。爬虫请求的数量一般都比较大,所以容易被网站禁止访问。使用Selenium访问网站本身需要一定的加载时间,这无疑降低了请求的访问频率,所以降低了被网站限制访问的风险。同时Selenium还能渲染页面的JS脚本,这极大地降低了网页数据分析的难度。4.2解决反爬问题本系统主要反爬措施有用户代理,用户代理是表示浏览器的身份信息,例如浏览器语言及版本、客户使用的操作系统等。网站通常通过Headers信息识别请求的身份,如果识别出这是一个爬虫请求,那么网站就会拒绝请求访问。因此访问网站的时候需要伪装请求的相关信息,让网站认为这是一个正常的请求。本系统在设计时,通过重写DownloaderMiddlewares的process_request方法,并为请求的字段添加代理信息,从而实现请求的正常访问。4.3优化去重算法前文已介绍三种去重方法。Scrapy默认使用的去重算法是基于Set方法,但是这个Set集合保存于程序空间内部,不能做到分布式共享,因此不适合本系统。Scrapy-Redis默认使用的去重算法是基于Redis的方法,虽然可以做到分布式共享过滤的结果,但是Redis是内存数据库,URL不经处理的话本身很大,所以会随着系统任务量的提升,Redis内存占用率会越来越高。因此本系统选择使用基于Redis的BloomFilter方法来实现对请求的去重。BloomFilter可以将URL经过哈希函数转化为一系列比特字符,通过比较比特数组就能确定URL是否已存在于此集合中,它的优点在于效率更高、占用空间更少。4.4数据存储优化MySQL可以支持大数据量存储,但一般来说,表越小,执行速度越快。通过合理地设置字段的属性,可以优化查询速度。在本系统的表中,使用最多的数据类型是字符串类型。MySQL中有char、varchar、text等字符串类型。本文内容少的字段选择使用varchar,这样可以节省表的存储空间。在商品评论表中,评论内容一般比较大,使用varchar会导致字符串动态创建的时间变长,因此选择使用text类型。此外,使用索引优化数据库性能,使某些常用数据的查询效率提高。 在系统的配置文件中,设置SCHEDULER_FLUSH_ON_START=True,表示爬虫程序出现故障后,再次启动程序可以从断点处继续执行爬虫程序。设置SCHEDULER_PERSIST=True,表示爬虫程序退出后,调度器不会被删除,减少下次创建调度器的时间。第5章系统测试及成果展示5.1系统运行环境 本系统由三台服务器组成,其中一个为主节点,其余两个为从节点。考虑系统的稳定性与拓展性,故整个系统的基于主从式架构搭建。下表将展示机器的相关硬件信息:表5-1节点信息表表5-2系统软件版本5.2数据结果展示与分析 本系统以京东网站的商品信息为抓取目标,总共运行2小时,抓取有效网站数量约4000余条。本系统基于Scrapy框架设计分布式系统,理论页面的所有链接地址都能抓取下来,但由于网络加载速度、布隆过滤器误判等原因,所以并不是所有的网页信息都能被下载。另外,由于Scrapy-Redis对URL分配时会产生延迟,但每个节点最终抓取的网页数量相差并不是很大,所以只要增加从节点数量,就能提高爬虫的抓取速度。 在完成抓取任务后,查看MySQL数据库中数据表的内容,存储信息如下图所示:图5-3数据库结果图在此表中,sku_id表示商品的唯一ID,src表示商品图片,description表示商品相关描述,comment_num表示评论数量,good_comment_rate表示好评率,good_comment表示好评数量。5.3数据处理 在爬虫系统爬取完数据后,对抓取的评论数据进行简单的处理。根据IF-IDF矩阵得到评论的关键字信息,并生成词云展示可视化结果。结果如下图所示。从图可以直观看出,电池、物流、性价比等信息是用户更加关注的内容。图5-4词云分布图第6章总结6.1论文总结 随着互联网数据量的指数增长,人们获取信息的主要手段是搜索引擎,而搜索引擎的本质就是网络爬虫。单机式爬虫只能满足小型的数据抓取要求,在面对巨大的数据量时,就要考虑使用分布式技术,通过多台机器的相互协作来提升爬虫系统的性能。本文分析了目前比较成熟的分布式技术,考虑了爬虫过程中系统的复杂性及适用性,设计并实现了一个可以高效、稳定地抓取大量网页数据的分布式系统。通过分析国内外的研究现状以及爬虫所需理论知识,完成了系统的预期设计功能。本系统采用了主从式架构,底层基于Redis实现URL请求队列和请求去重,同时也增强了系统的可拓展性。论文成果如下:(1)本系统基于Scrapy实现,同时通过分析各动态加载技术的优势,最终选择使用Selenium完成本系统的页面数据动态加载功能。(2)使用Redis实现分布式系统。实现布隆过滤器进行请求去重,对比原生Scrapy框架的去重方法,此方法的空间、时间复杂度都得到了较大的优化,带来的结果只是低概率的误判。(3)解决网站反爬问题。通过设置用户代理、访问间隔时间等手段,保证爬虫的持续可用。(4)基于第二章介绍的相关技术,完成了本系统的设计与实现。通过分析分布式理论选择本系统的整体架构,并结合Scrapy的相关组件对系统进行定制开发,取得了较好的结果。最后,本文经过测试验证每个功能模块的预期实现成果,并以图表形式展示数据分析成果。本文主要研究内容在于分布式爬虫的实现,其次对抓取的评论内容进行关键字提取。6.2未来展望本文已实现分布式爬虫系统的基本功能,并具有较好的拓展性和适用性,解决了单机式爬虫低下的工作效率,但还有较大的优化空间:(1)爬虫配置的自定义配置,可以由用户自己选择抓取的数据量和抓取规则,不需要使用系统默认设置的策略。(2)本系统采用Scrapy-Redis实现分布式部署,在调度策略上还有很大的优化空间。本文未对节点间的机器性能进行较好的分析,使用的节点间配置差距不大。如果节点间差异较大,可能会对实验结果产生较大的影响,所以后续需要根据节点的实际情况调整爬虫的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 四川省南充市高级中学2025-2026学年高二下学期第一次月考试语文试卷(含答案)
- 2026年环保顾问节能改造合同
- 2026年有色金属冶炼行业分析报告及未来五至十年行业发展报告
- 医院消防培训2026版新员工测试题
- 2026年培训班学员安全责任书
- 2026年小区物业安全应急方案及处置流程
- 2026年养老服务志愿服务专项计划
- 2026年中毒窒息事故现场应急处置方案讲解学习
- 2026年卫生事业编考试冲刺押题试卷
- 标准成本管理在服装行业的实践与创新-以XX劳动密集型制造企业为例
- 2025年云南省西双版纳州景洪市辅警招聘考试题库附答案解析
- 杭州电子科技大学本科毕业设计(论文)的写作规范及格式要求
- 华为集团薪酬管理制度
- DGTJ08-207-2008 房屋修缮工程技术规程
- 2026年高考作文素材积累:从“存亡危机”到“斩首警告”的中日关系风暴
- 2025年客运驾驶员从业资格证考试题库及答案
- 危化品甲类库房安全规范要求
- 高中数学公式大全(必修-+-选修)
- EPC总承包项目管理组织方案投标方案(技术标)
- 2025版银屑病常见症状及护理原则
- 【《发动机气缸体的加工工艺分析及专用夹具设计》14000字(论文)】
评论
0/150
提交评论