11-py调用js

上一文我们写出了js代码来加密数据作为参数,当我们写爬虫时需要加密过的参数作为登陆凭证来get数据,那我们怎么调用js呢

execjs库

首先我们需要在py中创建一共js可以运行的环境,需要用到的库是------execjs库,安装命令:

bash 复制代码
pip install PyExecJS

然后可以通过execjs.compile(js代码)来初始化,将JavaScript 代码编译为一个可执行的对象:

然后用初始化对象.call(js核心代码函数名,[param1, param2]),这就是为什么我要把js核心代码封装成函数:

javascript 复制代码
result_func_js = js_exec.call('func_in_js', ['param1', 'param2'])  # 伪代码

我们可以将读取js代码 -> 初始化 -> 调用js函数封装成类:

javascript 复制代码
import execjs
import os
class JSExecutor:
    def __init__(self, js_file_path):
        if not os.path.exists(js_file_path):
            print(f'js代码不存在:{js_file_path}')

        with open(js_file_path, 'r', encoding='utf-8') as f:
            self.js_code = f.read()

        # execjs.compile() 将JavaScript 代码编译为一个可执行的对象
        self.js_code = execjs.compile(self.js_code)

    def call(self, func_name, *args):
        """
        封装python对js代码中函数的调用
        :param func_name: js代码中的函数名
        :param args: js代码中函数所需的参数
        :return: js中函数运行后的结果
        """
        return self.js_code.call(func_name, *args)


if __name__ == '__main__':
    # 加载js文件
    js_exec = JSExecutor('js路径.js')

    # 调用js中函数
    result_func_js = js_exec.call('func_in_js', ['param1', 'param2'])
    print("js代码运行结果为:", result_func_js)

直接套公式就行✌

实操

就上一文来练习一下:

这部分基本就不变,直接套,然后写上程序主入口,并实例化对象:

然后调用call函数:

函数名

参数

都拿来写进call,这里的参数其中有一个数字是翻页的,最后可以写成:

然后运行一下看看:

ok了,然后将参数传入基础爬虫程序的参数中就行了:

javascript 复制代码
# 导入模块
import os
import execjs
import requests

def basic_crawler(analysis, page_num):
    cookies = {
        'qm_check': 'A1sdRUIQChtxen8pI0dAMRcOUFseEHBeQF0JTjVBWCwycRd1QlhAXFEGFUdASAFKBQcCcQ4IdhFFIg4aHRoOBnMDARlGR2dQOVdICAolAGgCHBl0B3xUV05KVFsZXVJRWxsKFghJVktYVElWBRVP',
        'gr_user_id': 'fee2a18e-547e-4f09-bb2c-ba5e70220909',
        'ada35577182650f1_gr_last_sent_cs1': 'qm25907020073',
        'aso_ucenter': '3d0d2W%2BfI6%2B1HX2yQkg6QQEsznzgRx7XqxjaF3up3gE4OiP%2F417biqUIrOf8AxDxFc4',
        'AUTHKEY': 'DfhcbIEyq81vUXS9sjPzP32JxOFnkWtkytMBxOJckgGjB2Iby1hG4iO67%2BdIedY2cy2%2B%2BEGadg3CZcAHxt1%2Bl9vsrc3XvkqRGWZ3Mv3I8wOtlVG9asekiw%3D%3D',
        'USERINFO': 'cF38Ql5tf5WyrzzJzTHoEAdBQsBUYghkPKsyg%2FG2MyZFMnkjG7Hf%2FCLJc%2BBYDyU6CrW3Ww5mkXc0dttShLPibhAS5nWMAhH3Eot4ugMWsW%2B2nMvSljNE8y0uLtw0kS0gyXEooeMIj6T%2F3oMHiA4Zhw%3D%3D',
        'PHPSESSID': 'j911j9ova533i9ehmgqg663vtv',
        'ada35577182650f1_gr_session_id': 'd338e6a4-41f4-4da4-b325-b76ee9cb8fde',
        'ada35577182650f1_gr_last_sent_sid_with_cs1': 'd338e6a4-41f4-4da4-b325-b76ee9cb8fde',
        'ada35577182650f1_gr_session_id_sent_vst': 'd338e6a4-41f4-4da4-b325-b76ee9cb8fde',
        'synct': '1759332116.003',
        'syncd': '468',
        'ada35577182650f1_gr_cs1': 'qm25907020073',
    }

    headers = {
        'Accept': 'application/json, text/plain, */*',
        'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
        'Cache-Control': 'no-cache',
        'Connection': 'keep-alive',
        'Origin': 'https://www.qimai.cn',
        'Pragma': 'no-cache',
        'Sec-Fetch-Dest': 'empty',
        'Sec-Fetch-Mode': 'cors',
        'Sec-Fetch-Site': 'same-site',
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/140.0.0.0 Safari/537.36 Edg/140.0.0.0',
        'sec-ch-ua': '"Chromium";v="140", "Not=A?Brand";v="24", "Microsoft Edge";v="140"',
        'sec-ch-ua-mobile': '?0',
        'sec-ch-ua-platform': '"Windows"',
        # 'Cookie': 'qm_check=A1sdRUIQChtxen8pI0dAMRcOUFseEHBeQF0JTjVBWCwycRd1QlhAXFEGFUdASAFKBQcCcQ4IdhFFIg4aHRoOBnMDARlGR2dQOVdICAolAGgCHBl0B3xUV05KVFsZXVJRWxsKFghJVktYVElWBRVP; gr_user_id=fee2a18e-547e-4f09-bb2c-ba5e70220909; ada35577182650f1_gr_last_sent_cs1=qm25907020073; aso_ucenter=3d0d2W%2BfI6%2B1HX2yQkg6QQEsznzgRx7XqxjaF3up3gE4OiP%2F417biqUIrOf8AxDxFc4; AUTHKEY=DfhcbIEyq81vUXS9sjPzP32JxOFnkWtkytMBxOJckgGjB2Iby1hG4iO67%2BdIedY2cy2%2B%2BEGadg3CZcAHxt1%2Bl9vsrc3XvkqRGWZ3Mv3I8wOtlVG9asekiw%3D%3D; USERINFO=cF38Ql5tf5WyrzzJzTHoEAdBQsBUYghkPKsyg%2FG2MyZFMnkjG7Hf%2FCLJc%2BBYDyU6CrW3Ww5mkXc0dttShLPibhAS5nWMAhH3Eot4ugMWsW%2B2nMvSljNE8y0uLtw0kS0gyXEooeMIj6T%2F3oMHiA4Zhw%3D%3D; PHPSESSID=j911j9ova533i9ehmgqg663vtv; ada35577182650f1_gr_session_id=d338e6a4-41f4-4da4-b325-b76ee9cb8fde; ada35577182650f1_gr_last_sent_sid_with_cs1=d338e6a4-41f4-4da4-b325-b76ee9cb8fde; ada35577182650f1_gr_session_id_sent_vst=d338e6a4-41f4-4da4-b325-b76ee9cb8fde; synct=1759332116.003; syncd=468; ada35577182650f1_gr_cs1=qm25907020073',
    }

    params = {
        'analysis': analysis,
        'status': '3',
        'date': '2025-10-01',
        'sdate': '2025-10-01',
        'edate': '2025-10-01',
        'country': 'cn',
        'genre': '36',
        'option': '4',
        'page': f'{page_num}',
    }

    response = requests.get('https://api.qimai.cn/rank/offline', params=params, cookies=cookies, headers=headers)
    print(response.text)


# 写一个调用js代码的类
class JSExecutor:
    def __init__(self, js_file_path):
        if not os.path.exists(js_file_path):
            print('js文件不存在或者路径出错')
        with open(js_file_path, 'r', encoding='utf-8') as f:
            self.js_code = f.read()

        self.js_code = execjs.compile(self.js_code)

    def call(self, func_name, *args):
        return self.js_code.call(func_name, *args)

if __name__ == '__main__':
    # 实例化对象(直接运行__init__函数,等于说js代码也编译完了)
    js_executor = JSExecutor('10-七麦数据js扣代码.js')
    # 调用call方法
    for page in range(5):
        result = js_executor.call('main', f'2025-10-012025-10-012025-10-01{page}336allcn')
        print(f'第{page}页加密参数为{result}')
        basic_crawler(result, page)

直接运行即可

小结

此文章只做技术交流,各位若发现文章有问题请及时提出,讨论交流,一起进步,加油加油

相关推荐
Dajiaonew3 小时前
Vue3 + TypeScript 一篇文章 后端变全栈
前端·javascript·typescript
图亚Vanta4 小时前
Python入门第一课:Python安装、VSCode/Pycharm配置
vscode·python·pycharm
睿思达DBA_WGX4 小时前
使用 python-docx 库操作 word 文档(2):在word文档中插入各种内容
python·word
kunge1v55 小时前
学习爬虫第五天:自动化爬虫
爬虫·python·自动化
m***记5 小时前
Python 自动化办公的 10 大脚本
windows·python·自动化
人间乄惊鸿客5 小时前
python - 第二天
python
江上月5136 小时前
django与vue3的对接流程详解(上)
后端·python·django
老歌老听老掉牙6 小时前
基于 PyQt5 实现刀具类型选择界面的设计与交互逻辑
python·qt·交互
勤奋菲菲6 小时前
Koa.js 完全指南:下一代 Node.js Web 框架
前端·javascript·node.js