如果您打算用RN编写某个站点的第三方APP,但该站点不提供可以返回JSON的接口,则必须自己捕获和解析页面。
首先,需要明确的是,RN既不是浏览器,也不是节点。 也就是说,有些js库不能直接拿来使用。
HTTP请求
RN提供了frisbee和axios等Fetch API和XMLHttpRequest API,也可以使用基于这两个库的辅助软件包库,因此在RN下提出HTTP请求并不是问题。
HTML分析
目前最容易使用的js html parser应该属于cheerio,是否可以在RN上使用? 试试吧。
首先,安装cherrio。 请注意,需要v0.22.0。 稍后说明)。
使用方法:
很遗憾,发生了错误:
这是因为cheerio的htmlparser2依赖于节点中内置的库。 但是,这个可以解决。 理论上,只要这些依赖关系库不依赖于更基础的接口,就可以通过npm安装这些依赖关系。
再刷新一次,我发现cheerio已经可以正常使用了!
其实这个问题在cheerio的issues上讨论过。 https://github.com/cheerio js/cheerio/issues/1058。 有些人为了解决这个问题得到了另一个库cheerio-without-node-native,这个分裂的版本质量很难保证,所以不仅没有必要,而且非常差。 作者的见解如下
youcaninstallthemissingpackagesfromnpm (事件,流和实用工具Afa ICT ) andtheywillbeautomaticallypickedup。
iwouldnotrecommendtheusageofaforkasitwillmakeitdifficulttotrackdownissuesandwilldelay,if not prevent,patches for bugs。
至于为什么只能使用cheerio@0.22.0,在随后的版本中,cheerio引入了parse5,但parse5依赖于stream.Writable,它是用npm安装的streario
测试
测试尤为重要,因为网页随时可能发生变化。 在此,为了进行简单的黑盒测试,以获取简单用户数据的代码为例。
必须安装node-fetch才能在node环境中使用fetch。 RN默认情况下安装了jest,使用它进行测试吧:
运行测试:
获取网页数据的另一种黑色技术
除了分析传统的HTML请求外,在某些情况下还可以使用类似PhantomJS的计划。 优点是可以很好地避免一些限制,降低分析的难度。 RN当然不能使用PhantomJS,但是有WebView。 可以用injectedJavaScript注入js,然后在postMessage中返回数据。 例如,用于获取页面内视频链接的代码:
PS .谨慎使用该方法,首先是WebView的消耗资源太大,其次是测试困难,缺乏稳定性。
本文转载自异步社区