![](/img/trans.png)
[英]Get a link and removing all the clutter and only focusing on the content - what's the best way to do this in Objective-C?
[英]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脚本输入它们。
例如,假设webView
是UIWebView
实例, username
是用户名输入字段:
NSString * usernameScript = @"document.getElementById('username').value='Gabriele';";
[self.webView stringByEvaluatingJavaScriptFromString:usernameScript];
上面的代码将在用户Gabriele
中插入Gabriele
。
沿着相同的路径,您可以轻松地进行并通过javascript注入自动与网页进行交互。
登录后,您可以监视当前URL,直到重定向到达所需的位置。 为此,您必须实现UIWebViewDelegate
的webViewDidFinishLoad:
方法,每次Web视图加载页面时都会调用该方法
- (void)webViewDidFinishLoad:(UIWebView *)webView {
NSURL * currentURL = webView.request.mainDocumentURL;
if ([currentURL.absoluteString isEqual:desideredURLAddress]) {
[self performScraping];
}
}
此时,您可以执行实际的抓取。 假设您想获取id为foo
的div
标签的内容。 这就像做一样简单
- (void)performScraping {
NSString * fooContentScript = @"document.getElementById('foo').innerHTML;";
NSString * fooContent = [self.webView stringByEvaluatingJavaScriptFromString:usernameScript];
}
这将在fooContent
变量中存储div#foo
的innerHTML
内容。
最重要的是,在UIWebView
注入javascript,你可以控制和抓取任何网页。
为了获得额外的快乐,您可以在屏幕外执行所有操作。 为此,请分配新的UIWindow
并将UIWevView
添加为其子视图。 如果您从未使UIWindow
可见,则上述所有内容都将在屏幕外进行。
请注意,此方法非常有效,但由于您要加载每个网页的整个内容,因此可能会消耗资源。 然而,这通常是必要的折衷,因为基于XML解析器的其他方法可能不充分,因为HTML页面经常是格式错误的,并且大多数XML解析器只是严格地解析它们。
在您尝试做的事情中,iOS或Objective-C没有特定的内容。 如果您知道如何处理HTTP响应并知道如何检测登录页面,那么当您检测到响应是您的登录页面时,您所要做的就是解析响应并将凭据提交到登录终点。 在开始之前,请阅读NSURLConnection上的文档。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.