3

我正在为一个网站开发一个移动应用程序(兼容 iOS 5.0 及更高版本) ,用户可以直接从他们的登录页面查看某些数据。用户可以通过选择特定选项(即位置和/或日期)来细化结果。他们不提供任何网络服务调用,也不允许我们访问他们的数据库。所以我收集数据的唯一方法是直接“抓取”网站。

我的问题是我不知道如何通过手机的 http 请求对用户在网站上进行的更改。例如下面的网站:

在此处输入图像描述

可以从站点中提取并使用以下命令保存为字符串

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 以编程方式进行这些更改?

4

2 回答 2

2

我想您使用 UIWebView 来加载该页面。

一种可能的解决方案是编写 JavaScript 函数来模拟右侧窗格上的正常用户操作(例如,使用 jQuery 的触发函数来选择下拉列表、选择“日期范围”等)。

这些 javascript 函数可以在您的应用程序代码中编码为字符串。

然后,调用stringByEvaluatingJavaScriptFromString:webview 来运行这些 javascript 函数:

[webView stringByEvaluatingJavaScriptFromString:javascript]

这里的 javascript 参数是您构造的调用您的 javascript 函数的字符串。例如:

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

这样做时,我建议您编写这些 javascript 并使用浏览器的调试工具(Safari 的 Web Inspector、Firefox 的 FireBug 插件...)对其进行测试,以确保它们首先按预期工作。

于 2012-04-13T00:05:20.150 回答
0

如果我理解正确,您想在不向用户显示网站的情况下提取数据吗?

如果是的话,我目前能想到的唯一解决方案是屏幕外 UIWebView,您可以在其中执行一些 JavaScript 魔术来模拟用户输入,然后将数据取出。

然而,这是一种非常骇人听闻的方法,我不建议您在运输应用程序中使用它。
事实上,我建议根本不要进行任何网络抓取,因为如果他们更改网站结构,您的应用程序将无法运行。

如果您真的是“为他们”开发应用程序,那么请告诉他们您需要一个 Web 服务来编写一个好的应用程序。

如果您不是“为他们”工作,而只是尝试编写一个使用他们的服务获取数据的应用程序,那么您所做的不仅复杂,而且很可能还违反了他们的 EULA,因此您不应该这样做一点也不。考虑与他们联系,看看在这种情况下是否可以让他们与您合作。

于 2012-04-13T00:15:11.377 回答