在服务器端扒数据快是快,可惜现在很多网页都会用ajax加载数据,明明页面上能看到的东西,拉回来的HTML里面却没有。我想问有没有服务器端能解释javascript并执行的。
虽然我也可以分析ajax的请求,分析javascript的动作 来拿回自己想要的数据。但是万一,人品极差的碰上了乱写的js或混淆过的Js,我可没有那么多心情。
浏览器,其实浏览器就已经把各种东西渲染好了,我能否利用浏览器用js来扒呢?
想法一,要分析很多页的数据,用iframe分别加载
想法二,js不能跨域操作和读取,利用host 文件重定向,欺骗一下js
大致步骤
1. 到host文件重定向 你要分析的域名(例如m.yuk.com)到127.0.0.1
2. 这时访问 m.yuk.com/fetch.html, 其实就是访问本机
3. 等这个fetch.html在浏览器上加载完后,到 host 文件将刚才的重定向注释掉
4. 各种清除DNS缓存,否则你是读不到真正网站的内容的。
5. 这时点击 fetch.html 上的某个 button,将 iframe src 指向要分析的页面,如 m.yuk.com/item_123.html,这时DNS会解释到真正的网站上
6. iframe 绑定 onload 事件,内容加载完后就会自动执行,分析页面数据的主要逻辑在这个步骤里
7. 分析完一个页面,就将 iframe src 指向下一个要分析的页面,加载完后又会触发 onload 事件,循环,直到所有页面分析完。。。
要注意的地方
找了两个著名的购物网站来试,效果不错,用起jquery来读隐藏得多深的数据都轻易易举,不过还是发现一些要注意的地方:
1. water fall
如果网站用了water fall 效果,页面需要滚动下来才会把内容加载完,引申开来,凡是要跟用户互动(滚动,点击,输入,或要等一段时间)再加载的内容,你需要在iframe中模拟这些事件。时间原因没有各个测试。
2. 一次只能处理一个域名
正常情况下,你这个假冒的m.yuk.com/fetch.html中的js只能处理m.yuk.com下的数据,不能跨域(www.esleSite.com)甚至跨子域(k.yuk.com)和父域(yuk.com)。除非父域或子域显式设置了 document.domain,而你的js程序也设置了一样的值,那才有可能跨到这些域上去。
所以正常情况下,用这种方法只能半自动操作,幸好大部分网站都不会有太多子域名。
3. 不能访问得太频繁了,小心对方把你列为黑名单。
与服务器端比较
js方式更适用于有复杂js行为或数据的网站,它的缺点是效率没有服务器快,加载图片 CSS JS等会消耗时间,而且也做不到完全自动化。