做了一个新浪微博的爬虫,用的 casperjs+nodejs,遇到了一些问题想请教大家
发布于 3 年前 作者 Cherokeeli 4977 次浏览 来自 问答

自己无聊的时候做了一个微博爬虫,当初开始做的时候搜了很多功课,对于异步加载的内容,貌似模拟浏览是唯一的解决方案??于是我选用 casperjs 。虽然开发出来了,但是总结开发过程遇到这么几个问题。

1.微博很多大 V 发了条成千上万的微博,要是一直模拟下拉操作,浏览器界面越来越长,运行越来越慢,内存占用越来越高,测试过单个实例运行到大概异步加载 3000+条的时候,加载不动了。我不知道是内存不够了还是网络 io 问题,请问这个有什么解决方案吗?

2.casperjs 的并行处理。我当初想着能不能在一个节点中实现同时爬取微博,个人资料和粉丝。 casperjs 官网说并不原生支持,但是你可以创建多个实例试试看。于是我真的创建了三个实例。。。发现也可以跑。。。我想问有什么其他解决方案吗,我觉得我这样挺蠢得其实。。。

3.cluster 模块。我想用下 node 原生的负载均衡,但是 cluster 只能创建 nodejs 子进程。最初的想法是每个子进程再创建一个 casperjs 子进程,我是用 socket 作为进程通讯方式,就这样的话有多少 worker 我就得开多少端口,这种方案,我又觉得很蠢了。。。不知道有没有更好的解决方式

4.和谐问题。貌似新浪现在不用验证码卡人了,现在应该到了某个临界值,你模拟点击粉丝啊微博等页面,有很大可能会跳转到 http://weibo.cn/pub 这个页面,但是时机不定,虽然我写了跳转后校验 url 然后重连,但是有时候前一个页面所有的点击事件都会跳到这个网址,及其影响效率,但是不知道应该怎么防止跳转,开页面随机等待事件和一段时间后冷却我都有,但还是会有这种情况,不知道咋办。

8 回复

@superhuai 什么鬼,机器人?

@Cherokeeli 不是 昨天抄袭markdown的编辑器

  1. casper是对phantom的包装,phantom是对webkit的包装。也就是你的不断下拉就是模拟浏览器,所以你的问题等同于浏览器拉多了的问题
  2. 理论上你可以用node spawn出无数多个casper进程达到并发,但一定会收到本机硬件限制(cpu mem net io)
  3. node进程间有通信机制的,你好好看下cluster的api
  4. 这个就是微博的防抓机制了,是个斗智斗勇的过程,祝你好运~

解决方案,你要是有足够的抓取破解兴趣,建议放弃casper,直接模拟http请求抓,性能就不是问题了,但分析成本大大的。还是要看你是跑跑玩玩还是产品级需要。

  casper.thenEvaluate(function (term) {
        document.querySelector('input[name="q"]').setAttribute('value', term);
        document.querySelector('form[name="f"]').submit();
    }, {
        term: 'xxx'
    });

这个term是不是就是一个关建字?

@soda-wy 我在stackoverflow上搜过,好像这个拉多了问题也没法解决。但是我想着既然一台电脑可能到达本机硬件限制,那我把casperjs实例布在多台机子上不就好了: ),反正我是按着多进程架构弄得。。。至于抓包,感觉学习曲线好陡峭。。我网上查过貌似也么有关于微博的抓包方案。我在github上面看到一个py的框架,也有爬微博,不过不懂py,不知咋实现的。

Cola框架

@yakczh 是的,作为一个form中input关键字,填好后submit

@Cherokeeli 我看了眼Cola:没有模拟浏览器,直接模拟http请求

回到顶部