Scrapy分布式架构搭建抓取知乎

运行环境

电脑系统:macOS 10.13.6
云服务器: 腾讯云服务器 系统镜像 Ubuntu 16.04.1 LTS

scrapy分布式构建简要步骤

  1. 在腾讯云服务器上 部署redis服务,使外网可以访问
  2. 配置scrapy scrapy-redis pymongo
  3. 部署代码到这台服务器上

代码

代码
分支master 是scrapy爬取知乎代码
分支distributed 是分布式爬取知乎代码代码 区别只是setting.py不太一样
distributed-1.0.0 是项目配置scrapyd scrapyd-client python-scrapyd-api


具体步骤如下

1.在云服务器上配置redis环境

1.1 安装redis服务

在终端上输入如下指令配置redis服务, 并测试redis是否安装成功,此时redis默认启动的是本地服务参考链接

sudo apt-get update
sudo apt-get install redis-server
redis-server
redis-cli

123.png
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:如果你没有找到这个,可以在最后面直接加上下面这句话,把后面的设置为你想要的密码)

Scrapy分布式架构搭建抓取知乎_第1张图片
67EDB9BD-BD9C-4DB7-8D82-40C5C7CD5E5A.png

rdm客户端连接上如下, 那个a是我自己云服务上设置测试

Scrapy分布式架构搭建抓取知乎_第2张图片
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 重新安装,成功后如下图所示

Scrapy分布式架构搭建抓取知乎_第3张图片
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连接远程服务器,查看服务,成功后如下所示

Scrapy分布式架构搭建抓取知乎_第4张图片
BDD5C06D-50D0-457F-812D-F27EFEB58B46.png

遇到的问题:

  1. 安装成功后,找不到 /etc/mongodb.conf 这个文件
    解决方法:使用下面指令重新再次安装mongodb,使用
    cat /etc/mongodb.conf 查看配置
    vi /etc/mongodb.conf 编辑配置项

sudo apt install mongodb

  1. 修改配置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:[email protected]: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服务已开启

scrapy crawl zhihu

64E75970-26D8-4BC4-BA86-649078863314.png

遇到问题:
1.服务失败,报[twisted] CRITICAL: Unhandled error in Deferred:这样的错误(如下图所示), 原因可能是python环境,解释器环境和安装包环境不一致造成的

Scrapy分布式架构搭建抓取知乎_第5张图片
image.png

解决方法: 配置python3 的开发环境 参考链接
安装python3-venv包, 接下来如下图所示操作
sudo apt-get install -y python3-venv
Scrapy分布式架构搭建抓取知乎_第6张图片
B55C87BD-0640-4504-8890-A5D2B4AC83FD.png

2.再次启动redis服务,报MISCONF Redis is configured to save RDB snapshots这样的错误
Scrapy分布式架构搭建抓取知乎_第7张图片
image.png

解决方案: 参考链接

127.0.0.1:6379> config set stop-writes-on-bgsave-error no

处理完上面的问题再次启动服务,就大功告成,看似不难,我却折腾了一天,总算有所收获,祝您也顺利配置成功,谢谢大家,有什么错误欢迎大家指正。

你可能感兴趣的:(Scrapy分布式架构搭建抓取知乎)