V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
endintro
V2EX  ›  JavaScript

PhantomJs连NodeJs,搞不定异步啊,求帮助求帮助

  •  
  •   endintro · 2012-12-28 01:50:25 +08:00 · 5217 次点击
    这是一个创建于 4379 天前的主题,其中的信息可能已经有所发展或是发生改变。
    先描述下需求吧:用PhantomJs抓取某网站,需要先登录(模拟点击提交表单),确认登录成功后,访问一串固定格式生成的url

    PhantomJs本身是异步的,要以同步方式使用当初用 setInterval + flag标志位,每完成一步再执行下一步,这个没问题

    现在我想把Phantom作为node的一个模块来用,方便调度和存储,现成的实现有两个:

    phantomjs-node https://github.com/sgentle/phantomjs-node
    这个是异步的,全部通过回调来执行下个步骤。可能是我对这种模式不了解或者封装的说明不太清楚,搞不定的地方在于登录提交表单之后 (sendEvent('click',xx,xx) ), 没办法获取登录是否成功的状态,因为是异步的,点击之后自动跳转到新页面的过程不知道在哪里插入接下来的代码,也不知道在phantomjs-node下如何监听页面的状态变化事件。


    另外一个node-phantomjs-sync是基于phantomjs-node的 https://github.com/sebv/node-phantomjs-sync
    同步模式,顺序倒是清楚,但问题也在sendEvent('click',xx,xx)上,每次模拟点击之后,页面还是处在未登录的状态,不知道为啥?另外这个实现用了fibers,很不稳定,总是莫名就出错

    --------------------
    总之同步的时候我还是挺清楚的,变成异步我就糊涂了,哪位大神帮我捋捋。
    这两个项目都很久没更新了,也没找到类似的代码例子。其实就是几行代码,但总是调不对很郁闷,真心求帮助啊
    1 条回复    1970-01-01 08:00:00 +08:00
    sogood
        1
    sogood  
       2012-12-28 08:50:24 +08:00 via iPad
    我也遇到这情况。最先也是用这两个 package,但满足不了需求。
    最终解决方法是把 phantom.js 的逻辑写在单独一个文件里面,不使用那两个 package 了,再通过调用 child_process 模块去执行文件,通过该文件的不同返回来判断是否满足条件,要用到 phantom.js 的 evaluate.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3241 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 00:17 · PVG 08:17 · LAX 16:17 · JFK 19:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.