美文网首页
Scrapy分布式架构搭建抓取知乎

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

作者: 747071ac3c1d | 来源:发表于2018-10-17 11:04 被阅读62次

    运行环境

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

    67EDB9BD-BD9C-4DB7-8D82-40C5C7CD5E5A.png

    rdm客户端连接上如下, 那个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

    遇到的问题:

    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: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服务已开启

    scrapy crawl zhihu

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

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

    image.png
    解决方法: 配置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

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

    相关文章

      网友评论

          本文标题:Scrapy分布式架构搭建抓取知乎

          本文链接:https://www.haomeiwen.com/subject/vtlpiftx.html