scrapy分页抓取网页(基于python分布式房源数据系统为数据的进一步应用主题爬虫)

优采云 发布时间: 2022-02-18 09:10

  scrapy分页抓取网页(基于python分布式房源数据系统为数据的进一步应用主题爬虫)

  基于Python的分布式房源数据采集系统为数据的进一步应用,即房源推荐系统提供数据支持。本课题致力于解决单进程单机爬虫的瓶颈,基于Redis分布式多爬虫共享队列创建主题爬虫。本系统使用python开发的Scrapy框架开发,使用Xpath技术提取和解析下载的网页,使用Redis数据库进行分发,使用MongoDb数据库进行数据存储,使用Django web框架和Semantic UI开源框架进行友好可视化数据,最后使用 Docker 部署爬虫。为同城各大城市的租赁平台设计并实现了分布式爬虫系统。

  

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

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

  2.中间件:爬虫防屏蔽中间件网页非200状态处理爬虫下载异常处理

  3.数据存储:抓斗设计数据存储

  4.数据可视化

  完整的项目源代码

  二、系统分布式架构

  分布式采用主从结构,设置一个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-Redis组件开发Scrapy。Scrapy-Redis的总体思路是本项目通过重写Scrapu框架中的scheduler和spider类来实现调度和spider启动。与redis的交互。实现了新的dupefilter和queue类,实现了权重判断和调度容器与redis的交互。由于每台主机上的爬虫进程访问同一个redis数据库,调度和权重判断统一管理,实现分布式分布。爬行动物的目的。

  三、系统实现

  1)爬取策略的设计可以从scrapy的结构分析中看出。网络爬虫从初始地址开始,根据从spider中定义的目标地址获取的正则表达式或者Xpath获取更多的网页链接,加入到待下载队列中,经过去重排序后,等待用于调度程序的调度。在这个系统中,新建的链接可以分为两类,一类是目录页链接,也就是我们平时看到的下一页的链接,另一类是内容详情页链接,也就是我们需要解析网页提取字段链接指向实际的列表信息页面。

  

  这里是master端目标链接的爬取策略。由于是分布式主从模式,master端的爬虫主要抓取下载内容详情页的链接,通过redis将下载任务分享给slave端的其他爬虫。Slave端主要负责进一步解析提取详情页的链接,并存入数据库。本文以58同城为例。初始页面链接,其实就是每个类别的首页链接,主要包括(以广东省几个城市为例):

  

  综上所述,网络资源爬取系统采用以下爬取策略:

  1) 对于Master端:核心模块是解决翻页问题,获取到每个页面的内容详情页面的链接。

  Master端主要采用以下爬取策略:

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

  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) 对于slave端:核心模块是从redis获取下载任务并解析提取字段。Slave端主要采用以下爬取策略:

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

  2. 下载器返回的Response,爬虫根据蜘蛛定义的爬取规则,识别是否有符合该规则的content字段,如果有,将该字段存储并返回给模型,等待数据存储操作。重复步骤 1,直到爬取队列为空,爬虫等待新的链接。

  2)爬虫的具体实现

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

  (1)数据抓取程序数据抓取程序分为Master端和Slave端。数据抓取程序从Redis获取初始地址。数据抓取程序定义抓取网页的规则,使用Xpath提取字段数据 Xpath等的方法,重点介绍从Xpath中提取字符数据的方法。Xapth使用路径表达式来选择web文档中的节点或节点集。Xpath有几种类型:元素、属性、文本、命名空间,处理指令、评论和文档节点。将Web文档视为一棵节点树,树的根节点称为文档节点和根节点,定位目标节点即可提取Web文档的字段数据通过 Xpath 表达式。

  3)去重和增量爬取

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

  

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

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

  (3) 重复第1步。这里我们使用scrapy-redis的去重组件,所以没有实现,但是原理还是有待理解的,具体看源码。

  4)爬虫中间件

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

  它将不断访问 网站 的内容。如果不采取伪装措施,很容易被网站识别为爬虫,系统采用以下方法防止爬虫被拦截:

  

  (a) 模拟不同浏览器行为的实现思路和代码

  原则:

  从scrapy的介绍可以知道scrapy有下载中间件,在其中我们可以自定义请求和响应的处理,类似于spring面向切面的编程,就像程序运行前后嵌入的一个hook。核心是修改请求的属性。首先是扩展下载中间件。首先,将中间件添加到seeings.py。其次,扩展中间件,主要是写一个useragent列表,保存常用的浏览器请求头。作为一个列表。

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

  

  总之,每次发出请求时,都会使用不同的浏览器访问目标网站。

  (b) 使用代理ip进行爬取的实现思路和代码。首先在seeings.py中添加中间件,展开下载组件请求的头文件,从代理ip池中随机抽取一个代理值,然后下载到下载器中。

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

  

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

  湾。存储并验证代理 ip

  C。通过存储到数据库中进行身份验证

  d。如果达到最大ip数,停止爬取,一定时间后验证数据ip的有效性,删除无效ip。直到数据库ip小于0,继续爬取ip,重复步骤a。

  代理ip爬虫运行截图:

  

  (c) 爬虫异常状态组件的处理 当爬虫没有被阻塞并运行时,对网站的访问并不总是200请求成功,而是有多种状态,比如上面的爬虫被禁止时,实际上返回的状态是302,通过捕获302的状态来实现预防屏蔽组件。同时异常状态的处理有利于爬虫的健壮性。设置中的扩展中间件捕获异常后,将请求重新加入待下载队列的过程如下:

  

  d) 数据存储模块 数据存储模块主要负责存储slave端爬取和解析的页面。数据使用 Mongodb 存储。Scrapy 支持 json、csv、xml 等数据存储格式。用户可以在运行爬虫时设置,例如:scrapy crawl spider -o items.json -t json,也可以在Scrapy项目文件和ItemPipline文件中定义。同时Scrapy还支持数据库存储,比如Monogdb、Redis等,当数据量大到一定程度时,可以使用Mongodb或者Reids的集群来解决问题。本系统的数据存储如下图所示:

  

  (g) 数据可视化设计 数据可视化其实就是将数据库中的数据转换成便于我们用户观察的形式。系统使用MongoDB存储数据。数据的可视化基于Django+Semantiui,效果如下图所示:

  

  

  四、系统部署

  因为分布式部署所需的环境都差不多,如果一个服务器部署程序需要配置环境,就很麻烦了。这里使用docker镜像来部署爬虫,使用Daocloud上的scrapy-env来部署程序。部署。系统以58同城租赁平台为抓拍目标。运行十个小时后,它继续在网络上捕获数以万计的列表。

  国产优质动态IP。老化时间2-10分钟,注册即可免费领取10000个代理IP。注册地址: PC:

  移动

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线