Java調用Python並傳遞參數(爬蟲8)__iOS

來源:互聯網
上載者:User
前因

最近確實學習了不少的東西。
在兩方面的感受最深刻: 一款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。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.