Scrapy-Redis项目的搭建和部署

Scrapy-Redis项目的搭建和部署

Scrapy-Redis项目的引入

scrapy是爬虫框架,但是只能在一台机器上运行程序。假如数据量特别多,一台机器就不够用了,那么就要多台机器一起配合使用,多台机器同时运行程序,共同爬数据,所以引入了Scrapy-Redis框架。

Scrapy-Redis项目基本原理

多台机器同时爬数据最关键的问题是urls的调度问题,调度问题没控制好,可能导致重复爬取或者有遗漏。
Scrapy-Redis框架有一台主机Master,专门用来管理urls。这里就要引入redis数据库了,redis数据库是基于内存的,速度快,且封装性好。所以用redis来管理urls。我们把要爬取的urls放入redis中,并做去重处理,每爬取一个url,就把这url从redis中删除,最后redis中没有url就表明爬虫完成。其他从机Slave要做的是从主机的redis获取url,然后运行爬虫程序。

Scrapy项目转换成Scrapy-Redis项目

基于上面的原理,可以知道,准备工作:主机Master要安装redis数据库,从机要安装Scrapy-Redis依赖库,并且从机要先写好了一个Scrapy项目。

ubuntu中redis数据库安装

云服务器是基于ubuntu的
sudo apt-get -y install redis-server
运行完后,redis就安装成功了。
可以输入redis-cli来测试是否成功。
但是,现在虽然redis安装成功了,但是只能本机IP访问,无法远程连接。所以要修改一些配置。
vim /etc/redie/redis.conf
注释掉 bind 127.0.0.1 这一行
然后重启Redis服务
sudo /etc/init.d/redis-server restart

安装redis-desktop-manager

redis是安装在云服务器上的,我们要访问的话,如果每次都要打开云服务器很麻烦,所以在自己本机上安装redis-desktop-manager来访问redis是比较方便的。
自己电脑是windows的,安装exe文件一路next下去即可。
安装完成之后发现redis数据库还是连接不上。这是因为云服务器的保护机制,你需要在阿里云服务器后台配置中打开端口。redis端口默认是6379,所以在防火墙设置中,添加一条规则,把6379端口号输入进去就行了。

安装Scrapy-Redis框架

这个在自己机器上安装就行 pip install scrapy-redis

修改scrapy项目

以上准备工作做完后,就可以开始修改scrapy项目了。

在spider文件中修改:

  • 把scrapy.Spider改成scrapy_redis.spiders.RedisSpider
  • 注释掉start_urls
  • 添加 redis_key参数 如 redis_key = 'douban:start_url'这个参数就是后面在redis中要添加的key的名称

在setting文件中的修改:

  • 增加 SCHEDULER = ‘scrapy_redis.scheduler.Scheduler’
  • 增加 DUPEFILTER_CLASS = ‘scrapy_redis.dupefilter.RFPDupeFilter’
  • 增加 SCHEDULER_PERSIST = True
  • 可选操作 注册pipelines,使得yield的item能够存储在redis中  ‘scrapy_redis.pipelines.RedisPipeline’: 300
  • 配置redis参数
REDIS_HOST = '服务器ip'    
REDIS_PORT = 6379    
REDIS_ENCODING = 'utf8'
运行

通过上面的修改就完成了scrapy项目到scrapy_redis项目的转变。
那么怎么运行呢?
在scrapy-redis项目的根目录下,打开命令符,输入:
scrapy crawl 你的爬虫spider名称
这个时候爬虫程序已经开始运行了,并且一直在等待中,但是发现没有数据出现,因为你还没有在redis中数据并没有给一个起始url。
远程登录到ubuntu系统中,打开redis-cli,输入:
lpush douban:start_url 要爬取的网址
然后你就会发现数据开始被采集了。

部署

根据上面的步骤,已经搭建起了一个分布式爬虫,多台机器可以同时运行程序。但是这又引入了一个问题:如果说要多台机器一起爬虫,那么每个机器都要安装python,并且都要复制一份项目代码,这样每修改一次代码,每台机器都得重新再复制一次。
为了避免这样的麻烦,引入了scrapyd框架。那么scrapyd是怎么避免这个问题的呢?与其把项目放在每个机器上,还不如把项目打包,将运行程序egg文件放在服务器上,然后提供一些接口,自己本机调用接口就可以在本机跑程序。

ubuntu安装scrapyd

pip install scrapyd
安装完了之后还要做一些配置文件

sudo mkdir /etc/scrapyd
sudo vi /etc/scrapyd/scrapyd.conf

写入:

[scrapyd]
eggs_dir = eggs
[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

然后运行 scrapyd > /dev/null & 可以开启scrapyd程序

本机电脑安装Scrapyd-Client

scrapyd-client可以把程序打包,并将egg程序发送到服务器上
pip install scrapyd-client 即可

本机电脑安装curl程序

scrapyd的一些接口需要curl来调用
安装的话,下载一个安装包,配置下环境变量就行。网上教程很多。

修改部署配置

在scrapy-redis项目根目录,有个scrapy.conf文件,打开

[deploy:test] # 其中test 是deploy名称,可以自己随便写
url = http://服务器ip:6800/
project = doubanmovie # 项目名称
项目部署到服务器

到项目根目录,打开命令符,运行:
scrapyd-deploy test -p doubanmovie
这样就把项目部署到服务器上了。
参数根据自己的情况进行修改。
项目中用到的一些依赖库如BeautifulSoup等,需要在ubuntu系统中安装,使用pip命令即可。

爬虫运行

项目部署上去后,本机怎么运行爬虫呢?
可以打开命令行,使用curl调用接口即可。这些接口文档可以参考scrapyd网站。
如 开启爬虫:

curl http://服务器ip:6800/schedule.json -d project=项目名称 -d spider=爬虫名称

你可能感兴趣的:(Scrapy-Redis项目的搭建和部署)