摘要:分布式爬虫,分发网址是基于地址。注意要使用管理同一个集群,爬虫项目名称须一致,同时集群中配置相同任务浏览器访问启动爬虫时即可看见两个集群配置,启动同名爬虫开始分布式爬虫启动分布式爬虫后状态
Scrapy-cluster 建设
基于Scrapy-cluster库的kafka-monitor可以实现分布式爬虫
Scrapyd+Spiderkeeper实现爬虫的可视化管理
环境IP | Role |
---|---|
168.*.*.118 | Scrapy-cluster,scrapyd,spiderkeeper |
168.*.*.119 | Scrapy-cluster,scrapyd,kafka,redis,zookeeper |
# cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) # python -V Python 2.7.5 # java -version openjdk version "1.8.0_181" OpenJDK Runtime Environment (build 1.8.0_181-b13) OpenJDK 64-Bit Server VM (build 25.181-b13, mixed mode)Zookeeper 单机配置
下载并配置
# wget http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.4.13/zookeeper-3.4.13.tar.gz # tar -zxvf zookeeper-3.4.13.tar.gz # cd zookeeper-3.4.13/conf # cp zoo_sample.cfg zoo.cfg # cd .. # PATH=/opt/zookeeper-3.4.13/bin:$PATH # echo "export PATH=/opt/zookeeper-3.4.13/bin:$PATH" > /etc/profile.d/zoo.sh
单节点启动
# zkServer.sh status ZooKeeper JMX enabled by default Using config: /opt/zookeeper-3.4.13/bin/../conf/zoo.cfg Error contacting service. It is probably not running. # zkServer.sh startkafka 单机配置
下载
# wget http://mirrors.hust.edu.cn/apache/kafka/2.0.0/kafka_2.12-2.0.0.tgz # tar -zxvf kafka_2.12-2.0.0.tgz # cd kafka_2.12-2.0.0/
配置
# vim config/server.properties ############################# Server Basics ############################# # The id of the broker. This must be set to a unique integer for each broker. broker.id=0 # kafka的机器编号, host.name = 168.*.*.119 # 绑定ip port=9092 # 默认端口9092, # Switch to enable topic deletion or not, default value is false delete.topic.enable=true ############################# Zookeeper ############################# zookeeper.connect=localhost:2181
启动
nohup bin/kafka-server-start.sh config/server.properties &
停止命令bin/kafka-server-stop.sh config/server.properties
redis 单机配置安装配置
# yum -y install redis # vim /etc/redis.conf bind 168.*.*.119
启动
# systemctl start redis.servicescrapy-cluster 单机配置
# git clone https://github.com/istresearch/scrapy-cluster.git # cd scrapy-cluster # pip install -r requirements.txt
离线运行单元测试,以确保一切似乎正常
# ./run_offline_tests.sh
修改配置
# vim kafka-monitor/settings.py # vim redis-monitor/settings.py # vim crawlers/crawling/settings.py
修改以下
# Redis host configuration REDIS_HOST = "168.*.*.119" REDIS_PORT = 6379 REDIS_DB = 0 KAFKA_HOSTS = "168.*.*.119:9092" KAFKA_TOPIC_PREFIX = "demo" KAFKA_CONN_TIMEOUT = 5 KAFKA_APPID_TOPICS = False KAFKA_PRODUCER_BATCH_LINGER_MS = 25 # 25 ms before flush KAFKA_PRODUCER_BUFFER_BYTES = 4 * 1024 * 1024 # 4MB before blocking # Zookeeper Settings ZOOKEEPER_ASSIGN_PATH = "/scrapy-cluster/crawler/" ZOOKEEPER_ID = "all" ZOOKEEPER_HOSTS = "168.*.*.119:2181"
启动监听
# nohup python kafka_monitor.py run >> /root/scrapy-cluster/kafka-monitor/kafka_monitor.log 2>&1 & # nohup python redis_monitor.py >> /root/scrapy-cluster/redis-monitor/redis_monitor.log 2>&1 &scrapyd 爬虫管理工具配置
安装
# pip install scrapyd
配置
# sudo mkdir /etc/scrapyd # sudo vi /etc/scrapyd/scrapyd.conf
[scrapyd] eggs_dir = eggs logs_dir = logs items_dir = jobs_to_keep = 5 dbs_dir = dbs max_proc = 0 max_proc_per_cpu = 10 finished_to_keep = 100 poll_interval = 5.0 bind_address = 0.0.0.0 http_port = 6800 debug = off runner = scrapyd.runner application = scrapyd.app.application launcher = scrapyd.launcher.Launcher webroot = scrapyd.website.Root [services] schedule.json = scrapyd.webservice.Schedule cancel.json = scrapyd.webservice.Cancel addversion.json = scrapyd.webservice.AddVersion listprojects.json = scrapyd.webservice.ListProjects listversions.json = scrapyd.webservice.ListVersions listspiders.json = scrapyd.webservice.ListSpiders delproject.json = scrapyd.webservice.DeleteProject delversion.json = scrapyd.webservice.DeleteVersion listjobs.json = scrapyd.webservice.ListJobs daemonstatus.json = scrapyd.webservice.DaemonStatus
启动
# nohup scrapyd >> /root/scrapy-cluster/scrapyd.log 2>&1 &
建议做Nginx反向代理
启动异常
File "/usr/local/lib/python3.6/site-packages/scrapyd-1.2.0-py3.6.egg/scrapyd/app.py", line 2, infrom twisted.application.internet import TimerService, TCPServer File "/usr/local/lib64/python3.6/site-packages/twisted/application/internet.py", line 54, in from automat import MethodicalMachine File "/usr/local/lib/python3.6/site-packages/automat/__init__.py", line 2, in from ._methodical import MethodicalMachine File "/usr/local/lib/python3.6/site-packages/automat/_methodical.py", line 210, in class MethodicalInput(object): File "/usr/local/lib/python3.6/site-packages/automat/_methodical.py", line 220, in MethodicalInput @argSpec.default builtins.TypeError: "_Nothing" object is not callable Failed to load application: "_Nothing" object is not callable
解决:Automat降级
pip install Automat==0.6.0Spiderkeeper 爬虫管理界面配置
安装
pip install SpiderKeeper
启动
mkdir /root/spiderkeeper/ nohup spiderkeeper --server=http://168.*.*.118:6800 --username=admin --password=admin --database-url=sqlite:////root/spiderkeeper/SpiderKeeper.db >> /root/scrapy-cluster/spiderkeeper.log 2>&1 &
浏览器访问http://168.*.*.118:5000
使用Spiderkeeper 管理爬虫 使用scrapyd-deploy部署爬虫项目修改scrapy.cfg配置
vim /root/scrapy-cluster/crawler/scrapy.cfg
[settings] default = crawling.settings [deploy] url = http://168.*.*.118:6800/ project = crawling
添加新的spider
cd /root/scrapy-cluster/crawler/crawling/spider
使用scrapyd-deploy部署项目
# cd /root/scrapy-cluster/crawler # scrapyd-deploy Packing version 1536225989 Deploying to project "crawling" in http://168.*.*.118:6800/addversion.json Server response (200): {"status": "ok", "project": "crawling", "version": "1536225989", "spiders": 3, "node_name": "ambari"}spiderkeeper 配置爬虫项目
登录Spiderkeeper创建项目
使用scrapy.cfg中配置的项目名
创建后再Spiders->Dashboard中看到所有spider
Scrapy-cluster 分布式爬虫Scrapy Cluster需要在不同的爬虫服务器之间进行协调,以确保最大的内容吞吐量,同时控制集群服务器爬取网站的速度。
Scrapy Cluster提供了两种主要策略来控制爬虫对不同域名的攻击速度。这由爬虫的类型与IP地址确定,但他们都作用于不同的域名队列。
Scrapy-cluster分布式爬虫,分发网址是基于IP地址。在不同的机器上启动集群,不同服务器上的每个爬虫去除队列中的所有链接。
部署集群中第二个scrapy-cluster配置一台新的服务器参照scrapy-cluster 单机配置,同时使用第一台服务器配置kafka-monitor/settings.py redis-monitor/settings.py crawling/settings.py
Current public ip 问题由于两台服务器同时部署在相同内网,spider运行后即获取相同Current public ip,导致scrapy-cluster调度器无法根据IP分发链接
2018-09-07 16:08:29,684 [sc-crawler] DEBUG: Current public ip: b"110.*.*.1"
参考代码/root/scrapy-cluster/crawler/crawling/distributed_scheduler.py第282行:
try: obj = urllib.request.urlopen(settings.get("PUBLIC_IP_URL", "http://ip.42.pl/raw")) results = self.ip_regex.findall(obj.read()) if len(results) > 0: # results[0] 获取IP地址即为110.90.122.1 self.my_ip = results[0] else: raise IOError("Could not get valid IP Address") obj.close() self.logger.debug("Current public ip: {ip}".format(ip=self.my_ip)) except IOError: self.logger.error("Could not reach out to get public ip") pass
建议修改代码,获取本机IP
self.my_ip = [(s.connect(("8.8.8.8", 53)), s.getsockname()[0], s.close()) for s in [socket.socket(socket.AF_INET, socket.SOCK_DGRAM)]][0][1]运行分布式爬虫
在两个scrapy-cluster中运行相同Spider
execute(["scrapy", "runspider", "crawling/spiders/link_spider.py"])
使用python kafka_monitor.py feed投递多个链接,使用DEBUG即可观察到链接分配情况
使用SpiderKeeper管理分布式爬虫 配置scrapyd管理集群第二个scrapy-cluster在第二台scrapy-cluster服务器上安装配置scrapyd,参考scrapyd 爬虫管理工具配置并修改配置
[settings] default = crawling.settings [deploy] url = http://168.*.*.119:6800/ project = crawling
启动scrapyd后使用scrapyd-deploy工具部署两个scrapy-cluster上的爬虫项目。
使用Spiderkeeper连接多个scrapy-cluster重新启动spiderkeeper,对接两个scrapy-cluster的管理工具scrapyd。
nohup spiderkeeper --server=http://168.*.*.118:6800 --server=http://168.*.*.119:6800 --username=admin --password=admin --database-url=sqlite:////root/spiderkeeper/SpiderKeeper.db >> /root/scrapy-cluster/spiderkeeper.log 2>&1 &
注意:要使用spiderkeeper管理同一个集群,爬虫项目名称须一致,同时集群中scrapy-cluster配置相同spider任务
浏览器访问http://168.*.*.118:5000 启动爬虫时即可看见两个scrapy-cluster集群配置,启动同名爬虫开始scrapy-cluster分布式爬虫
启动分布式爬虫后状态
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/42398.html
摘要:前言最近发现了一个的库这个库的主要用途是在于配合这管理你的爬虫支持一键式部署定时采集任务启动暂停等一系列的操作简单来说将的进行封装最大限度减少你跟命令行交互次数不得说这个是很棒的事情的连接环境配置由于是基于以上的版本兼容性较好所以我们需要的 前言 最近发现了一个spdierkeeper的库,这个库的主要用途是在于.配合这scrpyd管理你的爬虫,支持一键式部署,定时采集任务,启动,暂停...
摘要:基于的爬虫分布式爬虫管理平台,支持多种编程语言以及多种爬虫框架。后台程序会自动发现这些爬虫项目并储存到数据库中。每一个节点需要启动应用来支持爬虫部署。任务将以环境变量的形式存在于爬虫任务运行的进程中,并以此来关联抓取数据。 Crawlab 基于Celery的爬虫分布式爬虫管理平台,支持多种编程语言以及多种爬虫框架。 Github: https://github.com/tikazyq/...
摘要:,首先把爬虫项目上传到服务器我的服务器架设在公司内网里。部署名会在后面的部署项目环节用到。新项目创建创建完成。,部署项目的文件想要爬虫程序真正进行抓取起来,还有一步。选择文件,部署文件至此,部署爬虫项目就结束了。 1,首先把scrapy爬虫项目上传到服务器 我的服务器架设在公司内网里。所以在这里使用WinSCP作为上传工具。showImg(https://segmentfault....
摘要:在系统正常运行时,可以变更爬虫的配置,一旦实时监控爬虫出现异常,可实时修正配置进行干预。从数据库中实时读取配置信息,响应业务层的配置请求。处理系统通过服务层,每次去取配置信息可能维护人员在实时修正及待抓取的列表进行处理。 showImg(https://segmentfault.com/img/bVLa4V?w=960&h=540); 一 缘起 在我工作的多家公司,有众多的领域,如房...
摘要:包括爬虫编写爬虫避禁动态网页数据抓取部署分布式爬虫系统监测共六个内容,结合实际定向抓取腾讯新闻数据,通过测试检验系统性能。 1 项目介绍 本项目的主要内容是分布式网络新闻抓取系统设计与实现。主要有以下几个部分来介绍: (1)深入分析网络新闻爬虫的特点,设计了分布式网络新闻抓取系统爬取策略、抓取字段、动态网页抓取方法、分布式结构、系统监测和数据存储六个关键功能。 (2)结合程序代码分解说...
阅读 1533·2021-11-25 09:43
阅读 2302·2019-08-30 15:55
阅读 1444·2019-08-30 13:08
阅读 2619·2019-08-29 10:59
阅读 791·2019-08-29 10:54
阅读 1374·2019-08-26 18:26
阅读 2493·2019-08-26 13:44
阅读 2627·2019-08-23 18:36