2012-04-12 26 views
3

我正在爲website開發移動應用程序(適用於iOS 5.0及以上版本),用戶可以直接從其着陸頁查看某些數據。用戶可以通過選擇特定選項(即位置和/或日期)來細化結果。他們不提供任何Web服務調用,也不允許我們訪問他們的數據庫。所以我唯一的收集數據的方法是直接從網站上'刮'這個網站。如何從iOS的JavaScript頁面中抓取數據?

我的問題是,我不知道如何使用戶可以通過手機的http請求進行的更改。例如下面的網站:

enter image description here

可以從網站拉,並保存爲一個字符串,用下面的命令

NSString *html = [NSString stringWithContentsOfURL:urlrequest encoding:NSUTF8StringEncoding error:&err]; 

我能分開的相關數據:

// I decided to add the script function name in case anyone wanted to look for themselves 
<script type="text/javascript" language="Javascript"> 
//<![CDATA[ 
function loadData(){ 

var winMsgTitle = "Date: 04/11/2012"; 

// this is the actual data I'm concerned with: 
gLatLong = new GLatLng(31.59019444444444, -110.50655555555555); 
tmpMapIcon = new MapIcon("0_0", 21, 15); 
marker = createMarker(gLatLong, 0.0, createInfoWinMsg(winMsgTitle, ".00", ".84", "5711", "2012", "", "07:00"), tmpMapIcon); 
map.addOverlay(marker); 
point = null;marker = null; 
gLatLong = new GLatLng(32.2938260182, -110.7896411419); 
tmpMapIcon = new MapIcon("0_0", 21, 15); 
marker = createMarker(gLatLong, 0.0, createInfoWinMsg(winMsgTitle, ".00", "1.00", "1254", "2012", "", "07:00"), tmpMapIcon); 
map.addOverlay(marker); 
point = null;marker = null; 
gLatLong = new GLatLng(33.5966853633, -112.1744066477); 
tmpMapIcon = new MapIcon("0_0", 21, 15); 
marker = createMarker(gLatLong, 0.0, createInfoWinMsg(winMsgTitle, ".00", ".70", "256", "2012", "", "07:00"), tmpMapIcon); 
map.addOverlay(marker); 
point = null;marker = null; 

注:顯然有更多的點,這只是剪斷它

爲了獲得另一個位置或日期,我必須通過網站手動選擇並選擇右側窗格中的選項。我的問題是,我如何通過objective-c以編程方式進行這些更改?

回答

2

我想你使用UIWebView來加載該頁面。

一個可能的解決方案是編寫JavaScript函數來模擬右側窗格中的普通用戶操作(例如,使用jQuery的觸發器函數來選擇下拉列表,選擇'日期範圍'等)。

這些JavaScript函數可以在應用程序代碼中編碼爲字符串。

然後,調用stringByEvaluatingJavaScriptFromString:上的WebView運行這些JavaScript函數:

[webView stringByEvaluatingJavaScriptFromString:javascript] 

這裏的JavaScript參數爲您構建一個調用JavaScript函數的字符串。例如:

NSString *javascript = [NSString stringWithFormat:@"selectRegion(%@)", targetRegion]; 

做這件事時,我建議你寫的這些JavaScript和使用瀏覽器的調試工具(Safari的網絡督察,Firefox的螢火插件...),以確保他們的工作,希望先測試他們。

+0

我能夠發現該網站有一個「loadData」函數,我可以從mozilla的web控制檯調用,該控制檯包含我需要的全部內容。是否有可能只是調用該函數? – KronoS 2012-04-13 05:12:29

+0

我想這可能會起作用。爲什麼不直接寫和測試呢? – 2012-04-13 06:10:48

+0

我並不確定如何大聲笑。 – KronoS 2012-04-13 06:32:39

0

如果我正確理解你,你想拉數據而不顯示網站給你的用戶?

如果是的話,我目前唯一可以考慮的解決方案就是屏幕外的UIWebView,在這裏您可以使用一些JavaScript魔法來模擬用戶輸入,然後獲取數據。

然而,這是一個非常hackish的方法,我不會建議你在運輸應用程序中使用它。
事實上,我建議不要做任何webscraping,因爲如果他們改變他們的網站結構,你的應用程序將無法工作。

如果你真的在爲他們開發一個應用程序,那就去告訴他們你需要一個web服務來編寫一個好的應用程序。

如果你不是「爲他們工作」,而只是試圖編寫一個使用他們的服務來獲取數據的應用程序,那麼你所做的不僅是複雜的,但很可能也違反了他們的EULA,你應該因此根本不會這樣做。考慮聯繫他們,看看在這種情況下是否可以讓他們與你一起工作。

+0

他們的android應用程序執行此操作。我也爲「他們」和我的老師工作)。因此,Web服務的設置不可用。我計劃與他們交談,*高度*建議他們實施某種網絡服務。但是,在這種情況下,我需要一個網絡報廢解決方案。我也沒有違反任何EULA。只是FYI。 – KronoS 2012-04-13 21:39:42