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

2012-12-28 01:50:25 +08:00
 endintro
先描述下需求吧:用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,很不稳定,总是莫名就出错

--------------------
总之同步的时候我还是挺清楚的,变成异步我就糊涂了,哪位大神帮我捋捋。
这两个项目都很久没更新了,也没找到类似的代码例子。其实就是几行代码,但总是调不对很郁闷,真心求帮助啊
5074 次点击
所在节点    JavaScript
1 条回复
sogood
2012-12-28 08:50:24 +08:00
我也遇到这情况。最先也是用这两个 package,但满足不了需求。
最终解决方法是把 phantom.js 的逻辑写在单独一个文件里面,不使用那两个 package 了,再通过调用 child_process 模块去执行文件,通过该文件的不同返回来判断是否满足条件,要用到 phantom.js 的 evaluate.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/56033

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX