11-py调用js
上一文我们写出了js代码来加密数据作为参数,当我们写爬虫时需要加密过的参数作为登陆凭证来get数据,那我们怎么调用js呢
execjs库
首先我们需要在py中创建一共js可以运行的环境,需要用到的库是——execjs库,安装命令:pip install PyExecJS
然后可以通过execjs.compile(js代码)来初始化,将JavaScript 代码编译为一个可执行的对象:
然后用初始化对象.call(js核心代码函数名,[param1, param2]),这就是为什么我要把js核心代码封装成函数:
result_func_js = js_exec.call('func_in_js', ['param1', 'param2']) # 伪代码
我们可以将读取js代码 -> 初始化 -> 调用js函数封装成类:
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了,然后将参数传入基础爬虫程序的参数中就行了:
# 导入模块
import os
import execjs
import requestsdef 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)
直接运行即可