安全小黄鸭 10月23日 23:53
PhantomJS页面关闭导致抓取超时的解决方案
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文探讨了在使用PhantomJS进行网页抓取时遇到的超时问题,该问题由页面主动调用`window.close()`函数引起。当页面关闭时,PhantomJS后续的事件监听和执行会失效,导致程序阻塞并触发Python的超时机制。文章提出了两种修复方案:一是利用PhantomJS的`onClosing`事件来捕获页面关闭通知,并在关闭前执行必要的逻辑;二是采用Hook机制,通过重写`window.close`函数来控制页面的关闭行为,确保抓取过程的正常进行。文中还附带了相关的代码示例,并提及了因文章内容敏感被删除的经历。

🎯 **问题根源分析**: PhantomJS在解析含有`window.close()`等主动关闭页面代码的网页时,会因页面过早关闭而导致后续的`page.evaluate`、`page.onCallback`等操作失效,进而引发程序阻塞,最终触发Python的超时错误。

💡 **`onClosing`事件解决方案**: 利用PhantomJS提供的`onClosing`事件,可以在页面即将关闭时收到通知,从而有机会在页面完全关闭前执行预设逻辑,如数据保存或退出操作,避免程序长时间阻塞。

🪝 **Hook机制的替代方案**: 另一种有效的解决方案是采用Hook机制,通过重写`window.close`等函数,在调用原生关闭方法前插入自定义逻辑,例如阻止关闭或执行其他必要操作,以确保抓取任务的完整性。

Fr1day 2017-09-04 20:06

又一发漏抓案例

遇到的问题: phantomjs解析的时候,超时严重导致漏抓。

简化页面内容如下:

通过伟大的注释调试法,可以发现问题在这行代码里:

动态分析时会主动去执行行内绑定的代码,即:window.close()关闭了页面之后,PhantomJS后续绑定的事件都会失效,比如page.evaluatepage.onCallbackphantom.exit。没有执行exit函数,一直阻塞导致触发python的超时——狗带。

修复方案:
在执行关闭页面的时候,PhantomJS的onClosing事件可以收到通知,示例代码如下:


还可以通过Hook来解决这个问题:


案例代码:

<script type="text/javascript" language="javascript">

function BtnPsw_onclick() {

window.open("../Login/UpdatePass")

</script>

<form name="form1" method="post" action="" id="form1">

用户名:<input name="UserName" type="text" id="UserName" class="logintext"><br/>

密码: <input name="Password" type="password" id="Password" class="logintext"><br/>

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="1222">

<input name="LoginButton" type="button" id="LoginButton" value="登 录" class="lbotton">

<input name="login" type="button" value="退 出" class="lbotton" onclick="window.close()">

<input name="UpdatePwd" type="button" value="修改密码" class="lbotton" onclick="BtnPsw_onclick()">

</form>


上次推送的文章因为关键字被干掉了,改天我折腾好博客再发吧...hexo搞起来心好累...


阅读原文

跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

PhantomJS 网页抓取 超时 window.close onClosing Hook Web Scraping Timeout JavaScript
相关文章