随着Objective-C的,什么是登录到服务,并刮去结果页面内容没有API的最佳方式?(With

2019-08-22 13:12发布

一个服务,我使用的是不具备的API,但允许刮,所以我很好奇什么的iOS / Objective-C的最好方法是做到以下几点:

  • 获取用户的登录凭据
  • 提交他们的网站登录页
  • 抓住从结果页面的特定链接

一个人如何规避等问题进行了事实服务执行重定向到一个“登录成功,重定向...”页面带你到内容网站之前? (这不会让你马上凑结果页面。)

例如:

像Instapaper的服务,如果我想访问它不直接使用的API,例如,我将如何登录,验证它们是否已登录,刮“登录成功,重定向...”页面后的内容? 或Twitter甚至。

Answer 1:

一个有效的办法是进行内部的刮UIWebView

该战略是非常简单,它涉及该方法的使用stringByEvaluatingJavaScriptFromStringUIWebView控制网页。

假设你已经在用户登录信息,您可以输入他们使用JavaScript脚本。

例如,假设webViewUIWebView实例和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。



Answer 2:

没有什么具体到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?