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

时间:2021-2-20 作者:admin

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

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

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

用python的代码来解释就是,调用了webInstace库里面的shell方法,传入一个data参数然后再解析一下。鼠标放在这个方法的上面,会显示这个方法的库,点进去
【Python 爬虫简单的JavaScript逆向实战】抓取中国电影票房的数据
这下彻底看不懂了,看不懂没关系,我们之间把这个库扒下来,然后利用execjs这个库直接解析就行,我们传入个data参数就好。
不懂execjs用法的朋友可以参考一下这个篇文章execjs的使用
我用的是pycharm,不会配置node.js环境的朋友可以参考一下这篇文章Pycharm配置node.js

代码实现
我们把这个库复制下来随便命名为一个js文件,然后再文件的表头添加一下这个行代码
global.navigator={ userAgent: 'node.js', };
【Python 爬虫简单的JavaScript逆向实战】抓取中国电影票房的数据
之后直接用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()

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

附带上代码运行的结果
【Python 爬虫简单的JavaScript逆向实战】抓取中国电影票房的数据

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

声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。