运行环境
电脑系统:macOS 10.13.6
云服务器: 腾讯云服务器 系统镜像 Ubuntu 16.04.1 LTS
scrapy分布式构建简要步骤
- 在腾讯云服务器上 部署redis服务,使外网可以访问
- 配置scrapy scrapy-redis pymongo
- 部署代码到这台服务器上
代码
代码
分支master 是scrapy爬取知乎代码
分支distributed 是分布式爬取知乎代码代码 区别只是setting.py不太一样
distributed-1.0.0 是项目配置scrapyd scrapyd-client python-scrapyd-api
具体步骤如下
1.在云服务器上配置redis环境
1.1 安装redis服务
在终端上输入如下指令配置redis服务, 并测试redis是否安装成功,此时redis默认启动的是本地服务参考链接
123.pngsudo apt-get update
sudo apt-get install redis-server
redis-server
redis-cli
1.2 修改redis.conf 配置项,使外网可访问
使用下面指令进入redis.conf 配置项,修改redis.conf 配置项使外网可访问,把bind 127.0.0.1 改成 bind 0.0.0.0, 保存并退出
sudo vi /etc/redis/redis.conf
修改过后需要重启服务,重启服务有两种方法:
1.如果是通过源码安装的redis, 可以使用如下指令关闭并重启服务
redis-cli -h 127.0.0.1 -p 6379 shutdown
2.使用指令查看redis服务的进程号,并使用kill杀死进程的方法,在重新输入redis-cli启动服务
ps -eaf|grep redis
sudo kill 你的redis服务进程号
ps -eaf|grep redis 再次查看redis服务是否修改成功,如果出现0.0.0.0.6379就说明此时你的redis允许外网访问
986EB9FD-5BC6-4059-9C87-50D99B4B6077.png外网测试云服务器上的redis服务,xxx.xxx.xxx.xxx为你云服务器上公网的ip,如果能连接上,说明可以配置成功
redis-cli -h xxx.xxx.xxx.xxx -p 6379
注意:其实最好还是下载个客户端,方便查看,我使用redis客户端是
redis desktop manager 自己去网上找
1.3 设置redis服务的密码
使用下面指令进入redis.conf 配置项,把requirepass反注释 后面的为你的密码, 保存并退出, 重启服务,再次连接上redis服务
redis-cli -h xxx.xxx.xxx.xxx -p 6379 -a redistest
(ps:如果你没有找到这个,可以在最后面直接加上下面这句话,把后面的设置为你想要的密码)
67EDB9BD-BD9C-4DB7-8D82-40C5C7CD5E5A.pngrdm客户端连接上如下, 那个a是我自己云服务上设置测试
9A75D956-87C6-47F5-92D8-4EAFA019C8C0.png注意:修改密码后,再次重启服务,方法如上
2.配置scrapy scrapy-redis pymongo 等等服务
2.1 配置scrapy环境
配置scrapy环境首先要在云服务器上安装pip3
sudo apt-get install python3-pip
安装scrapy环境
pip3 install scrapy
安装失败,报这样的错误error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
解决方法: 参考链接
sudo apt-get install python3 python-dev python3-dev\
build-essential libssl-dev libffi-dev \
libxml2-dev libxslt1-dev zlib1g-dev \
python-pip
处理完这个错误再次执行 pip3 install scrapy 重新安装,成功后如下图所示
5463FAE6-D7C8-4E50-8E45-9426302FB7A0.png注意:以上我的配置的都是Python 3环境下的,具体配置详见参考链接
2.2 配置scrapy-redis环境
pip3 install scrapy-redis
2.3 配置mogodb环境,使外网可访问
安装pymongo
pip3 install pymongo
修改 mongodb.conf, 把bind_ip = 127.0.0.1注释掉或者改成bind_ip=0.0.0.0,这样外网就可以访问
vi /etc/mongodb.conf
重启服务
sudo service mongodb restart
再次启动服务
mongod
使用mogodb客户端 Robo 3T连接远程服务器,查看服务,成功后如下所示
BDD5C06D-50D0-457F-812D-F27EFEB58B46.png遇到的问题:
- 安装成功后,找不到 /etc/mongodb.conf 这个文件
解决方法:使用下面指令重新再次安装mongodb,使用
cat /etc/mongodb.conf 查看配置
vi /etc/mongodb.conf 编辑配置项
sudo apt install mongodb
- 修改配置mongodb.conf 配置项时,文件readonly, 没有写入权限
解决方案: sudo chmod 777 /etc/mongodb.conf 使文件可读可写
2.4 本地项目配置scrapy-redis环境,代码上传到托管平台上
2.4.1项目中安装 scrapy-redis 然后修改settings.py配置项
pip3 install scrapy-redis
修改过后我的settings.py部分配置项如下(ps: xxx.xxx.xxx.xxx 为你的服务器公网ip, SCHEDULER_FLUSH_ON_START = True 意味着启动的时候是否要清空队列)
"""
ITEM_PIPELINES = {
'zhihuuser.pipelines.MongoPipeline': 300,
'scrapy_redis.pipelines.RedisPipeline': 301,
}
MONGO_URI = 'localhost'
MONGO_DATABASE = 'zhihu'
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
REDIS_URL = 'redis://ubuntu:redistest@xxx.xxx.xxx.xxx:6379'
SCHEDULER_FLUSH_ON_START = True
"""
2.4.2 将代码上传到托管平台
我使用的是githup托管平台,你也可以使用其他托管平台(ps:我使用SourceTree可视化客户端将代码上传)
3.将代码部署到远程服务器上
3.1 安装git(ps:如果云服务器有就不用安装了)
判断有没有很简单 在终端上输入git 回车就知道有没有安装,没有安装的话使用下面这条指令安装,有的话跳过
sudo apt install git
3.2 云服务器上部署代码
3.2.1创建目录 将代码克隆岛服务器上 (ps: git clone 托管地址 -b 分支名称)
cd /var/
mkdir py
cd py
git clone https://github.com/appbanana/zhihu.git -b distributed
注意: 遇到权限问题,在指令前加sudo或者直接通过chmod 777 文件路径 使文件可读可写
3.2.2 在服务器上启动爬虫服务
启动服务前 确保你的redis,mongodb服务已开启
64E75970-26D8-4BC4-BA86-649078863314.pngscrapy crawl zhihu
遇到问题:
1.服务失败,报[twisted] CRITICAL: Unhandled error in Deferred:这样的错误(如下图所示), 原因可能是python环境,解释器环境和安装包环境不一致造成的
解决方法: 配置python3 的开发环境 参考链接
安装python3-venv包, 接下来如下图所示操作
sudo apt-get install -y python3-venv
B55C87BD-0640-4504-8890-A5D2B4AC83FD.png
2.再次启动redis服务,报MISCONF Redis is configured to save RDB snapshots这样的错误
image.png
解决方案: 参考链接
127.0.0.1:6379> config set stop-writes-on-bgsave-error no
处理完上面的问题再次启动服务,就大功告成,看似不难,我却折腾了一天,总算有所收获,祝您也顺利配置成功,谢谢大家,有什么错误欢迎大家指正。
网友评论