简易分布式爬虫系统

目录

一、项目介绍

二、系统设计

三、系统核心模块说明

3.1. 爬虫功能

3.2. 中间件

3.3. 数据存储

3.4. 数据可视化

四、项目基本配置

关于配置远程连接的具体操作:

4.1.Windows下配置redis远程访问

4.2 虚拟机的爬虫文件要设定成master机的ip地址

4.3 修改redis.windows.conf文件后,虚拟机下仍然出现redis.exceptions.ResponseError的错误

五、项目运行流程

5.1.运行分布式爬虫步骤

5.2.将数据保存进mongodb的步骤

5.3.利用网页进行收集数据的可视化展示

六、项目优化 

七、参考文献 


一、项目介绍

随着互联网高速发展,海量信息爬取用于不同场景中,分布式爬虫系统广泛应用于大型爬虫项目中,面对海量待抓取网页,采用分布式架构,能在较短时间内完成抓取工作,多台机器同时爬取数据获取效率更高。本项目中的分布式爬虫系统,主要借助pycharm开发工具开发的简易分布式爬虫系统。分布式的实现主要依赖scrapy-redis,主从分布式爬虫。redis数据库用作数据持久化操作与消息队列。数据的存储采用MongoDB数据库。数据的可视化主要由Flask、Echart、WorldCloud等技术。

技术栈

  • Python 
  • Scrapy 
  • Scrapy-redis 
  • MongoDB 
  • Redis 
  • 前端:jinja2、Echarts

二、系统设计

python 分布式豆瓣电影数据抓取系统,为电影推荐系统做数据支持。分布式采用主从结构设置一个Master服务器和多个Slave服务器,Master端管理Redis数据库和分发下载任务,Slave部署Scrapy爬虫提取网页和解析提取数据,最后将解析的数据存储在同一个MongoDb数据库中。

 

  • master控制节点:负责管理所有slave,包括 slave 连接、任务调度、分发,维护爬取队列、 收取 salve 上传的数据,存储目标数据,新 URL 链接去重,新任务添加等、结果回收、汇总;
  • slave爬虫节点: 负责从 master 领取任务,并独自完成、本节点爬虫调度、数据抓取、HTML下载管理、数据处理、内容解析(解析包括目标数据和新的URL链接)、数据存储、上传结果;

三、系统核心模块说明

3.1. 爬虫功能

  • 爬取策略的设计:由scrapy的结构分析可知,网络爬虫从初始地址开始,根据spider中定义的目标地址获的Xpath获得更多的网页链接,并加入到待下载队列当中,进行去重和排序之后,等待调度器的调度。在系统中,新的链接可以分为两类,一类是目录页链接,即下一页链接,一类是内容详情页链接,即需要解析网页提取字段的链接,指向的就是实际的电影信息页面。网络需从每一个目录页链接当中,提取到多个内容页链接,加入到待下载队列准备进一步爬取。

  • 去重与增量爬取:对服务器有重大意义,减少服务器的压力及保证数据的准确性。如果不采取去重处理,那么抓取的内容会抓取大量重复内容,让爬虫效率极大的下降。去重流程的核心就是,每次请求的时候,先判断这个请求是否在已经爬取的队列当中。如果已存在,则舍弃当前请求。

3.2. 中间件

访问一个网站网页时,会给网站带来一定负载,而爬虫程序则模拟了我们正常访问网页的过程,但大规模的爬虫会给网站增加大量的负载,影响正常用户的访问。因此,大多数网站都有相应的防爬虫策略。一旦访问行为被认定为爬虫,网站将会采取一定的措施,限制访问。中间件作为爬虫防屏蔽组件,可以实现反反爬虫。

  • 站内请求:本系统定向抓取网页数据的时候,将不间断的访问网站内容,如果不采取伪装措施,很容易被网站识别为爬虫行为而屏蔽掉。因此本系统在请求页面时,伪装成站内请求,用以反反爬虫。
  • IP代理:同一个IP针对一个网站短时间内大量的访问通常会导致IP被封,为解决这个问题,可以使用代理IP,解决IP被封的问题。
  • 动态User-Agent:设置随机 UA 来伪装请求头是一种常用的反反爬虫方式,这能够在一定程度上避免网站直接识别出爬虫,从而被封。

3.3. 数据存储

数据存储模块主要负责将slave端爬取解析的页面进行存储。使用Mongodb对数据进行存储。 Scrapy支持数据存储的格式有json,csv和xml等文本格式,用户可以在运行爬虫时设置,同时,Scrapy也支持数据库存储,如Monogdb,Redis等,当数据量大到一定程度时,可以做Mongodb或者Reids的集群来解决问题。

3.4. 数据可视化

数据的可视化即将数据库的数据转换成用户容易观察的形式,本系统使用Mongodb对数据进行存储,采用Flask、Echarts、WordCloud等技术实现可视化界面和可视化数据分析结果。

四、项目基本配置

项目整体基于分布式的思想设计,分为主机端代码从机端代码。


一台master机,一台slave机,本文使用的master是我的笔记本(Windows),而slave是我的虚拟机(CentOS7)
两台机都安装了Python3.8、Scrapy框架、Scrapy-Redis框架
在master机上安装Redis数据库,并配置好能够远程连接

关于配置远程连接的具体操作:

4.1.Windows下配置redis远程访问

由于Redis默认只允许本地访问,要使Redis可以远程访问,需修改redis对应的配置文件

redis.windows.conf

1.将bind修改为0.0.0.0 或者 注释掉 本地连接对应的 bind

2.修改protected-mode为no(默认为yes)

4.2 虚拟机的爬虫文件要设定成master机的ip地址

用windows+R,输入cmd,在命令行中输入”ipconfig“

即可查看

4.3 修改redis.windows.conf文件后,虚拟机下仍然出现redis.exceptions.ResponseError的错误

具体报错代码如下:

redis.exceptions.ResponseError: DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients.  In this mode connections are only accepted from the loopback interface.  If you want to connect from external computers to Redis you may adopt one of the following solutions: 1) Just disable protected mode sending the command 'CONFIG SET protected-mode no' from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so.  Use CONFIG REWRITE to make this change permanent.  2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to 'no', and then restarting the server.  3) If you started the server manually just for testing, restart it with the '--protected-mode no' option.  4) Setup a bind address or an authentication password.  NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside.

Redis运行在保护模式下,因为启用了保护模式,没有指定绑定地址,没有向客户端请求认证密码。在这种模式下,只接受来自环回接口的连接。如果你想从外部计算机连接到Redis,你可以采用以下解决方案之一:1)只需禁用保护模式,通过从服务器运行的同一主机连接到Redis,从环回接口发送命令'CONFIG SET protected-mode no',但是确保Redis不能从互联网上公开访问。使用CONFIG REWRITE使此更改永久生效。2)或者你可以通过编辑Redis配置文件禁用保护模式,并将保护模式选项设置为“no”,然后重新启动服务器。3)如果您手动启动服务器只是为了测试,请使用“——protected-mode no”选项重新启动服务器。4)设置绑定地址或认证密码。注意:您只需要执行上面的一项操作,服务器就可以开始接受来自外部的连接。

我根据它的提示在redis-cli客户端里输入

 

即刻运行成功 

五、项目运行流程

5.1.运行分布式爬虫步骤

1.在master机上开启redis服务端,即在控制台运行命令:redis-server,或者以指定配置文件的方式来启动:redis-server.exe redis.windows.conf

2.在master机上的另一个终端上进入redis客户端,即在控制台运行命令:redis-cli,之后如果你的redis设置了密码,那么再输入:auth 你的密码,然后才能继续操作redis数据库

3.分别运行两台机的爬虫项目(不分先后,随意即可),运行的命令是:

scrapy crawl douban_redis

(在有scrapy.cfg文件的目录下进入cmd命令),此时两台机都是处于监听的状态中

启动之后,不会立即爬取内容,因为在redis中还没有"任务"

 

4.在master机的redis客户端中,输入:

lpush douban:start_urls https://movie.douban.com/top250?start=0&filter=

之后,会看到两台机都开始跑起来了!

 

我们这里是手动推送一个链接到redis。对于爬虫在执行的过程中,也会抛出itemrequest,抛出的request则会推送至redis

5.2.将数据保存进mongodb的步骤

运行master下的main.py,即可将数据存储进MongoDB。

5.3.利用网页进行收集数据的可视化展示

运行FlaskProject下的app.py,进行数据处理,数据的可视化展示

六、项目优化 

1.怎么做到URL分发模块故障后可以自动拉起并快速恢复?

2.若爬虫节点发生故障,如何才能再次启动爬虫时,能够恢复之前爬取的数据,而不是从头开始爬取?(3.1去重与增量爬取)

七、参考文献 

python爬虫:scrapy-redis分布式爬虫(详细版)_Acheng1011的博客-CSDN博客_scrapy-redis分布式爬虫

【Scrapy学习心得】爬虫实战五(Scrapy-Redis分布式爬虫)_七里香还是稻香的博客-CSDN博客_scrapy项目实践感想 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值