抓取第三方网站数据

最近需要把某网站的统计数据聚合到我们自己的系统里,但是该网站没有提供标准API,所以就尝试自己抓取了一下。本文总结一下一般的方法
<!--more-->

分析服务地址

通常网站有2种做法,一种是后端渲染,直接把渲染后的完整界面呈现在浏览器;另一种前端是静态页面,通过ajax到后台取数据

后端渲染

这种网页抓取起来比较麻烦,因为结构不标准,需要从DOM里把需要的数据抠出来。node平台我推荐使用cheerio,API类似jquery,处理DOM比较方便

前端渲染

这种情况比较好处理,因为接口返回的数据结构一般比较规整,关键是要找到接口的地址。推荐使用chrome的dev console,切换到xhr标签,一般可以很容易找到需要的接口

处理鉴权

某些服务完全不鉴权,可以直接调用。麻烦的是大部分接口都需要鉴权,通常是校验用户身份

模拟登陆

最完美的做法是模拟登陆,先分析出登陆的服务地址,用charles代理,用浏览器实际登陆几次,尝试模拟登陆请求

不过这是理想情况,通常来说模拟登陆是很困难的。网站一般会用验证码,甚至https的方式来保护

登陆后复制cookie

所以更常见的方法,是先正常登陆,然后在chrome里查看普通http请求的header等信息,其中最关键的当然是Cookie字段,99%的网站都是用cookie来标识登陆用户。所以我们可以把普通请求的各种http header复制,这样一般都可以调通

推荐使用CocoaRestClient,用来测试发送http请求很方便

一般的网站,用复制cookie的方案都能搞定。但是也有一些比较麻烦的网站,会结合一些其他的安全方案,比如调用频率,校验ip等,这种只能具体分析,没有一定可行的做法

分析url

有时某些接口的请求参数包含在url里,比如:

http://www.xxx.com/apps/xxx/reports/load_chart_data?start_date=2015-08-09&end_date=2015-09-07&stats=trend_active_users

这个url里包含3个请求参数,通过构造url,可以实现不同的请求。关键是观察,一般的url都是比较容易发现规律的

csrf防御机制

某些网站,会在网页或url中放一个token来防止csrf,所以应对的方法是,找出此token,也放到request中

<script type="text/javascript"> $(function () { $('pre.prettyprint code').each(function () { var lines = $(this).text().split('\n').length; var $numbering = $('<ul/>').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('<li/>').text(i)); }; $numbering.fadeIn(1700); }); }); </script>

你可能感兴趣的:(抓取第三方网站数据)