刚开始接触爬虫,随便搞了一个网站打算小试牛刀实战一下:PM2.5实时查询|PM2.5历史数据查询|PM2.5全国城市排名|PM2.5雾霾地图|中国空气质量在线监测分析平台|
刚打开网站一切都很正常,熟练点击F12,欸,怎么回事
一波查资料,原来如此:1. 快捷键ctrl+shift+i,或者2.chrome右上角三个点直接打开控制台,解决问题:
刚有一丝成就感,欸,怎么回事:爬虫这么难吗,每一步都有一个坎:
尝试点了几次下一步,怎么一直循环debugger,脑子晕了。又开始疯狂查资料。。。。终于进入今天的主题,原来这是无限debugger,专门防止我这种好奇宝宝。下面看看怎么解决这个问题:
不就是debugger吗,这可难不住我,chrome不是有自带的跳过debugger功能吗,来,选上:
欸,怎么不管用呀,怎么弹出了这么多debugger,仔细一看,哦VM,那估计是在eval中执行的代码:
看一下执行堆栈:
原来是断在了
(function(){}["constructor"]("debugger")())
这段代码的本质是调用了Function对象的constructor。查阅官方文档,可以看到详细解释:
new Function(functionBody)
new Function(arg0, functionBody)
new Function(arg0, arg1, functionBody)
new Function(arg0, arg1, /* …, */ argN, functionBody)
Function(functionBody)
Function(arg0, functionBody)
Function(arg0, arg1, functionBody)
Function(arg0, arg1, /* …, */ argN, functionBody)
当传入一个参数时,参数会作为函数体。因此这段立即执行函数的结果是实例化一个匿名函数,函数体为debugger。
这个知识点了解了,沿着执行堆栈继续向上找,找到了txsdefwsw()函数的调用,全局搜索一下,发现竟然搜不到这个函数的定义
但是有了一个新发现:txsdefwsw关键字出现在jquery.min.js中。
其中使用eval执行了一段函数,在返回值处加一个断点,把返回值复制出来看一眼,这不就是生成无限debugger的代码,一模一样:
用chrome自带的文件替换功能,将这段代码删除掉。操作过程如下图所示:
明天再更新。。。