V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
sergiojune
V2EX  ›  Python

请求网页时,怎么给我返回了一段 JavaScript 代码(cookie 爬虫)

  •  
  •   sergiojune · 2019-03-19 16:02:40 +08:00 · 4539 次点击
    这是一个创建于 2070 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天给大家带来的是一个论坛网站,牛仔俱乐部-努比亚社区,

    网址为:https://bbs.nubia.cn/

    image

    如果你想要获取这个网站的源代码的话,必须要先获取一个 cookie,其字段名为:acw_sc__v2,你是不是不相信?爬取网站还需要获取 cookie 值才可以?说实话,我刚开始爬的时候我也不相信,直到我运行请求代码,一看,给我返回这个:

    image

    这是什么啊,一段 JavaScript 代码,很容易地就可以看到下面有个 setCookie 的方法,这不就是我刚才说的需要获取的 cookie 的字段吗?如果你看到这,留下了没技术的眼泪的话?别怕,我劝你擦干眼泪,继续看下去,你会发现新大陆!

    我们首先在 chrome 看看这里网站的请求先,打开 chrome,打开开发者工具,输入网址: https://bbs.nubia.cn/(需要先清除 cookie),你可以看到下面这个东西:

    image

    是不是呆住了?这是 debug,明明什么都没按啊,如果你按跳出这个函数的话,可以暂时跳出,不过等到运行多几行代码的话,他会运行到一个无限执行 debug 的函数,让你永无翻身之日,一直在 debug 转动。

    image

    那怎么办?莫慌,其实这里运行代码就是我们在上面第一次请求这个网站给我们返回的 JavaScript 代码,那么我们可以把刚才响应回来的代码复制出来,写成 html 文件,使用 chrome 浏览器打开。

    如果你把 那段代码展开的话,打开的时候就会无限进行刷新,直到浏览器崩溃。

    image

    这里是代码在执行过程中使用正则检测你把代码展开了,所以就会无限进行刷新,这叫做内存爆破,是不是又 get 新知识?

    所以我们直接原样复制进去,在打开 chrome 进行调试。

    但是,当我们一打开 开发者工具,还是会立刻弹出 debug 页面

    image

    这又是为什么呢?我们根据右边的调用栈看看是怎样执行的,查看调用栈,可以看到这个函数:

    image

    如果你是学习过 JavaScript 的话,很容易就知道 setInterval 是个设置每隔一段时间就执行相应操作的函数。所以他这里每隔一段时间就会执行函数,用于检测用户有没有打开开发者工具,这个太猛了,具体原理我现在还不知道,如果你知道的不防在下面留言分享给大家。

    知道了,之后,我们直接在原文件找到这个定时设置语句给删除就可以了。删除了之后,还是会执行这个 debug 语句,我们继续把这个执行给删除。

    image

    现在就不会出现 debug 了,但是有一个新的问题,出现,页面会不断刷新,也是一个定时操作,这时该怎么办呢?因为是一个刷新操作,每次刷新必然会执行里面的 JavaScript 代码,所以不妨随便打个断点,看看调用栈,这里我比较有经验,所以就在这里打了个断点

    image

    因为这个 relaod 函数就是一个刷新页面的函数,所以直接在这里点击,可以肯定这个函数会被执行,如果你打的断点没有被执行,可以多打几个断点,总会被执行的,这个不需要担心。

    当断点被执行到时,你就可以查看右边的调用栈了,很容易就找到这个地方

    image

    image

    这个 setTimeout 也是一个定时执行,不过他只执行一次,相当于定时炸弹。又因为每次都会 reload,所以这个炸弹在每次刷新的时候就会继续新的炸弹,才会有刚才的不断刷新,了解了原理之后,那么我们就把这个 setTimeout 给删除即可。

    这时候,再次刷新网页,就什么阻力都没有了,是不是感觉来到这一步不容易?哈哈,爬虫就是这样,与反爬死坑到底,不服就干,看谁更有耐心。

    这时候终于可以开始我们的调试之旅了,因为知道这个 JavaScript 执行之后会返回一个 cookie 值,所以接下来就是寻找生成的位置,如果你熟练的话,可以利用二分法来找,具体怎样找自己探索,因为我也不是很熟练。如果你不熟练的话,可以学我一样,因为代码就几百行,可以直接从第一行开始找。

    image

    如果你认真找,不用多久,很快就可以发现这个,这个 arg2 就是我们需要找的 cookie 的值,所以接下来可以在这里打断点,看看具体的执行步骤。

    image

    可以看到,通过传一参数,使用这个函数就可以完成加密了,根据这个函数的函数名是 hexXor,可以知道是一个 Xor 加密,想知道原理的可以看看这篇文章: http://www.ruanyifeng.com/blog/2017/05/xor.html,我们也可以根据 JavaScript 代码直接转成 python 代码也可以,不难。

    通过调试发现,这里面需要两个参数,一个是加密的信息,一个是 key

    image

    image

    加密的信息是在很容易就发现,是从这里生成的

    image

    所以也可以在这里打断点,再刷新一下,就可以看到加密信息是由这个函数生成的。

    image

    这里的 JavaScript 代码也很容易,也可以直接翻译成 python 代码。而其参数需要的是 arg1,这个变量在代码第一行就声明了,所以在获取的时候,可以使用正则获取。

    接着就是 key 的获取了。直接搜索这个 key 的变量,很容易就找到这个

    image

    image

    加密函数很长,但是也是可以自己转 python 的,难度也不大。

    在经过我多次测试之后,发现这个 key 是固定的,所以无需自己实现这个函数,可以直接取这个值即可。

    现在大功告成,已经可以获得所需要的 cookie 值了,是不是觉得非常不可思议,一路走过来都不容易。

    image

    不过这里有个 bug,就是有时还是获取到 JavaScript 代码,但是多运行几次还是可以正常获取到 html 源码的,由于自己只是获取这个值而已,能成功即可,所以没有研究下去,如果你知道原因,也可以在留言区告诉我。

    最后总结下遇到各种挑战:

    1. 代码展开会无限刷新,内存爆破,如果你认真自己调试的话,会发现里面有几个正则,有些是用来匹配函数的,用于判断有没有展开代码的,展开了就代表有人想搞代码了,所以就会无限刷新。

    2. 设置定时与刷新网页,使网页无限刷新。这个对我们来说调试问题不大,毕竟每次刷新我们都可以断点调试代码

    3. 设置定时检测有没有打开开发者工具,这个才是最厉害的,检测到的话就胡无限 debug。

    最后就没有啦,如果你需要源码的话,可以在我的 GitHub 上获取,地址为:https://github.com/SergioJune/Spider-Crack-JS/tree/master/nubiya_bbs

    如果对你有用的话,还请给个 star,我会一直更新下去,你有什么需要破解的网站也可以提 issue

    目前还更新了拼多多的搜索参数 anti_content 和另一个更加厉害的 cookie 反爬,也是属于这个 Incapsula-CDN 的,难度比今天这个难上不少,由于个人问题,暂时只能每周讲解一个,请谅解。

    原创不易,希望能给个赞,给个 star,支持下继续写下去。

    本文仅用于交流学习,请勿用于非法用途,后果自负!

    首发地址:请求网页时,怎么给我返回了一段 JavaScript 代码

    image

    第 1 条附言  ·  2019-03-19 19:48:35 +08:00
    不知道这个怎么是标题党?难道你们眼中容不得半点沙子?没有看内容?你不喜欢可以不扫啊,我又没有强制你。欢迎来喷,喷了我好屏蔽。我就偏要发,气死你们。
    18 条回复    2019-03-23 18:28:07 +08:00
    wfd0807
        1
    wfd0807  
       2019-03-19 16:31:51 +08:00
    。。。
    HuasLeung
        2
    HuasLeung  
       2019-03-19 16:35:08 +08:00
    ……什么鬼
    demo
        3
    demo  
       2019-03-19 16:37:56 +08:00
    这个反爬很强,这个爬虫更强!
    NekoPr
        4
    NekoPr  
       2019-03-19 17:22:22 +08:00
    0.0 v2 支持简书的图窗?,,
    AX5N
        5
    AX5N  
       2019-03-19 17:25:24 +08:00
    标题党真恶心
    kakudesu
        6
    kakudesu  
       2019-03-19 17:26:29 +08:00
    斗智斗勇。。
    x7395759
        7
    x7395759  
       2019-03-19 18:02:28 +08:00
    直接拉到最下面,看到二维码,放弃
    duola
        8
    duola  
       2019-03-19 18:10:09 +08:00
    前面都是王者,最后二维码。
    whoami9894
        9
    whoami9894  
       2019-03-19 18:45:05 +08:00
    虽然是推广,不过内容不错,这反爬真的很骚
    Tomotoes
        10
    Tomotoes  
       2019-03-19 18:48:52 +08:00 via Android   ❤️ 2
    CodeDeer
        11
    CodeDeer  
       2019-03-19 19:34:39 +08:00
    @Tomotoes 好东西收藏了
    AlisaDestiny
        12
    AlisaDestiny  
       2019-03-19 19:35:09 +08:00
    果然是道高一尺魔高一丈。
    murmur
        13
    murmur  
       2019-03-19 19:52:41 +08:00
    虽然是推广,不过这个混淆也是流批,一般的混淆还停留在压缩的层面,这是直接在恶心人
    Sparetire
        14
    Sparetire  
       2019-03-19 20:13:59 +08:00 via Android
    这反爬和我写的这个库一个路子啊
    https://github.com/ta7sudan/secan
    检测调试工具,循环断点,检测无头浏览器等等。。不过代码略垃圾。。
    给自己博客挂了个,可以看效果
    https://129.204.8.8
    自签证书没域名没备案。。
    Chikenkk
        15
    Chikenkk  
       2019-03-20 02:22:25 +08:00
    有没有研究搜索引擎的反爬呀,楼主大大
    huaerxiela6
        16
    huaerxiela6  
       2019-03-23 15:51:17 +08:00
    @Sparetire 重写 window.ave ?
    Sparetire
        17
    Sparetire  
       2019-03-23 16:06:20 +08:00 via Android
    @huaerxiela6 没有,因为混淆工具都不对属性混淆,所以手动处理了下。。window 没有 ave 这么个属性
    huaerxiela6
        18
    huaerxiela6  
       2019-03-23 18:28:07 +08:00
    @Sparetire 我知道啊,你不是把 w=window,w.ave=w['eval']嘛,重写 window.ave ,你的 debugger 就没了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5787 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 01:46 · PVG 09:46 · LAX 17:46 · JFK 20:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.