Scrapy分布式爬虫系统构建与实施指南

更新:11-15 名人轶事 我要投稿 纠错 投诉

大家好,今天给各位分享Scrapy分布式爬虫系统构建与实施指南的一些知识,其中也会对进行解释,文章篇幅可能偏长,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在就马上开始吧!

1、系统功能架构

系统功能架构图

分布式爬虫爬取系统主要包括以下功能:

1爬虫功能:

爬取策略设计

内容数据字段的设计

增量爬取

请求重复数据删除

2.中间件:

爬虫反屏蔽中间件

网页非200状态处理

爬虫下载异常处理

3、数据存储:

抓取区域设计

数据存储

4.数据可视化

2.系统分布式架构

分布式采用主从结构,设置一台Master服务器和多台Slave服务器。 Master管理Redis数据库并分发下载任务。 Slave部署Scrapy爬虫来提取网页并解析提取数据。最后,解析后的数据存储在同一个MongoDb数据库中。分布式爬虫架构如图所示。

分布式爬虫架构图

应用Redis数据库实现分布式爬取。基本思想是,将Scrapy爬虫获取到的detail_request的url放入Redis队列中。所有爬虫也从指定的Redis Queue中获取请求。 Scrapy-Redis 组件中默认使用SpiderPriorityQueue。确定URL 的顺序。这是一种通过有序集实现的非先进先出和后进先出的方法。因此,共享待爬取队列是爬虫部署在其他服务器上完成相同爬取任务的关键点。另外,在本文中,为了解决Scrapy的单机限制问题,Scrapy将与Scrapy-Redis组件结合开发。 Scrapy-Redis的总体思路是,该项目通过重写Scrapu框架中的scheduler和spider类来实现调度和spider启动。与redis交互。实现新的dupefilter和queue类,实现权值判断和调度容器与redis的交互。由于各主机上的爬虫进程访问同一个redis数据库,调度和权重判断都是统一管理的,达到了分布式爬虫的目的。

三、系统实施

1)爬取策略设计

从scrapy的结构分析可以看出,网络爬虫从初始地址开始,根据spider中定义的目标地址获取的正则表达式或Xpath获取更多的网页链接,并将其添加到待抓取的队列中。下载了。经过去重和排序后,等待调度器的调度。

在这个系统中,新建链接可以分为两类,一类是目录页链接,也就是我们平时看到的下一页的链接,另一类是内容详情页链接,也就是我们需要解析的地方。网页提取字段。该链接指向实际的房产信息页面。网络需要从每个目录页面链接中提取多个内容页面链接并将其添加到下载队列中,以准备进一步抓取。爬取过程如下:

这里是Master端目标链接的抓取策略。由于采用分布式主从模式,Master端爬虫主要爬取内容详情页的下载链接,并通过redis与其他Slave端爬虫共享下载任务。 Slave端主要负责进一步解析、提取详情页链接并存入数据库。

本文以58同城租赁为例。它的初始页面链接实际上是每个类别的首页链接。主要包括(以广东省几个市为例):

东莞租房:(http://dg.58.com/chuzu/),

深圳租房:(http://sz.58.com/chuzu/),

汕尾租房:(http://sw.58.com/chuzu/),

广州出租:(http://gz.58.com/chuzu/),

其目录页面的链接如下:

第二页(http://dg.58.com/chuzu/pn2)

第三页(http://dg.58.com/chuzu/pn3)

第四页(http://dg.58.com/chuzu/pn4)

其内容详情页面如下:

(http://taishan.58.com/zufang/29537279701166x.shtml)

综上所述,在线房产抓取系统采用如下抓取策略:

1) 对于主端:

核心模块是解决翻页问题,获取每个页面内容详情页的链接。 Master端主要采用以下抓取策略:

1、将初始链接插入到redis中,key为nest_link,从初始页面链接开始

2. 爬虫从redis获取初始链接,key为next_link,并开始运行爬虫。

3、在下载器返回的Response中,爬虫根据spider定义的爬行规则,识别是否有下一页的链接。如果有链接,则存储到redis中,保存key为next_link,同时根据匹配规则判断是否匹配多个内容详情。如果匹配到页面链接,则将其存储到Redis中,将key保存为detail_request,插入下载链接,用于slave端的spider,即slave端的下载任务。

4、爬虫继续从redis获取key next_link的值。如果有值,则继续步骤2。如果为空,则爬虫等待新链接。

2) 对于从机侧:

核心模块是从redis获取下载任务并解析提取的字段。 Slave端主要采用以下爬取策略:

1爬虫从redis获取带有detail_request键的初始链接,并开始运行爬虫。

2、爬虫在下载器返回的Response中,根据蜘蛛定义的爬行规则,识别是否有符合规则的内容字段。如果有字段,则存储并返回给模型等待数据存储操作。

重复步骤1,直到爬行队列为空并且爬虫正在等待新链接。

2)爬虫具体实现

爬虫程序由四部分组成,分别是对象定义程序、数据抓取程序、数据处理程序和下载设置程序。这里的组件是Slave端。 Master端缺少对象定义程序和数据处理程序。 Master端主要是下载链接的爬取。

(1)数据采集程序

数据爬虫程序分为Master端和Slave端。数据爬虫程序从Redis获取初始地址。数据爬虫程序定义了爬取网页的规则以及使用Xpath提取字段数据的方法。这里我们重点关注Xpath字符的提取。数据方法,Xapth 使用路径表达式来选择Web 文档中的节点或节点集。 Xpath 中有多种类型的元素: 个元素、属性、文本、名称空间、处理指令、注释和文档节点。 Web 文档被视为节点树。树的基础称为文档节点和根节点。通过使用Xpath表达式定位目标节点即可提取Web文档的字段数据。下面,Master用于捕获内容页面链接,Slave用于提取字段。以数据为例。

a.Master端示例

Xpath方法提取下一页链接:

response_selector.xpath(u"//div[contains(@class,"pager")]/a[contains(@class,"next")]/@href").extract()

Xpath方法提取内容详情页链接:

response_selector.xpath(u"//div[contains(@class,"listBox")]/ul[contains(@class,"listUl")]/li/@logr").extract(),

由于网站对内容详情页实施了反爬虫措施,点击详情页后,获取到ID,然后跳转到某个域名。所以详情页ID是自己构造的,实现如下:

response_url[0]+"/zufang/" + detail_link.split("_")[3] + "x.shtml"

a.slave 端的示例:

Xpath方法提取内容页:

帖子名称:

response_selector.xpath(u"//div[contains(@class,"house-title")]/h1[contains(@class,"c_333 f20")]/text()").extract()

帖子发表时间:

response_selector.xpath(u"//div[contains(@class,"house-title")]/p[contains(@class,"house-update-info c_888 f12")]/text()").extract( )

因为有些数据无法使用提取进行过滤处理。

3)去重和增量爬取

去重和增量爬取对于服务器来说意义重大,可以减轻服务器的压力,保证数据的准确性。如果不进行去重,爬取的内容会捕获大量的重复内容,这会大大降低爬虫的效率。事实上,重复数据删除过程非常简单。核心是每次请求时判断该请求是否在已经爬取的队列中。如果已经存在,则丢弃当前请求。

具体实施步骤:

(1) 从待抓取队列中获取url

(2)判断所请求的URL是否已被爬取。如果已被爬取,则该请求将被忽略。如果没有爬取,则继续其他操作,将URL插入到爬取队列中。

(3)重复步骤1

这里我们使用的是scrapy-redis的去重组件,所以没有实现。不过,你还是需要明白其中的原理。详细内容可以查看源代码。

4)爬虫中间件

爬虫中间件可以帮助我们在scrapy爬取过程中自由扩展自己的程序。以下包括爬虫反屏蔽中间件、下载器异常状态中间件和非200状态中间件。

(1)爬虫反屏蔽组件的实现

当访问网站的网页时,会给网站带来一定的负载,而爬虫程序模拟了我们正常访问网页的过程,但是。大规模的爬虫会给网站增加大量的负载,影响用户的正常访问。为了保证网页无法被大多数正常用户访问,大多数网站都有相应的反爬虫策略。一旦访问行为被确定为爬虫,网站将采取一定措施限制您的访问,例如如果您访问过于频繁则提示您、要求您输入验证码等。更严重的情况下,您的IP将被封锁,您将被禁止访问该网站。当该系统定向捕获网页数据时,它将不间断地访问网站内容。如果不采取伪装措施,很容易被网站识别为爬虫行为并进行拦截。

本系统采用以下方法来防止爬虫被屏蔽:

1. 模拟不同浏览器行为

2、一定频率更换代理服务器和网关

3、本着君子协定,降低爬虫爬取网页的频率,减少并发爬取进程数,限制每个IP的并发爬取数量,牺牲一定的效率来换取系统的稳定性。

4. 禁用cookie。网站会在用户访问时在cookie中插入一些信息来判断是否是机器人。我们阻止cookie,这也将有助于我们的身份不被暴露。

5.手动编码,这应该是一个无可挑剔的反封禁措施。所有系统都无法与人工操作相比,反而降低了自动化程度,效率也不是很高,但确实是最有效的措施。当爬虫被禁止时,会被重定向到验证码页面。输入验证码以重新访问该页面。为此,我添加了一个电子邮件提醒模块。当爬虫被封禁时,会发送邮件提醒管理员解除封禁。同时将重定向后的请求重新添加到下载队列中进行爬取,保证数据的完整性。

反爬虫网站拦截原理如下图:

(一)模拟不同浏览器行为实现思路及代码

原理: 从scrapy的介绍中我们可以知道scrapy有下载中间件。在这个中间件中,我们可以自定义请求和响应的处理,类似于spring面向切面编程,就像在程序运行前和运行后嵌入一个钩子一样。核心是修改请求的属性

首先主要是对下载中间件进行扩展。首先,将中间件添加到seeings.py。

其次扩展中间件主要写了一个useragent列表,将常用的浏览器请求头保存为列表,如下图:

然后让请求的头文件从列表中随机挑选一个代理值,然后下载到下载器。

综上所述,每次发出请求时,都会模拟不同的浏览器来访问目标网站。

(b)利用代理IP爬取的实现思路及代码。

首先,在seeings.py中添加中间件,展开下载组件请求的头文件,从代理IP池中随机取出一个代理值,然后下载到下载器中。

1、代理IP池的设计开发流程如下:

一个。抓取免费代理IP 网站。

b.存储并验证代理IP

c.验证存储在数据库中

d.如果达到最大IP数,则停止爬取,并在一段时间后验证数据的IP有效性,并删除无效IP。

e.直到数据库IP小于0,继续爬取IP,重复步骤a。

代理ip模块使用了Qiye代理ip池的开源项目。

代理IP爬虫运行截图:

(c) 爬虫异常状态组件的处理

在爬虫没有被拦截的情况下,访问网站并不一定都是200请求成功,而是有多种状态。当爬虫被禁止时,返回的状态实际上是302。为了防止阻塞组件,捕获了302状态。意识到了。同时,异常状态的处理有利于爬虫的鲁棒性。

设置中的扩展中间件捕获异常情况后,请求将重新添加到下载队列中。流程如下:

(d) 数据存储模块

数据存储模块主要负责存储slave端抓取并解析的页面。使用Mongodb存储数据。

Scrapy支持json、csv、xml等文本格式的数据存储格式。用户可以在运行爬虫时设置,如:scrapycrawlspider -o items.json -t json,也可以在Scrapy项目文件或ItemPipline文件中定义。同时,Scrapy还支持数据库存储,比如Monogdb、Redis等,当数据量达到一定程度时,可以使用Mongodb或者Reids集群来解决问题。本系统的数据存储如下图:

(e) 抓取场地设计

本文以线上房屋数据为抓取目标,从机解析并抓取现场数据。因此,抓取的内容必须能够客观、准确地反映在线住房数据的特征。

以抓取58同城在线住房数据为例,通过分析网页结构,定义的字段详细信息如下表所示。

序列号字段名称字段含义

1title 帖子标题

2钱租金

3方法租赁方法

4区面积

5community所在社区

6targeturl 帖子详细信息

7city所在城市

8Pub_time 发布时间

现场选型主要是基于本系统的应用研究,因为系统开发的单机配置比较低,并且没有将镜像文件下载到本地机器。减轻单机压力。

(f) 数据处理

1)对象定义程序

Item 是定义捕获数据的容器。通过创建scrapy.item.Item 类来声明这一点。将属性定义为scrapy.item.Field 对象,通过实例化所需的item 来控制获取的站点数据。本系统定义了九个抓取对象,分别是:个帖子标题、租金、出租方式、地区、社区、城市、帖子详情页面链接、发布时间。这里字段的定义是根据数据处理端的需要而定。关键代码如下:

类TcZufangItem(Item):

#帖子名称

标题=字段()

钱=字段()

#租赁方法

方法=字段()

区域

面积=字段()

社区

社区=字段()

#帖子详情网址

目标网址=字段()

#发布时间

pub_time=字段()

城市

城市=字段()

2)数据处理程序

Pipeline类定义了数据保存和输出方法。从Spider的parse方法返回的Item,数据将被ITEM_PIPELINES列表中的Pipeline类处理并以第一种格式输出。该系统返回到管道的数据使用Mongodb存储。关键代码如下:

def process_item(自身,项目,蜘蛛):

如果项目["pub_time"]==0:

raise DropItem("发现重复项: %s" % item)

如果项目["方法"]==0:

raise DropItem("发现重复项: %s" % item)

if item["社区"]==0:

raise DropItem("发现重复项: %s" % item)

if item["money"]==0:

raise DropItem("发现重复项: %s" % item)

if item["区域"]==0:

raise DropItem("发现重复项: %s" % item)

如果项目["城市"]==0:

raise DropItem("发现重复项: %s" % item)

zufang_detail={

"标题": item.get("标题"),

"钱": item.get("钱"),

"方法": item.get("方法"),

"区域": item.get("区域", ""),

"社区": item.get("社区", ""),

"targeturl": item.get("targeturl"),

"pub_time": item.get("pub_time", ""),

"城市":item.get("城市","")

}

结果=self.db["zufang_detail"].insert(zufang_detail)

print "[成功] "+item["targeturl"]+"写入MongoDB 数据库"

退货

(g) 数据可视化设计

数据可视化实际上就是将数据库数据转换成我们用户容易观察的形式。本系统使用Mongodb来存储数据。可视化数据基于Django+Semantiui,效果如下图:

4. 系统操作

该系统针对的是58同城租赁平台。运行十个小时后,持续抓取了总计数万个网页的房屋数据。

主控端运行截图:

Slave端运行截图:

关于Scrapy分布式爬虫系统构建与实施指南和的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

用户评论

歆久

我想要了解一下Scrapy分布式爬虫能提高效率多少?

    有8位网友表示赞同!

雪花ミ飞舞

最近在学习爬虫,感觉Scrapy还挺好用的,尤其适合大型项目。

    有19位网友表示赞同!

生命一旅程

这个标题看着就很有技术含量啊!期待详细了解一下开发和设计过程。

    有13位网友表示赞同!

秘密

对分布式爬虫一直感兴趣,希望这篇文章能讲解清楚它的优势。

    有8位网友表示赞同!

非想

想来想去,应该用Scrapy开发分布式爬虫才能完成我这个大数据收集任务呀。

    有19位网友表示赞同!

傲世九天

现在网络上资源那么多,要高效地采集信息真的需要用到分布式爬虫吧?

    有13位网友表示赞同!

花菲

分布式编程技术对爬虫的影响挺大的嘛!这篇文章让我能了解更多吗?

    有5位网友表示赞同!

一个人的荒凉

我有个项目也需要爬取大量数据,Scrapy分布式爬虫是个不错的选择。

    有7位网友表示赞同!

淡写薰衣草的香

基于框架开发的爬虫效率肯定会更高吧!期待作者分享具体的使用经验。

    有11位网友表示赞同!

青山暮雪

做大规模的数据抓取,一定得要了解一下分布式的应用方法,学习学习!

    有19位网友表示赞同!

淡抹烟熏妆丶

这篇文章会不会涉及到爬虫的安全性问题啊?毕竟分布式环境下可能更容易出问题。

    有6位网友表示赞同!

不相忘

希望这篇文章能讲清楚Scrapy的设计理念,以及在开发中需要注意哪些细节。

    有6位网友表示赞同!

百合的盛世恋

我对程序框架很感兴趣,看到这个标题就忍不住想看一看作者的思路和技术运用!

    有17位网友表示赞同!

◆乱世梦红颜

学习爬虫一直是我的兴趣之一,想了解更多高效的方法和技巧,看看这篇文章能否给我启发。

    有13位网友表示赞同!

拉扯

在大型项目的开发中,分布式爬虫显得至关重要吗?希望作者能深入讲解!

    有18位网友表示赞同!

ゞ香草可樂ゞ草莓布丁

了解一下Scrapy的最新版本功能,以及如何结合分布式架构进行开发。

    有18位网友表示赞同!

花容月貌

我关注过Scrapy这款框架,它真的能胜任分布式爬虫的需求吗?

    有16位网友表示赞同!

玩味

想了解一下分布式爬虫与传统爬虫的区别,以及在实际应用中有哪些优势。

    有9位网友表示赞同!

冷眼旁观i

学习分布式开发框架很有用!希望这篇文章能详细讲解Scrapy的应用场景和优势。

    有16位网友表示赞同!

【Scrapy分布式爬虫系统构建与实施指南】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活

上一篇:五大正规手机任务赚钱平台推荐:高效赚钱软件大盘点! 下一篇:《江淮月顾瑾深白薇薇》三年追忆:结局揭晓与感人番外篇