一个服务,我使用的是不具备的API,但允许刮,所以我很好奇什么的iOS / Objective-C的最好方法是做到以下几点:
- 获取用户的登录凭据
- 提交他们的网站登录页
- 抓住从结果页面的特定链接
一个人如何规避等问题进行了事实服务执行重定向到一个“登录成功,重定向...”页面带你到内容网站之前? (这不会让你马上凑结果页面。)
例如:
像Instapaper的服务,如果我想访问它不直接使用的API,例如,我将如何登录,验证它们是否已登录,刮“登录成功,重定向...”页面后的内容? 或Twitter甚至。
一个有效的办法是进行内部的刮UIWebView
。
该战略是非常简单,它涉及该方法的使用stringByEvaluatingJavaScriptFromString
的UIWebView
控制网页。
假设你已经在用户登录信息,您可以输入他们使用JavaScript脚本。
例如,假设webView
是UIWebView
实例和username
是用户名输入字段:
NSString * usernameScript = @"document.getElementById('username').value='Gabriele';";
[self.webView stringByEvaluatingJavaScriptFromString:usernameScript];
上面的代码将插入Gabriele
在用户名字段。
沿着相同的路径上,你可以很容易地进行,并自动通过JavaScript注入网页交互。
一旦你登录后,你可以监视当前的URL,直到重定向得到你想要的位置。 为了做到这一点,你必须实现webViewDidFinishLoad:
方法UIWebViewDelegate
,这将是每次Web视图加载一个页面调用
- (void)webViewDidFinishLoad:(UIWebView *)webView {
NSURL * currentURL = webView.request.mainDocumentURL;
if ([currentURL.absoluteString isEqual:desideredURLAddress]) {
[self performScraping];
}
}
此时,您可以执行实际的拼抢。 假设您想要得到的内容div
标签id为foo
。 这是因为这样做一样简单
- (void)performScraping {
NSString * fooContentScript = @"document.getElementById('foo').innerHTML;";
NSString * fooContent = [self.webView stringByEvaluatingJavaScriptFromString:usernameScript];
}
这将存储innerHTML
的内容div#foo
内部fooContent
变量。
底线,注入的javascript里面UIWebView
可以控制和刮什么网页。
对于额外的喜悦,您可以执行所有这一切关闭屏幕。 要做到这一点,分配一个新UIWindow
并添加UIWevView
作为其子视图。 如果你从来没有做UIWindow
都看得到,上述一切都将发生关闭屏幕。
注意,这种方法是非常有效的,但它可以是消耗资源,因为你是加载每个网页的全部内容。 然而,这往往是一个必要的妥协,因为基于XML解析器其他方法也可能是由于这样的事实,HTML页面通常是畸形的,大多数XML解析器只是严格解析他们inadequates。
没有什么具体到iOS或Objective-C在你正在尝试做的。 如果你知道如何处理HTTP响应,并知道如何来检测你的登录页面,所有你需要做的就是解析响应,当你发现的回应是你的登录页面提交凭据登录终点。 在你开始之前,请阅读NSURLConnection的文档。
文章来源: With Objective-C, what is the best way to log in to a service and scrape content from the resulting page without an API?