scrapy是爬虫框架,但是只能在一台机器上运行程序。假如数据量特别多,一台机器就不够用了,那么就要多台机器一起配合使用,多台机器同时运行程序,共同爬数据,所以引入了Scrapy-Redis框架。
多台机器同时爬数据最关键的问题是urls的调度问题,调度问题没控制好,可能导致重复爬取或者有遗漏。
Scrapy-Redis框架有一台主机Master,专门用来管理urls。这里就要引入redis数据库了,redis数据库是基于内存的,速度快,且封装性好。所以用redis来管理urls。我们把要爬取的urls放入redis中,并做去重处理,每爬取一个url,就把这url从redis中删除,最后redis中没有url就表明爬虫完成。其他从机Slave要做的是从主机的redis获取url,然后运行爬虫程序。
基于上面的原理,可以知道,准备工作:主机Master要安装redis数据库,从机要安装Scrapy-Redis依赖库,并且从机要先写好了一个Scrapy项目。
云服务器是基于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是安装在云服务器上的,我们要访问的话,如果每次都要打开云服务器很麻烦,所以在自己本机上安装redis-desktop-manager来访问redis是比较方便的。
自己电脑是windows的,安装exe文件一路next下去即可。
安装完成之后发现redis数据库还是连接不上。这是因为云服务器的保护机制,你需要在阿里云服务器后台配置中打开端口。redis端口默认是6379,所以在防火墙设置中,添加一条规则,把6379端口号输入进去就行了。
这个在自己机器上安装就行 pip install scrapy-redis
以上准备工作做完后,就可以开始修改scrapy项目了。
在spider文件中修改:
redis_key = 'douban:start_url'
这个参数就是后面在redis中要添加的key的名称在setting文件中的修改:
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文件放在服务器上,然后提供一些接口,自己本机调用接口就可以在本机跑程序。
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可以把程序打包,并将egg程序发送到服务器上
pip install scrapyd-client 即可
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=爬虫名称