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