在伺服器上搭建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 的軟連結- 最後命令列下輸入
pip3
和python3 -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,並重啟 mongodbsystemctl 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
安裝完以上內容,基本能滿足分散式從機的爬取。但是在命令列直接輸入scrapy
和 scrapyd
發現會報錯,提示command not found
,這裡可以通過建立軟連結解決問題。
find / -name scrapy
找到系統中scrapy所在的目錄,選擇在bin
目錄下的路徑ln -s /usr/local/python3/bin/scrapy /usr/bin/scrapy
這是在我的路徑下建立的軟連結scrapy
命令列再輸入scrapy發現已經可用
scrapyd 建立軟連結的方法與上面一樣,其實在後面加個d就好了(笑)
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
將 redis.conf 複製一份名為 6379.conf 到指定目錄
cp redis.conf /etc/redis/6379.confcd 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
將啟動指令碼複製為 redischkconfig redisd on
設定開機啟動service redisd start
啟動 redisservice 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
這是我第一次寫部落格,難免出錯,歡迎大家指出錯誤 ^_^