前因
最近確實學習了不少的東西。
在兩方面的感受最深刻: 一款APP的開發,從前到後的流程原來是這樣啊。 每門語言都有它的強大之處,不是它能不能實現,而是你想不想實現。 聯調方案
爬蟲這邊已經把資料存進MySQL了。
但是和後台那邊還沒有想好怎麼聯調。
想法一:
安卓組直接提供爬蟲組需要的使用者資訊。
怎麼給。http協議。反正我不知道…
想法二:
安卓就相當於是前端,它的後台就是後台小哥。
直接讓後台把使用者資訊存成一張表。
讀取每一條使用者資訊,調用爬蟲組的Python程式,參數傳入。
爬蟲組直接將資料又存進背景資料庫裡。
這個想法應該是可以的,畢竟Java和Python都很強大。 Java調用Python
總體思想:
在有新使用者加入或者有新的資料需要更新的時候,Java直接調用爬蟲並傳入參數。結果就是資料存入到了資料庫。
瞭解到Java有Runtime.getRuntime().exec()
這樣就好辦多了。
這個方法其實就好像是cmd命令列一樣的執行python 程式:
Runtime.getRuntime().exec("python D:\\studentdb.py id password");
id和password就是傳入的參數。
把原爬蟲程式改為:
if __name__ == '__main__': # 初始化爬蟲對象 xs = XDspiderStudent() # 登入(在此處傳入正確的個人學號與密碼資訊) #從Java裡傳入參數 xs.login((sys.argv[1]), (sys.argv[2])) xs.Store() xs.saveMysql()
這樣即可。
這樣需要一個伺服器也就可以了。
就是不知到怎麼部署,還需要學習。 後果
之前試過用Java調用Python,到真正用的時候才發現是一個烏龍。 error
錯誤就是我的程式太多了,程式命名混亂,導致執行了不該執行的程式,而我以為它跑通了。
這個方法:
Runtime.getRuntime().exec("python D:\\studentdb.py id password");
並不能傳遞形參。。。
只可以這樣使用:
Runtime.getRuntime().exec("python D:\\studentdb.py 12345678 666666");
這樣是可以把學號和密碼傳入Python檔案,並且執行。
而前者的形參方法,是會直接把形參當成字串直接傳進Python…
這也就是說,這個方法只可以傳遞字串。
前幾天調到半夜發現的真理。
那麼還有解決辦法嗎。
肯定有,要麼是我不知道,要麼是我不會。 新方法Jython
尋找資料發現這個第三方包Jython是可以用來傳遞Python參數並且執行代碼。
之前也有注意到這個方法,但是由於考慮到它的複雜性,和Runtime.getRuntime().exec()方法的簡單性,就沒有往這裡想,畢竟程式員是最懶的。
首先得下載Jython這個第三方包。 調試記錄
1、
console: Failed to install '':java.nio.charset.UnsupportedCharsetException: cp0.
Run As>Run Configurations,選擇第二個頁簽Arguments,在VM arguments中添加-Dpython.console.encoding=UTF-8即可,然後Apply>Run就行了
2、java用jython.jar調用python指令碼,指令碼中import了第三方庫時,報錯:import xxx: no module named xxx.
兩種解決方案:
(1)下載或pip install需要的第三方庫,將jython.jar改成jython.zip,並解壓縮,將下載的第三方庫(以庫名定義的檔案夾)放到jython檔案夾下的/Lib或/Lib/site-packages下,最後將jython檔案夾重新打包(注意:打包時不要直接對jython檔案夾打包,只打包jython根目錄下的所有檔案),並改尾碼為.jar,配置到java的工程目錄中(構建路徑)。
(2)配置python的系統路徑,java解析指令碼時會到sys.path中找import的第三方庫,只要sys.path中能找到第三方庫的檔案夾即可。
註:在java端通過語句:PySystemState sys = Py.getSystemState();
System.out.println(sys.path.toString());列印路徑資訊。 最後的bug與悔悟
一步步的將各個遇到的bug擊破,遇到最大的障礙:識別不了requests包。
和隊友們思前想後,覺得這可能是和Python的版本有關係。
我們統一用的是Python35,從這個第三包的名字就可以的看出Jython2.7就能看得出它是支援Python27的。
但是事物的發展不就是要走在最前沿的嗎。
這個問題肯定有它的解決辦法。只是我不知道和不會。
現在最蠢的解決辦法有兩種:
1. 重寫Python3程式為Python2
2. 後台將獲得的學號密碼產生為CSV檔案儲存到本地,再直接執行Python程式。Python程式裡讀取本地CSV檔案,擷取學號密碼,進行爬蟲活動,存資料到MySQL,再刪除CSV。
第一種方法需要花時間。
第二種方法太笨,在處理多並發的活動時可能會崩塌。而且效率低。
思前想後,為了以後工作的順利進行,還是選擇第一種吧,重新寫Python程式為2。