?在Linux虛擬機下運行爬蟲程序是非常硬的剛需暑认。讓爬蟲在后臺運行可以節(jié)省本機資源柏肪,亦可以充分利用電腦不開機的時間达皿。
?在使用爬蟲的過程中天吓,依次遇到了這幾個問題:安裝python3.5、yum兼容性問題峦椰、SSH中斷時保持運行
-
安裝python3.5
python3才是目前主流的python版本龄寞,因此安裝python3是必然的。我之前用的是3.5汤功,所以選擇安裝python3.5物邑,參考資料是這篇博客。
在安裝之前應該先把依賴項裝好,以免之后出奇怪的問題色解。
yum -y groupinstall "Development tools"
yum -y install openssl-devel sqlite-devel bzip2-devel ncurses-devel gdbm-devel readline-devel tcl-devel tk-devel xz-devel zlib-devel db4-devel libpcap-devel
?然后是從官方網(wǎng)站下載python的包并解壓茂嗓。
?你可以自己使用mv指令把這個包扔到你喜歡的位置。
wget https://www.python.org/ftp/python/3.5.1/Python-3.5.1.tgz
tar -zxf /usr/local/src/Python-3.5.1.tgz
?這個包相當于未安裝的程序科阎,我們還需要編譯和安裝述吸。
# 具體要看你的包位置在哪
cd Python-3.5.1
./configure --prefix=/opt/python3.5 --enable-shared
make && make install
?在./config
的過程中,可能會報錯锣笨。仔細看報錯信息蝌矛,很可能是gcc報錯。
?這是因為沒有gcc的包错英,使用yum install gcc
來獲取入撒。
?值得注意的是CentOS的yum指令是需要python解釋器的,路徑是
/usr/lib/python
?進入/usr/lib
路徑之后椭岩,可以通過指令ll python*
查看文件和依賴關系茅逮。
?因此在你裝好python3.5之前,不要隨手刪了這個文件簿煌。你可以使用
mv python python.bak
?來替代rm -rf python
的粗暴指令氮唯。
?這樣如果安裝過程中出現(xiàn)缺少包,需要使用yum
指令姨伟,那你還有救惩琉。
?最后就是把python解釋器重新軟鏈接到python3.5上面
# /usr/python3.5/bin/python3 應當被改為你的python3路徑
ln -s /usr/python3.5/bin/python3 /usr/bin/python3
echo "/opt/python3.5/lib" > /etc/ld.so.conf.d/python3.5.conf
-
yum兼容性問題
現(xiàn)在解釋器是python3的版本了,但是有兩個系統(tǒng)應用用的還是python2的解釋器夺荒。它們分別是yum
和 urlgrabber-ext-down
瞒渠。如果不做修改直接使用,就會報這樣的錯誤:
except OSError, e:
^
?所以我們要稍作修改技扼,把文件頭部的#!/usr/bin/python
改成
?#!/usr/bin/python2
伍玖,這樣它們就知道該用哪個解釋器了。
?兩個文件路徑分別是
/usr/bin/yum
/usr/libexec/urlgrabber-ext-down
?用vi打開即可
?使用中還發(fā)現(xiàn)了兩個小問題剿吻,一個是tqdm
庫不太好用窍箍,無法在同一行輸出。
?另一個是selenium使用的chromedriver要重新下載合適的版本丽旅。
-
SSH中斷時保持運行
通過SSH連接服務器之后椰棘,通常希望程序能一直保持運行狀態(tài)。這里就需要用到nohup
和&
這兩個指令榄笙。
nohup
作為一條指令的開頭邪狞,表示這條指令不會被HUP信號中斷。當你的SSH斷開時茅撞,服務器的程序會接到HUP信號帆卓,而nohup會忽略這個信號巨朦。
&
作為一條指令的結尾,表示這條指令不會被INT信號中斷剑令。有時我們會用ctrl+c來終止一條指令糊啡,這個時候就是發(fā)送了INT信號。
因此尚洽,如果希望程序后臺運行悔橄,且在SSH中斷后還能保持運行,可以使用
nohup python test.py &
除了后臺運行腺毫,還有一個問題是輸出癣疟。在控制臺監(jiān)控輸出當然好,但是如果是后臺運行呢潮酒?這就需要寫日志睛挚。
nohup
指令默認會把所有的輸出都輸出到nohup.out文件中。當然急黎,你可以指定輸出哪些內(nèi)容扎狱,也可以指定輸出到哪個文件夾。
nohup python test.py > nohup.log
可以讓你的輸出進入名為nohup.log的文件勃教;python test.py 2>nohup.log
可以在正常運行的基礎上淤击,讓你的錯誤輸出進入nohup.log文件」试矗看到這里應該對輸出有了大概的概念了污抬。
事實上,真正起作用的是>
指令绳军。使用012分別代表STDIN(標準輸入)印机、STDOUT(標準輸出)、STDERR(標準錯誤輸出)门驾,使用>
表示流的方向射赛,輸出端使用&來區(qū)分標準流和文件。
因此奶是,你可以使用2>&1
表示錯誤信息會被重定向到標準輸出楣责,使用&>a.log
表示所有輸出都重定向到a.log。
最后聂沙,一條常用的指令是
nohup command > myout.file 2>&1 &
先把標準輸出重定向到輸出文件秆麸,再把標準錯誤輸出重定向到標準輸出。亦即逐纬,輸出全部定向到輸出文件。而這條指令是后臺運行削樊,不被crtl+c打斷豁生,不被SSH中斷打斷兔毒。