使用iOS模拟机(Simulator)获取“查看网页源代码”所看不到的运行时HTML源代码

现在的网页,多数已经采用了动态加载在线数据,并展示的方式处理来自服务器上的数据,你会在主题列表页面看到的是“加载更多”新兴 Javascript 运行开关,而不是“更多”传统式链接。比如下面的在第一页上展示相对固定的行数,在行末会有“获取更多…”可点击开关:

点击几次“获取更多…”之后,终于得到了完整的全部主题列表,如下图:

这样的网页,我们使用传统的浏览器“查看网页源代码”功能,一般是不包含全部数据的,只包含了第一页,即没有点击“加载更多”之前的样子对应的网页源代码(HTML代码)。

那怎么获得全部的HTML源代码呢?方法当然有很多,比如:
1、砸钱给那些做爬虫有关人员,让他们帮忙;
2、砸钱给官网,就说要购买他们的源代码或数据,呵呵,我说呵呵,小心被打骨折;
3、编写浏览器扩展代码,赶紧科学上网,去谷歌好好搜索一下,一定能行的,或是扒别人的扩展代码来瞧瞧,比如XXX下载……
4、……
5、使用 iOSUIWebView 进行亲自动手(DIY),做一回半手工爬虫;
6、锻炼你的人工智能(AI)“机器”,让它帮搞鼓励;
7、……

 

iOS 开发的同学,应该对 UIWebView 不陌生,这个用来做内置网页浏览器的部件,很多时候简直是太好用了,而且 UIWebView 还支持直接从 Objective-C / Swift 代码中向 UIWebView 部件发送指令,即我们常说的让 UIWebView 执行 Javascript 代码(欲了解更多,看官方文档或谷歌……)。

 

UIWebView 加载网页或是加载完动态数据后,我们可以向 UIWebView 发送获取(全部)网页源代码的 Javascript 指令,如下:

NSString *whatsThatWellGet = [UIWebView当前实例 stringByEvaluatingJavaScriptFromString: @”document.documentElement.outerHTML”]

嘿嘿,是不是很过瘾?另外把 outerHTML 改成 innerHTML 还可以获得不同的内容,自己测试,呵呵。源代码已经获得,怎么显示,那就太简单了,直接使用 NSLog() 就能把它打印出来……

 

然而,有时候可能源代码(whatsThatWellGet)太大,还是太……,NSLog() 并不能全部打印它,这也没准是当前 Xcode 版本的问题,苹果的技术有时候并不是所有的操作都可以获得结果的(比如试图播放到airplay,试图使用 airdrop,或是在 iTunes 中点击 获取按钮,或从浏览器向 iTunes 请求打开指定 iTunes 商品……呵呵了)。

 

但是这也并不难,可以把源代码(whatsThatWellGet)保存到文件,发送邮件,甚至这样,或者那样,方法还是超级多,无法一一列举。

 

我用这个半手工的操作,确实很方便,直接在 Xcode 里面调试获取,先给代码行增加断点,在获得源代码(whatsThatWellGet)后,在 whatsThatWellGet 变量操作行上设置断点,运行到断点(BreakPoint)时,直接鼠标移到变量上,看看下图,你应该很快明白的,字符变量内容框中,可直接上下滚动,全选择,拷贝,拿走, 不用客气。有时候你甚至会看到,还会多了很多在网页上不显示(隐藏)内容,意外吧?

先左红圈,再右红圈,再点眼睛或i 应该就会发生奇迹了,恭喜你啦,DIY 方法就是这么简单。

 

对了,差点儿忘记了,部分新人可能会问,代码怎么知道什么时候我完成了“加载更多”的动作?

说得确实也是,那好吧,给你的临时 DIY App 加个部署在顶层的“HTML快到碗里来”按钮,给按钮加上点击响应代码,并在里面设置断点。你手工点击完所有“加载更多”按钮之后,觉得已经获得了全部数据,那这个时候,就可以去点击“HTML快到碗里来”了。

 

当然,别忘记了,先创建一个 UIWebView 对象,并加到你的当前 view 上,你使用拖放部件的方法,应该也是没有问题的。当然啦,先准备好要爬的网页的链接,即URL,丢给 UIWebView 实例去加载它,这个基本步骤,如果不会,那赶紧科学上网,搜索谷歌,或是查询国内知名论坛,或是到开源网站上找代码……

 

铛铛……完成了。