2012-04-12 58 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