反-反调试+Ajax请求,javascript渲染

之前实习有遇到很烦的反爬措施-反调试,当时不懂,领导就说是跳不过breakpoint断点,就用selenium+webdriver解决了,最近看了两篇推送,大神解开了我的疑惑。原来网站的反爬措施是反调试+ajax请求+javascript渲染
https://mp.weixin.qq.com/s/Ki8QZFhTRIlFwrIC9BkoQQ
https://mp.weixin.qq.com/s/-QCAs8BBq5klEyW3ofZ24w
了解常用的反爬措施点这里

JS反调试(反debug)

当爬虫工程师用f12去查看网页加载过程或者调试JS,这种操作太多了,有的网站就会增加反调试的策略。还是以国家药监局的网站为例,f12开始调试,就会暂停在’debugger’代码行,无法跳过。
反-反调试+Ajax请求,javascript渲染_第1张图片
反-反调试+Ajax请求,javascript渲染_第2张图片
常用的策略是:通过Call Stack找到把我们带入死循环的函数,重新定义。我们可以把这个函数在“Console”里面重新定义,比如把它重新定义为空函数,这样再运行它时就什么都不做,也就不会把我们带人陷阱。在这个函数调用的地方打个“Breakpoint”。因为我们已经在陷阱里面了,所以要刷新页面,JS的运行应该停止在设置的断点处,此时该函数尚未运行,我们在Console里面重新定义它,继续运行就可以跳过该陷阱。

这里查到一篇博客用Fiddler解决,但是鉴于教程较多,我就没采取这个方法,感兴趣的朋友可以去这里

  • 我的解决方法比较傻瓜式,其实解除断点就可以了
    反-反调试+Ajax请求,javascript渲染_第3张图片
    这之后就可以继续操作了,这种方法虽然可以防止无限循环命中debugger断点,但是也存在很大的缺陷,因为对于其他代码,我们还是需要断点调试功能的。所以这个方法仅限于静态分析。

  • 采用手动替换代码的方法,跟上面的Fiddler异曲同工。在Console里重新编写debugger函数,首先需要定义一个空函数,再将几个debugger函数重新定义,即可解决

  • 还有更简单的手动方法,只需要将几个debugger处都加上断点也可以

Ajax请求,js渲染

Asynchronous JavaScript & XML,Ajax是web开发的一种技术。

  • Ajax请求的步骤
    (1)创建XMLHttpRequest对象,也就是创建一个异步调用对象;
    (2)创建一个新的HTTP请求,并指定该HTTP请求的方式、URL及验证信息;
    (3)设置响应HTTP请求状态变化的函数;
    (4)发送HTTP请求;
    (5)获取异步调用返回的数据;
    (6)使用JavaScript和DOM实现局部刷新

    通俗的说就是在页面进行链接点击操作时,请求的url并未改变,只是网页的response进行局部的刷新,这在爬取的过程中必须想办法解决
  • 通过调取控制台发现翻页为post请求,从表单中我们发现了规律,即curstart参数跟页码对应,所以采用了拼接url的方式进行访问爬取

你可能感兴趣的:(爬虫)