社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

【Python 爬虫简单的JavaScript逆向实战】抓取中国电影票房的数据

卑微菜鸟小郭 • 3 年前 • 237 次点击  

开篇闲聊
最近也是看完了崔庆才爬虫52讲里面JavaScript逆向部分,里面介绍了从简单到复杂整个JavaScript逆向的方法,里面也有一些实战案例(可以练习的),跟着视频练习之后,虽然也成功了,但是跟着一步一步的分析,总是不知道自己哪里懂了,哪里不懂,就想着自己找个网站实战练习一下。偶然的机会跟学姐闲聊的时候学姐给我发了一个网站,让我练一下手。就有了下面的分析,因为是初次自己独立的进行JavaScript实战,难免会出现一些问题,期间也少不了大佬的帮助。

废话不多说了,请出我们今天的主角: 艺恩-中国电影票房数据

网站分析
抓包
首先我们先看一下document里面有没有数据
在这里插入图片描述
通过预览我们发现数据并没有在document里面,我们猜测数据可能是通过Ajax加载出来的,点到XHR选项,果然抓到了一个名为GetData的文件。
在这里插入图片描述
这个应该就是我们要的数据文件了,之后点开,发现是post请求,并且data里面没有加密参数。
在这里插入图片描述
在这里插入图片描述
心中一喜,这没有加密参数不是很简单吗,之后我们预览一下。
在这里插入图片描述
傻眼了,这也不是数据啊!猜测应该是JavaScript加密了,但是这也没办法搜索关键字,这怎么办呢。没办法只能用最笨的方法,找到发起程序这个选项。慢慢的一点一点的排除吧。
在这里插入图片描述
中间的send和ajax引起了我的注意,不管了点开看一下吧。来到了一个js文件,展开打断点,刷新
在这里插入图片描述
单步调试。发现了这样一段js语句,引起了我的注意
在这里插入图片描述
其中还有中文注释,这段js语句挺好懂的,大致的意思就是构建一个url,发送一个请求,成功发送就把data传过去,然后回调。我们不关心它是怎么请求又回调的,我们关心的只是这个data是怎么解析的。其中这句引起了我的注意
在这里插入图片描述

用python的代码来解释就是,调用了webInstace库里面的shell方法,传入一个data参数然后再解析一下。鼠标放在这个方法的上面,会显示这个方法的库,点进去
在这里插入图片描述
这下彻底看不懂了,看不懂没关系,我们之间把这个库扒下来,然后利用execjs这个库直接解析就行,我们传入个data参数就好。
不懂execjs用法的朋友可以参考一下这个篇文章 execjs的使用
我用的是pycharm,不会配置node.js环境的朋友可以参考一下这篇文章 Pycharm配置node.js

代码实现
我们把这个库复制下来随便命名为一个js文件,然后再文件的表头添加一下这个行代码
global.navigator={ userAgent: 'node.js', };
在这里插入图片描述
之后直接用python模拟请求即可。
附上源代码

import requests
import execjs

def get_data(YEAR):
    for i in range(14):
        data = {
            'year': YEAR,
            'MethodName': 'BoxOffice_GetYearInfoData'
        }
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 Edg/88.0.705.63'}
        url = 'https://www.endata.com.cn/API/GetData.ashx'
        response = requests.post(url,headers=headers,data=data)
        result = response.text
        print(result)

        with open("a.js","r",encoding='utf-8') as f:
            js = f.read()

        # 编译js代码
        resp = execjs.compile(js)

        # 调用方法
        response = resp.call('webInstace.shell',result)
        print(response)
        YEAR = YEAR + 1


def main():
    YEAR = 2008
    get_data(YEAR)

if __name__ == '__main__':
    main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

这里我只是把数据打印出来,后续的解析,朋友们可以自行选择方法。

附带上代码运行的结果
在这里插入图片描述

PS:这只是简单的一个JavaScript逆向实战,大佬勿喷哈。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/107842
 
237 次点击