c爬虫抓取网页数据( 分布式网络数据抓取系统说明()应用)

优采云 发布时间: 2022-03-21 12:02

  c爬虫抓取网页数据(

分布式网络数据抓取系统说明()应用)

  分布式网络数据采集系统的设计与实现

  1、分布式网络数据采集系统说明

  (1)深入分析网络数据(金融、教育、汽车)爬虫特性,设计分布式网络数据(金融、教育、汽车)系统爬取策略、爬取领域、动态网页抓取方法、分布式结构和数据存储等功能。

  (2)简述分布式网络数据(金融、教育、汽车)抓取系统的实现流程。包括爬虫编写、爬虫规避(各种反爬方式)、动态网页数据抓取、数据存储等。

  (3)需要爬取的网络数据网站的自定义配置网页模板,以及数据抓取(接口暂不考虑)

  2、系统功能架构设计

  

  系统功能架构

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

  1。爬虫功能:爬取策略设计、内容数据域设计、增量爬取、请求去重

  2。中间件:反爬机制、ajax动态数据加载、爬虫下载异常处理

  3。数据存储:抓图设计、数据存储

  3、系统分布式架构

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

  

  分布式爬虫架构

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

  4、系统实现

  4.1、爬取策略设计

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

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

  

  爬取过程

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

  1)对于大师:

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

  1.将redis的初始链接插入到key next_link,从初始页面链接开始

  2.爬虫从redis中的key next_link获取初始链接,开始运行爬虫

  3.下载器返回的Response,爬虫根据蜘蛛定义的爬取规则识别是否有下一页的链接。如果有链接,则存储在redis中,key保存为next_link。它匹配多个内容详细信息页面链接。如果匹配,则存储在Redis中,并将key保存为detail_request并插入下载链接,供slave端的spider使用,也就是slave端的下载任务。

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

  2)对于奴隶:

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

  1。爬虫从redis获取初始链接,key为detail_request,开始运行爬虫

  2。下载器返回的Response,爬虫根据爬虫定义的爬取规则识别是否有匹配规则的content字段,如果有则存储该字段返回给模型,等待数据存储操作。

  重复第 1 步,直到爬取队列为空,爬虫等待新的链接。

  4.2爬虫的具体实现

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

  数据抓取程序:

  数据爬取程序分为主端和从端。数据爬取程序从 Redis 获取初始地址。数据爬取程序定义了爬取网页的规则,使用Xpath提取字段数据的方法,以及css选择器选择器。数据提取方法等

  4.3 去重和增量爬取

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

  具体实现步骤:

  

  去重和增量爬取

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

  (2)会判断要请求的url是否被爬取,如果已经被爬取则忽略该请求,不被爬取,继续其他操作,将url插入到被爬取队列中

  (3)重复步骤 1

  4.4个爬虫中间件

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

  (1)履带防屏蔽组件的实现

  当访问一个网站网页时,会给网站带来一定的负载,爬虫程序模拟了我们正常访问网页的过程,但是。大型爬虫会给网站增加很大的负载,影响正常用户的访问。为了保证大部分普通用户可以访问网页,大部分网站都有相应的反爬策略。一旦访问行为被识别为爬虫,网站会采取一定的措施限制你的访问,比如访问过于频繁会提示你输入验证码。您访问 网站。当系统有针对性的抓取网页数据时,会不断的访问网站的内容。如果不采取伪装措施,很容易被网站识别为爬虫行为而被屏蔽。

  系统使用以下方法防止爬虫被拦截:

  1.模拟不同的浏览器行为

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

  3.降低爬取网页的频率,减少并发爬取的进程,限制每个ip的并发爬取数量,牺牲一定的效率来换取系统的稳定性。

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

  反爬虫网站屏蔽原理如下图所示:

  

  反网站屏蔽原理

  (a) 模拟不同浏览器行为的想法和代码

  原理:scrapy有下载中间件,在这个中间件中我们可以自定义请求和响应,核心是修改请求的属性

  首先,主要是扩展下载中间件。首先在seeings.py中添加中间件并展开中间件,主要是写一个user-agent列表,将常用的浏览器请求头保存为列表,然后让请求头文件在列表中随机取一个代理值,并然后下载到下载器中。

  

  用户代理

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

  (b)使用代理ip进行爬取的实现思路。

  首先在settings.py中添加中间件,扩展下载组件请求的头文件从代理ip池中随机取一个代理值下载到下载器中。

  1.代理ip池的设计开发流程如下:

  

  一个。爬取免费代理ip网站.

  b.存储并验证代理ip

  c。身份验证通过存储方式存储在数据库中

  d。如果验证失败,删除它

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

  当爬虫没有被阻塞并运行时,访问网站并不总是200请求成功,而是有多种状态,比如上面的爬虫被禁止时,返回的状态实际上是302,防止屏蔽组件是通过捕获302状态来实现的。同时异常状态的处理有利于爬虫的健壮性。

  设置中的扩展中间件捕捉到异常后,重新将请求加入待下载队列的过程如下:

  

  异常处理

  (d) 数据存储模块

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

  Scrapy支持json、csv、xml等数据存储格式,用户可以在运行爬虫时设置,例如:scrapy crawl spider

  -o items.json -t json,也可以在Scrapy项目文件和ItemPipline文件中定义。同时Scrapy还支持数据库存储,比如Mongodb、Redis等,当数据量大到一定程度时,可以做Mongodb或者Reids的集群来解决问题,这个的数据存储系统如下图所示:

  

  数据存储

  5.总结

  以上是分布式网络数据爬取系统的设计部分。由于单机爬虫的爬取量和爬取速度的限制,采用分布式设计。这是V1.0版本,以后会跟进。继续完善相关部分。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线