如何从iOS的javascript页面中抓取数据?

时间:2012-04-12 23:39:26

标签: objective-c ios5 web-scraping

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

我的问题是我不知道如何通过手机的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 个答案:

答案 0 :(得分:2)

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

一种可能的解决方案是编写JavaScript函数来模拟右侧窗格中的正常用户操作(例如,使用jQuery的触发器功能来选择下拉列表,选择'Date Range'等)。

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

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

[webView stringByEvaluatingJavaScriptFromString:javascript]

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

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

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

答案 1 :(得分:0)

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

如果是的话,我现在能想到的唯一解决方案就是屏幕外的UIWebView,您可以通过JavaScript魔术来模拟用户输入,然后将数据输出。

然而,这是一种非常黑客的方法,我不建议您在运输应用程序中使用它 事实上,我建议不要进行任何网页编写,因为如果他们改变了他们的网站结构,你的应用就无法工作。

如果你真的正在为他们开发一个应用程序,那么告诉他们你需要一个web服务来编写一个好的应用程序。

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