1. 程式人生 > >在伺服器上搭建scrapy分散式爬蟲環境的過程

在伺服器上搭建scrapy分散式爬蟲環境的過程

這段時間在用 scrapy 爬取大眾點評美食店鋪的資訊,由於準備爬取該網站上全國各個城市的資訊,單機跑效率肯定是跟不上的,所以只能藉助於分散式。scrapy 學習自崔慶才老師的視訊,受益頗多,程式碼簡練易懂,風格清新。這裡梳理一遍從剛申請的伺服器環境配置,python 安裝,到搭建能執行分散式爬蟲的整個流程。

伺服器我是申請的阿里雲的學生機,騰訊雲和美團雲也申請了,相比起來還是阿里雲用起來舒服,騰訊雲使用體驗最差。我裝的是 centos 系統,以下也是 centos 下遇到的問題及解決問題的找過的連結。另外阿里雲需要新增安全組規則,將後面會用到的埠放行,例如27017,6800等。

從機配置

1.python 的安裝

在裝過好幾臺伺服器後總結出了最短且有效的裝 python 的方法,參考了這篇文章這裡簡要總結一下

  • yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel
  • wget https://www.python.org/ftp/python/3.6.3/Python-3.6.3.tgz
  • mkdir /usr/local/python3
  • tar -zxvf Python-3.6.3.tgz
  • cd Python-3.6.3
  • ./configure --prefix=/usr/local/python3
  • make && make install
  • ln -s /usr/local/python3/bin/python3 /usr/bin/python3 建立 python3 的軟連結
  • ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3 建立 pip3 的軟連結
  • 最後命令列下輸入pip3python3 -V 驗證一下是否都成功

2.mongodb的安裝

在從機上都裝上 mongodb,爬取的資料都存在各自的伺服器上,之後再彙總。這裡參考了這篇文章

  • vim /etc/yum.repos.d/mongodb-org-3.4.repo
  • [mongodb-org-3.4]
    name=MongoDB Repository
    baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
    gpgcheck=1
    enabled=1
    gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc

    將以上內容複製貼上進去剛開啟的視窗
  • yum -y install mongodb-org
  • systemctl enable mongod.service 設定開機啟動
  • vim /etc/mongod.conf 編輯配置檔案,註釋掉 bindIp,並重啟 mongodb
  • systemctl restart mongod.service 重啟 mongodb,這條指令在 mongodb 掛掉時候可以使用
  • systemctl stop mongod.service 停止 mongodb

記錄一下剛學習時命令列下的編輯操作,vim 開啟檔案後,insert 進行編輯,退出編輯 esc,shift+兩下Z。查詢關鍵詞是:/+關鍵詞

3.利用 pip3 安裝 scrapy 等

一般正常順序先pip3 install scrapy,接著肯定會報requirement Twisted>=13.1.0這種錯誤,一次偶然我先pip3 install scrapyd發現安裝上了最新的 Twisted 元件,接著安裝 scrapy也沒再報錯。所以為了省事,避開報錯,建議先安裝 scrapyd。

  • pip3 install scrapyd
  • pip3 install scrapy
  • pip3 install pymongo
  • pip3 install redis
  • pip3 install redis-client

安裝完以上內容,基本能滿足分散式從機的爬取。但是在命令列直接輸入scrapyscrapyd 發現會報錯,提示command not found,這裡可以通過建立軟連結解決問題。

  • find / -name scrapy找到系統中scrapy所在的目錄,選擇在bin目錄下的路徑
  • ln -s /usr/local/python3/bin/scrapy /usr/bin/scrapy 這是在我的路徑下建立的軟連結
  • scrapy 命令列再輸入scrapy發現已經可用

scrapyd 建立軟連結的方法與上面一樣,其實在後面加個d就好了(笑)

scrapy 建立軟連結如下

scrapy建立軟連結

scrapyd 建立軟連結如下

這裡寫圖片描述

在開啟了 scrapyd 服務後發現監聽 ip 為本機,想要遠端訪問需要將配置修改一下。先 ctrl+c 退出 scrapyd,開啟 scrapyd 配置檔案所在的資料夾

  • cd /usr/local/python3/lib/python3.6/site-packages/scrapyd
  • ls 列出 scrapyd 資料夾下所有檔案
  • vim default_scrapyd.conf 開啟配置檔案
  • bind_address = 0.0.0.0 將繫結 ip 修改為 0.0.0.0,儲存退出,再在命令列輸入scrapyd會發現監聽 ip 發生了變化。

由於從機的scrapyd需要後臺執行,這裡我採用了setsid scrapyd命令來後臺開啟服務,這樣關閉視窗後仍能進行連線。
需要結束scrapyd程序時,利用ps -ef | grep -i scrapyd檢視PID號,再 kill -9 PID 結束程序。

主機配置

以上完成了從機的配置,接下里配置主機

主機和從機不同在於它需要提供 redis 服務來儲存請求佇列,所以主要是安裝 redis 服務。參考了眾多文章後,還是推薦這篇文章
這裡梳理一下過程:

  • yum install gcc
  • wget http://download.redis.io/releases/redis-3.0.6.tar.gz
  • tar zxvf redis-3.0.6.tar.gz
  • cd redis-3.0.6 建議將資料夾名字修改為redis看著簡潔一些
  • vim redis.conf 開啟 redis 配置檔案
  • #bind 127.0.0.1 將繫結 ip 註釋掉,以便遠端訪問
  • daemonize yes 在 redis.conf 中修改該選項為 yes,即後臺執行
  • requirepass 後加上登陸密碼
  • protected-mode no 關閉保護模式,接著儲存退出
  • mkdir /etc/redis
    cp redis.conf /etc/redis/6379.conf
    將 redis.conf 複製一份名為 6379.conf 到指定目錄
  • cd utils 在原redis目錄下開啟utils資料夾
  • vim redis_init_script 修改啟動指令碼,並在開頭新增如下程式碼
    #!/bin/sh
    #chkconfig: 2345 90 10
    #description: Redis is a persistent key-value database
  • cp redis_init_script /etc/init.d/redisd 將啟動指令碼複製為 redis
  • chkconfig redisd on 設定開機啟動
  • service redisd start 啟動 redis
  • service redisd stop 關閉 redis

遇到過的問題

以上內容完成了主機上 redis 服務的搭建,不過在使用過程中,遇到了以下報錯,
MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk.Commands that may modify the data set are disabled. Please check Redis logs for details about the error.

原因是強制關閉 Redis 快照導致不能持久化,我採取了下面解決方法

redis-cli -a 密碼 進入 redis 客戶端,-a 後接之前配置檔案中修改的密碼
127.0.0.1:6379> config set stop-writes-on-bgsave-error no 提示 ok 就可以了

通過主機與從機的搭建,分散式執行的條件有了,本地需要pip install scrapyd-client 安裝 scrapyd 的客戶端外掛,另外由於我用的是 windows 系統,curl 命令需要再去下載,scrapyd-deploy 也是無法直接使用的,後來在 github 上找到了解決辦法

  • 開啟本地 Python\Python36\Scripts 目錄
  • 建立名為scrapyd-deploy.bat 的檔案
  • 寫入"Python\Python36\python.exe" "Python\Python36\Scripts\scrapyd-deploy" %1 %2 %3 %4 %5 %6 %7 %8
    %9

這樣就可以是使用 scrapyd-deploy 了,具體使用請閱讀官方文件 scrapyd scrapyd-client

這裡寫圖片描述

END

這是我第一次寫部落格,難免出錯,歡迎大家指出錯誤 ^_^