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

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

1.爬取介绍

首先让我们来了解下爬取这个东西。
一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值,内容一般分为两部分,非结构化的文本(e.g. HTML网页),或结构化的文本(e.g. JSON数据)。

这边要特殊介绍下HTML网页。HTML基本上是传统爬虫过程中最常见的,也就是大多数时候会遇到的情况,例如抓取一个网页,得到的是HTML,然后需要解析一些常见的元素,提取一些关键的信息。HTML其实理应属于结构化的文本组织,但是又因为一般我们需要的关键信息并非直接可以得到,需要进行对HTML的解析查找,甚至一些字符串操作才能得到,所以还是归类于非结构化的数据处理中。

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

来源:

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

解析方式:

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

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

2.客户端实现爬取

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

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

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

3.脚本更新

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

更新脚本
Android 模拟登录网页—脚本爬取数据_第2张图片

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

你可能感兴趣的:(android开发)