繁体   English   中英

使用Objective-C,在没有API的情况下,登录服务并从结果页面中抓取内容的最佳方法是什么?

[英]With Objective-C, what is the best way to log in to a service and scrape content from the resulting page without an API?

我正在使用的一项服务没有API,但允许抓取,所以我很好奇iOS / Objective-C中最好的方法是执行以下操作:

  • 获取用户登录凭据
  • 在网站登录页面上提交
  • 从结果页面中获取特定链接

如何解决诸如服务确实将您重定向到“登录成功,重定向...”页面然后将您带到内容网站之前的问题? (这不允许您立即刮取结果页面。)

例如:

像Instapaper这样的服务,如果我想在不直接使用API​​的情况下访问它,例如,我将如何登录,验证他们是否已登录,并在“登录成功,重定向...”页面后抓取内容? 或者Twitter甚至。

一种有效的方法是在UIWebView执行抓取。

该策略非常简单,它涉及使用UIWebView stringByEvaluatingJavaScriptFromString方法来控制网页。

假设您已经拥有用户登录信息,则可以使用javascript脚本输入它们。

例如,假设webViewUIWebView实例, username是用户名输入字段:

NSString * usernameScript = @"document.getElementById('username').value='Gabriele';";
[self.webView stringByEvaluatingJavaScriptFromString:usernameScript];

上面的代码将在用户Gabriele中插入Gabriele

沿着相同的路径,您可以轻松地进行并通过javascript注入自动与网页进行交互。

登录后,您可以监视当前URL,直到重定向到达所需的位置。 为此,您必须实现UIWebViewDelegatewebViewDidFinishLoad:方法,每次Web视图加载页面时都会调用该方法

- (void)webViewDidFinishLoad:(UIWebView *)webView {
    NSURL * currentURL = webView.request.mainDocumentURL;
    if ([currentURL.absoluteString isEqual:desideredURLAddress]) {
        [self performScraping];
    }
}

此时,您可以执行实际的抓取。 假设您想获取id为foodiv标签的内容。 这就像做一样简单

- (void)performScraping {
     NSString * fooContentScript = @"document.getElementById('foo').innerHTML;";
     NSString * fooContent = [self.webView stringByEvaluatingJavaScriptFromString:usernameScript];
}

这将在fooContent变量中存储div#fooinnerHTML内容。

最重要的是,在UIWebView注入javascript,你可以控制和抓取任何网页。

为了获得额外的快乐,您可以在屏幕外执行所有操作。 为此,请分配新的UIWindow并将UIWevView添加为其子视图。 如果您从未使UIWindow可见,则上述所有内容都将在屏幕外进行。

请注意,此方法非常有效,但由于您要加载每个网页的整个内容,因此可能会消耗资源。 然而,这通常是必要的折衷,因为基于XML解析器的其他方法可能不充分,因为HTML页面经常是格式错误的,并且大多数XML解析器只是严格地解析它们。

在您尝试做的事情中,iOS或Objective-C没有特定的内容。 如果您知道如何处理HTTP响应并知道如何检测登录页面,那么当您检测到响应是您的登录页面时,您所要做的就是解析响应并将凭据提交到登录终点。 在开始之前,请阅读NSURLConnection上的文档。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM