1

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

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

如何规避诸如服务在将您带到内容站点之前将您重定向到“登录成功,正在重定向...”页面这一事实?(这不允许您立即抓取结果页面。)

例如:

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

4

2 回答 2

3

一种有效的方法是在UIWebView.

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

假设您已经拥有用户登录信息,您可以使用 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];
    }
}

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

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

这将存储变量内部的innerHTML内容。div#foofooContent

底线是,在UIWebView您可以控制和抓取任何网页的内部注入 javascript。

为了获得额外的乐趣,您可以在屏幕外执行所有这些操作。为此,分配一个新UIWindow的并将其添加UIWevView为它的子视图。如果你从UIWindow不让可见,上面描述的一切都会发生在屏幕外。

请注意,这种方法非常有效,但它可能会消耗资源,因为您正在加载每个网页的全部内容。然而,这通常是一个必要的折衷方案,因为基于 XML 解析器的其他方法可能不够充分,因为 HTML 页面通常格式不正确,并且大多数 XML 解析器对它们的解析过于严格。

于 2013-04-14T22:53:38.200 回答
0

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

于 2013-04-12T22:24:38.860 回答