自己无聊的时候做了一个微博爬虫,当初开始做的时候搜了很多功课,对于异步加载的内容,貌似模拟浏览是唯一的解决方案??于是我选用 casperjs 。虽然开发出来了,但是总结开发过程遇到这么几个问题。
1.微博很多大 V 发了条成千上万的微博,要是一直模拟下拉操作,浏览器界面越来越长,运行越来越慢,内存占用越来越高,测试过单个实例运行到大概异步加载 3000+条的时候,加载不动了。我不知道是内存不够了还是网络 io 问题,请问这个有什么解决方案吗?
2.casperjs 的并行处理。我当初想着能不能在一个节点中实现同时爬取微博,个人资料和粉丝。 casperjs 官网说并不原生支持,但是你可以创建多个实例试试看。于是我真的创建了三个实例。。。发现也可以跑。。。我想问有什么其他解决方案吗,我觉得我这样挺蠢得其实。。。
3.cluster 模块。我想用下 node 原生的负载均衡,但是 cluster 只能创建 nodejs 子进程。最初的想法是每个子进程再创建一个 casperjs 子进程,我是用 socket 作为进程通讯方式,就这样的话有多少 worker 我就得开多少端口,这种方案,我又觉得很蠢了。。。不知道有没有更好的解决方式
4.和谐问题。貌似新浪现在不用验证码卡人了,现在应该到了某个临界值,你模拟点击粉丝啊微博等页面,有很大可能会跳转到 http://weibo.cn/pub 这个页面,但是时机不定,虽然我写了跳转后校验 url 然后重连,但是有时候前一个页面所有的点击事件都会跳到这个网址,及其影响效率,但是不知道应该怎么防止跳转,开页面随机等待事件和一段时间后冷却我都有,但还是会有这种情况,不知道咋办。
’
滴滴滴
@superhuai 什么鬼,机器人?
@Cherokeeli 不是 昨天抄袭markdown的编辑器
- casper是对phantom的包装,phantom是对webkit的包装。也就是你的不断下拉就是模拟浏览器,所以你的问题等同于浏览器拉多了的问题
- 理论上你可以用node spawn出无数多个casper进程达到并发,但一定会收到本机硬件限制(cpu mem net io)
- node进程间有通信机制的,你好好看下cluster的api
- 这个就是微博的防抓机制了,是个斗智斗勇的过程,祝你好运~
解决方案,你要是有足够的抓取破解兴趣,建议放弃casper,直接模拟http请求抓,性能就不是问题了,但分析成本大大的。还是要看你是跑跑玩玩还是产品级需要。
casper.thenEvaluate(function (term) {
document.querySelector('input[name="q"]').setAttribute('value', term);
document.querySelector('form[name="f"]').submit();
}, {
term: 'xxx'
});
这个term是不是就是一个关建字?
@yakczh 是的,作为一个form中input关键字,填好后submit
@Cherokeeli 我看了眼Cola:没有模拟浏览器,直接模拟http请求