用Selenium編寫的一個爬蟲腳本cctv.py,需要給不懂軟件的人運行。為了不讓他去搭建,安裝各種包,庫,所以將腳本打包成exe文件給他直接使用。
運行環(huán)境Ubuntu-16.04
所需要的基本工具:
1. Pyinstaller:打包工具
2. xvfb: 虛擬顯示框架
一. 安裝Pyinstaller
注意:如果你要在Linux下運行,那么在Linux下打包編譯。
zhuben@zb:~$ pip install pyinstaller
下載的是3.2版本。
二. 安裝xvfb
zhuben@zb:~$ sudo apt-get install xvfb
下載后我沒有測試過,下載過程沒有報錯OK,如果要測試是否成功,可以在網(wǎng)上搜索。
三. 打包cctv.py腳本
zhuben@zb:~$ pyinstaller --onefile cctv.py
運行之后會看到很多打印信息。完成后會生成build和dist文件夾,cctv.spec文件
生成的exe文件其實是根據(jù).spec文件中的內(nèi)容來生成的,可以打開查看。
如果已經(jīng)有了.spec文件,可以直接運行
zhuben@zb:~$ pyinstaller cctv.spec
進入dist文件夾會發(fā)現(xiàn)cctv.exe文件。如果想了解更多參數(shù),可以參考官方文檔
運行試試看
如果出現(xiàn)IOError:/tmp/_MEISGj2tQ/selenium/webdriver/firefox/x86/x_ignore_nofocus.so之類的缺少文件錯誤。那需要修改.spec文件
原內(nèi)容為:
a = Analysis(['main.py'],
pathex=[...],
binaries=None,
datas=None,
...)
要手動將缺少的文件路徑加上去
改為:
a = Analysis(['main.py'],
pathex=[...],
binaries=None,
datas=[
('/usr/lib/python2.7/site-packages/selenium/webdriver/firefox/x86/x_ignore_nofocus.so', 'selenium/webdriver/firefox/x86'),
('/usr/lib/python2.7/site-packages/selenium/webdriver/firefox/amd64/x_ignore_nofocus.so', 'selenium/webdriver/firefox/amd64')
],
...)
以上路徑需要改為你自己機子上.so文件所在路徑
內(nèi)容來自參考:Pyinstaller遇到的問題
解決之后,發(fā)現(xiàn)沒有出現(xiàn)Runtime問題了,但是有WebDriverException:
selenium.common.exceptions.WebDriverException: Message: The browser appears to have exited before we could connect.
這是因為沒有顯示器的原因,所以需要xvfb搭建一個虛擬的環(huán)境。關(guān)于xvfb的更多內(nèi)容可以自行搜索
四. 使用xvfb
zhuben@zb:~$ Xvfb -ac :10 &
zhuben@zb:~$ export DISPLAY=:10 #將顯示連接到xvfb所創(chuàng)建的環(huán)境
再來運行cctv.exe,發(fā)現(xiàn)可以正常運行了.
或者執(zhí)行
zhuben@zb:~$ xvfb-run --auto-servernum --server-args="-screen 0 1280x760x24" ./cctv.exe
五. 優(yōu)化
如果每次需要運行腳本的時候都加上這么多命令的話,很是不方便。所以,我將xvfb的啟動/關(guān)閉命令加到了爬蟲腳本中
if __name__ == "__main__":
os.system("nohup Xvfb -ac :10 &")
main()
os.system("sudo killall Xvfb")
然后用sudo ./cctv.exe執(zhí)行
但是這樣加上去是不能執(zhí)行的,原因是缺少了設(shè)置DISPLAY變量export DISPLAY=:10
但是Python腳本中是加入不了export 命令的。原因參考:How to user export in Python on Linux
所以:要么執(zhí)行sudo ./cctv.exe之前,執(zhí)行export DISPLAY=:10;要么將export DISPLAY=:10加入到.bashrc中去。
六.遇到的問題
1.Exec format error.Binary file not executable:
文件格式錯誤,確保你的exe文件是在你當(dāng)前的系統(tǒng)中生成的。雖然Pyinstaller是跨平臺的,但是他打包之后的exe文件并不能跨平臺執(zhí)行。也是說,在win下打包生成的exe文件只能在win下運行;在linux下打包生成的exe文件,只能在linux下運行。開始并不知道這個,總是在win下打包好后,傳到ubuntu下去運行
2.開啟了xvfb,但是還是提示W(wǎng)ebDriverException:
確保你的DISPLAY 的值和你xvfb設(shè)置的值是一致的。xvfb設(shè)置為:10, 那么你需要 export DISPLAY=:10?梢暂斎雃xport查看所有變量
七. 其他
可以看看Nuitka,介紹