• 空气质量数据爬取-checkpoint.ipynb


    - 分析:
    - 1.改变页面中的查询条件,然后点击查询按钮,通过抓包工具捕获相关的数据包,最终定位到了想要的空气质量数据对应的数据包
    - 2.该数据包中发现:post请求携带了一个动态变化且加密的请求参数d,并且请求到的数据也是一组密文数据。
    - 3.发现点击了查询按钮后发起了一个ajax请求,该请求帮我们请求到的相关加密的响应数据。
    - 4.通过火狐定位到搜索按钮绑定的click的点击事件(getData)
    - 5.剖析getData函数的实现:
    - type=="HOUR"
    - getAQIData();getWeatherData();发现了这两个函数的调用
    - 6.getAQIData和getWeatherData函数的剖析:
    - 这两个函数的实现几乎一致,只有method变量赋值是不一样:GETDETAIL或者GETCITYWEATHER
    - param的字典:有4个键值对(city,starttime,endtime,type)
    - 调用了getServerData(method,param,匿名函数,0.5)函数
    - 7.剖析getServerData函数的实现:
    - 在谷歌的抓包工具中做全局搜索,定位到了getServerData函数的实现。但是该函数的实现被加密。该加密方式叫做JS混淆。
    - 8.JS反混淆:将js混淆的密文以原文的形式展示。推荐的解密网址:http://www.bm8.com.cn/jsConfusion/
    - 9.getServerData反混淆后的代码进行剖析:
    - getParam(method, object);改方法的参数二object==param,并且该函数的返回值是步骤2中动态变化且加密的请求参数d的value值。
    - decodeData(data);是将加密的响应数据进行解密的。
    - 10.需要通过python调用js的相关代码:
    - PyExecJS:可以让python对js代码进行模拟运行。
    - 环境的安装:
    - pip install PyExecJS
    - 安装nodeJS的环境
    import execjs

    node = execjs.get()

    # Params
    method = 'GETCITYWEATHER'
    city = '北京'
    type = 'HOUR'
    start_time = '2018-01-25 00:00:00'
    end_time = '2018-01-25 23:00:00'

    # Compile javascript
    file = 'test.js'
    ctx = node.compile(open(file, encoding='utf-8').read())

    # Get params
    js = 'getPostParamCode("{0}", "{1}", "{2}", "{3}", "{4}")'.format(method, city, type, start_time, end_time)
    params = ctx.eval(js)
    print(params)
  • 相关阅读:
    Hosts知多少?
    Google 谷歌网页搜索, 学术搜索
    机器学习是什么?
    SCI/EI期刊投稿 Reply Letter 常用格式总结
    解决Javascript中$(window).resize()多次执行
    Jquery使容器自适应浏览器窗口
    java中GET方式提交和POST方式提交
    java调试打断点和不打断点执行结果不一致问题解决
    EasyUI combobox的panelHeight自动高度
    跨服务器查询信息的sql
  • 原文地址:https://www.cnblogs.com/zhang-da/p/12346675.html
Copyright © 2020-2023  润新知