Android 模拟登录网页—脚本爬取数据

这篇主要来讲下近期做的一个项目-客户端爬取网页数据,用以向客户个性化推荐产品。那么怎么在Android客户端上将浏览的网页爬取,提取有价值的数据呢?请耐心看下去.

一.爬取介绍

首先让我们来了解下爬取这个东西。 一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值,内容一般分为两部分,非结构化的文本(e.g. HTML网页),或结构化的文本(e.g. JSON数据)。
这边要特殊介绍下HTML网页。HTML基本上是传统爬虫过程中最常见的,也就是大多数时候会遇到的情况,例如抓取一个网页,得到的是HTML,然后需要解析一些常见的元素,提取一些关键的信息。HTML其实理应属于结构化的文本组织,但是又因为一般我们需要的关键信息并非直接可以得到,需要进行对HTML的解析查找,甚至一些字符串操作才能得到,所以还是归类于非结构化的数据处理中。

因为我这期项目做的就是跟HTML网页相关,所以我很关心网页内容的来源,以及对应的解析爬取方式。
来源:

  1. 网页包含内容。一般来讲基本上是静态网页已经写死的内容,或者动态网页,采用模板渲染,浏览器获取到HTML的时候已经是包含所有的关键信息,所以直接在网页上看到的内容都可以通过特定的HTML标签得到
  2. JavaScript代码加载内容。这种情况是由于虽然网页显示时,内容在HTML标签里面,但是其实是由于执行js代码加到标签里面的,所以这个时候内容在js代码里面的,而js的执行是在浏览器端的操作,所以用程序去请求网页地址的时候,得到的response是网页代码和js的代码,所以自己在浏览器端能看到内容。
  3. Ajax异步请求。这种情况是现在很常见的,尤其是在内容以分页形式显示在网页上,并且页面无刷新,或者是对网页进行某个交互操作后,得到内容。

=========================
解析方式:

  1. CSS选择器。现在的网页样式比较多,所以一般的网页都会有一些CSS的定位,例如class,id等,或者我们根据常见的节点路径进行定位。e.g. #id .class
  2. XPATH。XPATH是一种页面元素的路径选择方法,可以通过路径表达式对XML文档的节点进行定位。 比如—//*[@id=”finance”],意思是找寻所有节点符合id为finance的节点。
  3. 正则表达式。 用标准正则解析,一般会把HTML当做普通文本,用指定格式匹配当相关文本,适合小片段文本,或者某一串字符,或者HTML包含javascript的代码,无法用CSS选择器或者XPATH。

介绍完这些,看官们如果还有些疑问,可以去网上去丰富一下以上提的点,接下来,看Android客户端对爬取的实现

二.客户端实现爬取

实现原理:在Android界面上,开启一个webview,加载比如某邮箱或者某登录网站的h5页面,同时在 h5页面加载完成后注入需要的脚本(可能多个,可依情况拼接注入),脚本会去监听用户的登录动作,从而拿到用户session,去爬取用户需要的数据,再通过js调native函数,展示给用户!
这边注入又分两种方式:静态与动态

  1. 静态:在onPageFinished()方法中,读取需要注入脚本文件,字符串拼接后,使用webview.callJavascript(“javascript:”+jsStr,new ValueCallback())注入 **
  2. 动态:在onPageFinished()中,使用webview.loadUrl(“javascript:”+jsUrl);该方式可能会导致三星,魅族手机 libc奔溃,我偶尔会遇到!

由于脚本内容涉及公司开发机密,目前不公开,大概实现思想:就是根据你所爬取的网页,根据其特性,再符合你的需求,通过CSS选择器,以及Ajax请求,去模拟操作,得到数据并提取。因为我脚本是通过javascript写的,通过jquery库去模拟URL请求,得到data, 这时候的data就是平时看到网页内容的源代码,依据上面提到的三种解析方式,基本都可以实现。

三.脚本更新

因为HTML网页是来自各个公司,不受自己控制,如果其版本改动,我们所写的脚本不符合改动后的网页爬取,这时候怎么办呢?没关系,我们在客户端注入脚本时,对我们的脚本做线上版本的更新,保证脚本在后续操作上的可行性!下面是脚本的安装与热更新流程图,这边就不多说了!
安装脚本

安装脚本

更新脚本

更新脚本

脚本爬取的介绍到这里就告一段落了,后续会继续优化流程,优化爬取策略,有兴趣的朋友可以找我讨论下,谢谢!

如果觉得此文不错,麻烦帮我点下“喜欢”。么么哒!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,285评论 0 3
  • HTTP基本原理 URI、URL、URN(Uninform Resource) URI(Identifier):统...
    GHope阅读 2,118评论 2 26
  • 没有被正确同步的含义是什么 没有正确同步的代码对于不同的人来说可能会有不同的理解。在Java内存模型这个语义环境下...
    竹天亮阅读 474评论 0 0
  • 遇见最美好的回忆~ 七年时间弹指一挥间,改变了容颜,不变我们的内心,不管未来如何,你们永远在我心中~给我温暖和感动...
    讷言自律阅读 190评论 0 2