zoukankan      html  css  js  c++  java
  • 猿人学python爬虫第一题

    打开网站。F12,开启devtools。发现有段代码阻止了我们调试

    好的。接下来有几种解决方法

    1- 绕过阻止调试方法

    方法1(推荐)

    鼠标放在debugger该行,左边数字行号那一列。右键选择不在永不在此处暂停

    再次点击恢复,就跳出该debbug了

    方法2 (抓包改返回)

    我用的抓包软件是burp,burp默认不拦截js请求。需要更改成拦截js请求。更改教程
    拦截对应代码的文件,将其中内容去掉,保证它发挥不出原本的功能就行

    2- 反混淆包含数据的请求代码

    经过上一步,我们可以正常调试代码了。这一步我们要找到包含价格数据的请求,然后爬取它。最后就大功告成!可是这个过程似乎并不顺利

    1. 找到含有数据的请求

    所以,只要传入m,还有page,就可以返回数据。关于m的生成,在后面

    1. 查看该请求调用堆栈

    2. 进入eval方法
      因为eval是除主程序外最先开始调用的。所以要找的代码在这里

    关于VM102647该文件:我认为这个文件就是传入eval的内容,然后调试器帮我们代码美化了下,就成为了这个文件。
    4. 代码反混淆
    官方js反混淆网址
    记得复制所有代码进去。不要漏掉底下下的request()。

    这是图片,拖动条拖不得
    3-分析m的生成

    抛开其中无关代码,只找有关m生成的

    var _0x2268f9 = Date.parse(new Date()) + 100000000, _0x57feae = oo0O0(_0x2268f9.toString()) + window.f;_
    0x5d83a3.m = oo0O0(_0x2268f9.toString()) + window.f + '丨' + _0x2268f9 / 1000;
    

    不难发现,需要找到oo0O0 函数的实现方法。其他要么就是系统自带,要么就是变量。我们先关注该函数是怎么实现的

    找到该代码位置,复制该行下来。
    丢进之前的反混淆网站上去,里面有代码美化功能

    这个网站解密要把一些其他的js标签,如<script>..<script> 将它们删除,只留下包含目标函数的js标签。然后去解密才可以代码美化。
    分析该函数代码,最后一行有个eval。
    ● atop 将base64代码解密
    ● window['b'] 包含base64代码,里面经过atop解密出一些js代码
    ● J('0x0', ']dQW') 一个混淆,拿到调试器控制台去运行发现是 "replacee" 这个字符串
    ● J('0x1', 'GTu!') 一个混淆,解密发现是 "mwqqppz" 这个字符串
    ● 'x27' + mw + 'x27' 就拿单引号包着这个变量。

    该代码的意思是,将字符串mwqqppz替换为 'x27' + mw + 'x27'

    运行 atob(window['b']

    运行atob(window['b'])[J('0x0', ']dQW')](J('0x1', 'GTu!'), 'x27' + '123456' + 'x27')

    不难看出,这就是一个简单替换。即
    windows.f = hex_md5(mv)

    将相关加密代码copy到本地
    在同文件中编写生成m的函数,以便于python调用该函数

    function get_m_value() {
        var _date = Date.parse(new Date()) + 100000000;
        var f = hex_md5(_date.toString());
        var m = f + '丨' + _date / 1000;
        return m;
    }
    

    编写python代码

    import requests
    import execjs
    import time
    requests.packages.urllib3.disable_warnings()
    
    
    def get_res(page_num, parm):
        url = f'https://match.yuanrenxue.com/api/match/1?page={page_num}&m={parm}'
        headers = {
            'Host': 'match.yuanrenxue.com',
            'Referer': 'http://match.yuanrenxue.com/match/1',
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36 Edg/94.0.992.50',
            'X-Requested-With': 'XMLHttpRequest',
            'Cookie': 'Hm_lvt_c99546cf032aaa5a679230de9a95c7db=1634894322; qpfccr=true; no-alert3=true; Hm_lvt_9bcbda9cbf86757998a2339a0437208e=1634894331; vaptchaNetway=cn; Hm_lvt_0362c7a08a9a04ccf3a8463c590e1e2f=1634894320,1634894605; Hm_lpvt_0362c7a08a9a04ccf3a8463c590e1e2f=1634894656; tk=2886305154209229651; Hm_lpvt_9bcbda9cbf86757998a2339a0437208e=1634900896; Hm_lpvt_c99546cf032aaa5a679230de9a95c7db=1634902874'
            }
        proxies = {
            'http' : 'http://127.0.0.1:8888',
            'https' : 'http://127.0.0.1:8888',
        }
        if page_num > 3:
            headers['Cookie'] = headers['Cookie'] + ';sessionid=1;'
            headers['User-Agent'] = 'yuanrenxue.project'
        resp = requests.get(url=url, headers=headers, verify=False, timeout=5, proxies='')
        if resp.status_code < 400:
            return resp.json()
        else:
            print("Error!!")
    
    def calc_m_value():
        with open('get_m.js', mode='r', encoding='utf-8') as f:
            jsdata = f.read()
            m_value  = execjs.compile(jsdata).call('get_m_value')
            result = m_value.replace("丨", "%E4%B8%A8")
            return result
    
    def calc_result(res_data):
        global _sum
        for item in res_data['data']:
            _sum += item['value']
    
    if __name__ == '__main__':
        _sum = 0
        m = calc_m_value()
        for page in range(1,6):
            res_data = get_res(page, m)
            calc_result(res_data)
            time.sleep(1)
            print(_sum)
        print(_sum/50)
    
    搞CTF
  • 相关阅读:
    【原创】开源Math.NET基础数学类库使用(01)综合介绍
    【原创】开源.NET排列组合组件KwCombinatorics使用(三)——笛卡尔积组合
    【原创】开源.NET排列组合组件KwCombinatorics使用(二)——排列生成
    apply,call,bind的区别
    javascript替换手机号中间4位
    css常见的概念
    关于URL编码/javascript/js url 编码
    jquery判断div滚动条到底部
    javascript中的array对象属性及方法
    localStorage和sessionStorage区别
  • 原文地址:https://www.cnblogs.com/beidaxmf/p/15456276.html
Copyright © 2011-2022 走看看