前言
分布式爬虫,总归是要上到服务器的。
这里先讲解如何在服务器上配置和部署scrapyd,主要的点还是在scrapyd和redis的conf配置文件上。其实到末尾我已经实现了分布式,本机的爬虫访问远程redis,从里面拿数据,但是由于是测试,没有放入start_urls,所以也没有启动并爬出结果,但是redis远程连接确实是做到了。下一篇结合Docker再搭建分布式爬虫。
环境配置
为了从头配置,我在阿里云上重新更换了纯净的Centos7.4,新盘,什么都没有。
创建环境
这里比较简单,参考自己写的《Aliyun-安装Anaconda记录 》就可以成功安装Anaconda了
创建环境的话用命令:
conda create --name pspiders python=3.6
创建一个名为pspiders并且版本是python3.6的虚拟环境。
进入环境的命令:
source activate pspiders
当前面出现(pspiders)
(pspiders) [root@iZqmg63rkase8aZ SRspider]#
就代表着成功进入了虚拟环境。
安装scrapyd
首先,通过本地sftp将写好的代码上传到服务器,我这里是新建目录SRspider,然后将代码上传到目录中。
然后cd进入SRspider目录,与.cfg文件同目录内,通过命令开启虚拟环境:
source activate pspiders
然后安装scrapyd以及scrapd-client
(pspiders) [root@ixxx SRspider]# pip install scrapyd
(pspiders) [root@ixxx SRspider]# pip install scrapyd-client
这样就完成了他们的安装。
导入环境依赖
接着导入本地机器的依赖包,在本地的虚拟环境下,通过命令导出requirements.txt:
pip freeze > requirements.txt
就会在当前目录下生成此文件,打开后将文件内容复制,并在服务器的虚拟环境下vim新建同名文件,写入内容(刚才导出的文件内容):
six==1.11.0
Twisted==17.9.0
urllib3==1.22
w3lib==1.18.0
you-get==0.4.1011
zope.interface==4.4.3
……
……
……
这里面记录的就是之前的虚拟环境的依赖,如果不导入的话,就要手动在虚拟环境下通过pip安装这些依赖(建议导入)。
然后在服务器通过命令:
pip install -r requirements.txt
安装依赖,可以看到它依次下载并安装。
服务器安装redis
这个比较简单:
yum install redis
跟着提示就行了,然后用命令启动redis:
service redis start
设置为开启启动的话:
chkconfig redis on
配置scrapyd远程访问
到这里,scrapyd也安装好了、依赖也装好了、代码也上传了、redis也安装好了,是不是可以打包然后就开启scrapyd服务了呢?
当初我也是这么认为的,直到scrapyd启动服务后,在浏览器打开http://59.110.xxx.xxx:6800,但是始终无法访问,这个问题困扰了很久,后来在群里面有人告诉我应该开启阿里云安全组配置(我去检查了,我已经开启6800端口),又有人说scrapyd默认绑定地址是127.0.0.1,要将它绑定的地址改为0.0.0.0就可以开启外部访问了。文件路径是在:
/root/anaconda3/envs/pspiders/lib/python3.6/site-packages/scrapyd
下面有一个default_scrapyd.conf 文件,vi打开后找到里面有一句:
bind_address = 127.0.0.1
将它改成0.0.0.0保存,就可以远程访问了。
这时候到SRspider目录下打开虚拟环境,然后输入命令scrapyd启动它,再用浏览器打开就可以访问到了。
配置redis远程访问
redis同样,默认设定是本地访问,如果想开启远程访问就要改动bind
但是为了安全起见(redis默认没有密码,开启远程后别人可以操作),就需要给redis设置密码,通过命令redis-cli启动redis的命令行:
[root@iZqmg63rkase8aZ scrapyd]# redis-cli
127.0.0.1:6379>
然后查看是否有密码:
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) ""
127.0.0.1:6379>
如果是密码为空,则需要设置密码:
CONFIG set requirepass "ranbos"
再次查看的时候就会提示需要密码:
(error) NOAUTH Authentication required.
用命令登录:
auth ranbos
即可登录。这里就完成了密码的设置,通过命令quit退出命令行。下面更改bind
进入redis.conf目录下(默认在/etc下):
cd /etc
然后用ls查看目录下的文件,发现有redis.conf文件
用vim打开它,找到里面的bind:
bind 127.0.0.1
将它改为:
#bind 127.0.0.1
bind 0.0.0.0
我怕有错,所以先注释127.0.0.1,然后添加bind0.0.0.0
然后重启redis:
service redis restart
就可以了,redis可以远程访问了。
连接redis的代码
但是写代码的时候如何连接呢?
这里有区分master和slaver,如果是主机,就在settings.py中增加连接配置:
# 指定redis数据库的连接参数
REDIS_HOST = "127.0.0.1"
REDIS_PORT = "6379"
REDIS_PARAMS ={
'password': 'ranbos',
}
主机就连接本地127.0.0.1的redis就行了,写上端口号和密码。
如果是slaver端,同样是这么设置,然后将REDIS_HOST改为服务器ip即可,比如我的deepin机器就这么配置:
REDIS_HOST = "59.110.xxx.xxx"
REDIS_PORT = "6379"
REDIS_PARAMS ={
'password': 'ranbos',
}
这样就完成了所有的配置,现在去开启服务测试。
测试
首先,在服务器上开启scrapyd服务(在项目工程.cfg同目录进入虚拟环境):
source avticate pspiders
接着开启scrapyd服务:
scrapyd
会收到如下信息:
(pspiders) [root@iZqmg63rkase8aZ SRspider]# scrapyd
2018-01-23T12:56:27+0800 [-] Loading /root/anaconda3/envs/pspiders/lib/python3.6/site-packages/scrapyd/txapp.py...
2018-01-23T12:56:27+0800 [-] Scrapyd web console available at http://0.0.0.0:6800/
2018-01-23T12:56:27+0800 [-] Loaded.
2018-01-23T12:56:27+0800 [twisted.scripts._twistd_unix.UnixAppLogger#info] twistd 17.9.0 (/root/anaconda3/envs/pspiders/bin/python 3.6.4) starting up.
2018-01-23T12:56:27+0800 [twisted.scripts._twistd_unix.UnixAppLogger#info] reactor class: twisted.internet.epollreactor.EPollReactor.
2018-01-23T12:56:27+0800 [-] Site starting on 6800
2018-01-23T12:56:27+0800 [twisted.web.server.Site#info] Starting factory <twisted.web.server.Site object at 0x7f05aea75d68>
2018-01-23T12:56:27+0800 [Launcher] Scrapyd 1.2.0 started: max_proc=4, runner='scrapyd.runner'
代表服务正常开启,服务开启后再开启一个窗口,连接到服务器。然后也是进入虚拟环境,到.cfg同目录下,打包代码,发送到:
scrapyd-deploy SRspider -p Jobbole
如果成功就会返回信息:
(pspiders) [root@iZqmg63rkase8aZ SRspider]# scrapyd-deploy SRspider -p Jobbole
Packing version 1516683538
Deploying to project "Jobbole" in http://localhost:6800/addversion.json
Server response (200):
{"node_name": "iZqmg63rkase8aZ", "status": "ok", "project": "Jobbole", "version": "1516683538", "spiders": 1}
就代表打包成功,打开页面即可看到:
然后通过命令启动爬虫,开始爬取:
curl http://localhost:6800/schedule.json -d project=Jobbole -d spider=jobbole
最后通过Log可以查看到爬虫的运行情况