在Linux虚拟机下运行爬虫程序是非常硬的刚需。让爬虫在后台运行可以节省本机资源,亦可以充分利用电脑不开机的时间。
在使用爬虫的过程中,依次遇到了这几个问题:安装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
然后是从官方网站下载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
的粗暴指令。
这样如果安装过程中出现缺少包,需要使用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兼容性问题
现在解释器是python3的版本了,但是有两个系统应用用的还是python2的解释器。它们分别是yum
和 urlgrabber-ext-down
。如果不做修改直接使用,就会报这样的错误:
except OSError, e:
^
所以我们要稍作修改,把文件头部的#!/usr/bin/python
改成
#!/usr/bin/python2
,这样它们就知道该用哪个解释器了。
两个文件路径分别是
/usr/bin/yum
/usr/libexec/urlgrabber-ext-down
用vi打开即可
使用中还发现了两个小问题,一个是tqdm
库不太好用,无法在同一行输出。
另一个是selenium使用的chromedriver要重新下载合适的版本。
-
SSH中断时保持运行
通过SSH连接服务器之后,通常希望程序能一直保持运行状态。这里就需要用到nohup
和&
这两个指令。
nohup
作为一条指令的开头,表示这条指令不会被HUP信号中断。当你的SSH断开时,服务器的程序会接到HUP信号,而nohup会忽略这个信号。
&
作为一条指令的结尾,表示这条指令不会被INT信号中断。有时我们会用ctrl+c来终止一条指令,这个时候就是发送了INT信号。
因此,如果希望程序后台运行,且在SSH中断后还能保持运行,可以使用
nohup python test.py &
除了后台运行,还有一个问题是输出。在控制台监控输出当然好,但是如果是后台运行呢?这就需要写日志。
nohup
指令默认会把所有的输出都输出到nohup.out文件中。当然,你可以指定输出哪些内容,也可以指定输出到哪个文件夹。
nohup python test.py > nohup.log
可以让你的输出进入名为nohup.log的文件;python test.py 2>nohup.log
可以在正常运行的基础上,让你的错误输出进入nohup.log文件。看到这里应该对输出有了大概的概念了。
事实上,真正起作用的是>
指令。使用012分别代表STDIN(标准输入)、STDOUT(标准输出)、STDERR(标准错误输出),使用>
表示流的方向,输出端使用&来区分标准流和文件。
因此,你可以使用2>&1
表示错误信息会被重定向到标准输出,使用&>a.log
表示所有输出都重定向到a.log。
最后,一条常用的指令是
nohup command > myout.file 2>&1 &
先把标准输出重定向到输出文件,再把标准错误输出重定向到标准输出。亦即,输出全部定向到输出文件。而这条指令是后台运行,不被crtl+c打断,不被SSH中断打断。