python执行JS代码
在python中执行js代码的库 python2:Pyv8; python3:PyExecJS
在python里执行JS代码要先搭建JS环境
1 import execjs 2 3 # eval 和 complie 是要构建一个JS的环境 4 e = execjs.eval('a = new Array(1,2,3)') # 可以直接执行JS代码 5 print(e) 6 x = execjs.compile(''' 7 function add(x,y){ 8 return x+y; 9 }; 10 ''') 11 print(x.call('add', '1', '2')) # execjs.compile用于执行更复杂的js代码 12 ################### 运行结果:################ 13 [1, 2, 3] 14 12
案例:爬取落网音乐的单曲链接:
1 # !/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import requests 4 import re 5 import execjs 6 import json 7 from bs4 import BeautifulSoup 8 9 # 根据网址爬取落网音乐单曲 10 single_url_1 = 'http://mp3-cdn2.luoo.net/low/chinese/20171017.mp3' 11 single_url_2 = 'http://mp3-cdn2.luoo.net/low/chinese/20170927.mp3' 12 # 单曲一共有78页,但是后边几页有些歌曲的链接与上面的格式不一样 13 14 15 class Single(object): 16 17 i = 1 18 19 def __init__(self): 20 self.session = requests.session() 21 self.session.verify = False 22 self.session.headers = { 23 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36' 24 } 25 26 def get_pl(self): 27 html_url = 'http://www.luoo.net/musician/?p={}'.format(self.i) 28 self.i += 1 29 response = self.session.get(html_url) 30 response.encoding = 'utf-8' # AngelaDaddy・2017-11-19 31 pl = re.findall(r'pl = "(.*?)"', response.text)[0] 32 return pl 33 34 def get_number(self): 35 try: 36 html_url = 'http://www.luoo.net/musician/?p=1' 37 except Exception: 38 return False 39 response = self.session.get(html_url).text 40 soup = BeautifulSoup(response, 'lxml') 41 return soup.find_all('a', class_='page')[-1].text 42 43 @staticmethod 44 def get_js(): 45 with open('luo_net.js', encoding='utf-8') as f: 46 js_data = f.read() 47 ctx = execjs.compile(js_data) 48 return ctx 49 50 def get_mp3_list(self): 51 aes = "b6ce159334e155d8" 52 ctx = self.get_js() 53 map3_list = list() 54 max_page = self.get_number() 55 print(max_page) 56 57 while self.i <= int(max_page): 58 print(self.i) 59 pl = self.get_pl() 60 code = "N('{}','{}')".format(pl, aes) 61 response = json.loads(ctx.eval(code)) 62 for i in response: 63 map3_list.append(i['mp3']) 64 return map3_list 65 66 67 if __name__ == '__main__': 68 luo_single = Single() 69 print(luo_single.get_mp3_list())
网页JS分析:JS代码
1 var c = !1; 2 N = function(a, b, c) { 3 var d = decode(a) 4 , e = d.slice(8, 16) 5 , f = m(j(b, c), e) 6 , g = f.key 7 , h = f.iv; 8 d = d.slice(16, d.length); 9 return a = o(d, g, h, c); 10 }; 11 12 13 14 decode = function(b) { 15 b = b.replace(/\n/g, ""); 16 var a = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; 17 var c, d = [], e = [], f = []; 18 for (c = 0; b.length > c; c += 4) 19 e[0] = a.indexOf(b.charAt(c)), 20 e[1] = a.indexOf(b.charAt(c + 1)), 21 e[2] = a.indexOf(b.charAt(c + 2)), 22 e[3] = a.indexOf(b.charAt(c + 3)), 23 f[0] = e[0] << 2 | e[1] >> 4, 24 f[1] = (15 & e[1]) << 4 | e[2] >> 2, 25 f[2] = (3 & e[2]) << 6 | e[3], 26 d.push(f[0], f[1], f[2]); 27 return d = d.slice(0, d.length - d.length % 16) 28 }; 29 30 d = function(a) { 31 try { 32 return unescape(encodeURIComponent(a)) 33 } catch (b) { 34 throw "Error on UTF-8 encode" 35 } 36 }; 37 38 j = function(a, b) { 39 var c, e = []; 40 for (b || (a = d(a)), 41 c = 0; a.length > c; c++) 42 e[c] = a.charCodeAt(c); 43 return e 44 }; 45 46 //m函数调用准备: 47 48 //O函数准备: 49 z = function(a, b) { 50 var c, d = []; 51 for (c = 0; a.length > c; c += b) 52 d[c / b] = parseInt(a.substr(c, b), 16); 53 return d 54 }; 55 O = function(a) { 56 function b(a, b) { 57 return a << b | a >>> 32 - b 58 } 59 function c(a, b) { 60 var c, d, e, f, g; 61 return e = 2147483648 & a, 62 f = 2147483648 & b, 63 c = 1073741824 & a, 64 d = 1073741824 & b, 65 g = (1073741823 & a) + (1073741823 & b), 66 c & d ? 2147483648 ^ g ^ e ^ f : c | d ? 1073741824 & g ? 3221225472 ^ g ^ e ^ f : 1073741824 ^ g ^ e ^ f : g ^ e ^ f 67 } 68 function d(a, b, c) { 69 return a & b | ~a & c 70 } 71 function e(a, b, c) { 72 return a & c | b & ~c 73 } 74 function f(a, b, c) { 75 return a ^ b ^ c 76 } 77 function g(a, b, c) { 78 return b ^ (a | ~c) 79 } 80 function h(a, e, f, g, h, i, j) { 81 return a = c(a, c(c(d(e, f, g), h), j)), 82 c(b(a, i), e) 83 } 84 function i(a, d, f, g, h, i, j) { 85 return a = c(a, c(c(e(d, f, g), h), j)), 86 c(b(a, i), d) 87 } 88 function j(a, d, e, g, h, i, j) { 89 return a = c(a, c(c(f(d, e, g), h), j)), 90 c(b(a, i), d) 91 } 92 function k(a, d, e, f, h, i, j) { 93 return a = c(a, c(c(g(d, e, f), h), j)), 94 c(b(a, i), d) 95 } 96 function l(a) { 97 for (var b, c = a.length, d = c + 8, e = (d - d % 64) / 64, f = 16 * (e + 1), g = [], h = 0, i = 0; c > i; ) 98 b = (i - i % 4) / 4, 99 h = 8 * (i % 4), 100 g[b] = g[b] | a[i] << h, 101 i++; 102 return b = (i - i % 4) / 4, 103 h = 8 * (i % 4), 104 g[b] = g[b] | 128 << h, 105 g[f - 2] = c << 3, 106 g[f - 1] = c >>> 29, 107 g 108 } 109 function m(a) { 110 var b, c, d = []; 111 for (c = 0; 3 >= c; c++) 112 b = 255 & a >>> 8 * c, 113 d = d.concat(b); 114 return d 115 } 116 var n, o, p, q, r, s, t, u, v, w = [], x = z("67452301efcdab8998badcfe10325476d76aa478e8c7b756242070dbc1bdceeef57c0faf4787c62aa8304613fd469501698098d88b44f7afffff5bb1895cd7be6b901122fd987193a679438e49b40821f61e2562c040b340265e5a51e9b6c7aad62f105d02441453d8a1e681e7d3fbc821e1cde6c33707d6f4d50d87455a14eda9e3e905fcefa3f8676f02d98d2a4c8afffa39428771f6816d9d6122fde5380ca4beea444bdecfa9f6bb4b60bebfbc70289b7ec6eaa127fad4ef308504881d05d9d4d039e6db99e51fa27cf8c4ac5665f4292244432aff97ab9423a7fc93a039655b59c38f0ccc92ffeff47d85845dd16fa87e4ffe2ce6e0a30143144e0811a1f7537e82bd3af2352ad7d2bbeb86d391", 8); 117 for (w = l(a), 118 s = x[0], 119 t = x[1], 120 u = x[2], 121 v = x[3], 122 n = 0; w.length > n; n += 16) 123 o = s, 124 p = t, 125 q = u, 126 r = v, 127 s = h(s, t, u, v, w[n + 0], 7, x[4]), 128 v = h(v, s, t, u, w[n + 1], 12, x[5]), 129 u = h(u, v, s, t, w[n + 2], 17, x[6]), 130 t = h(t, u, v, s, w[n + 3], 22, x[7]), 131 s = h(s, t, u, v, w[n + 4], 7, x[8]), 132 v = h(v, s, t, u, w[n + 5], 12, x[9]), 133 u = h(u, v, s, t, w[n + 6], 17, x[10]), 134 t = h(t, u, v, s, w[n + 7], 22, x[11]), 135 s = h(s, t, u, v, w[n + 8], 7, x[12]), 136 v = h(v, s, t, u, w[n + 9], 12, x[13]), 137 u = h(u, v, s, t, w[n + 10], 17, x[14]), 138 t = h(t, u, v, s, w[n + 11], 22, x[15]), 139 s = h(s, t, u, v, w[n + 12], 7, x[16]), 140 v = h(v, s, t, u, w[n + 13], 12, x[17]), 141 u = h(u, v, s, t, w[n + 14], 17, x[18]), 142 t = h(t, u, v, s, w[n + 15], 22, x[19]), 143 s = i(s, t, u, v, w[n + 1], 5, x[20]), 144 v = i(v, s, t, u, w[n + 6], 9, x[21]), 145 u = i(u, v, s, t, w[n + 11], 14, x[22]), 146 t = i(t, u, v, s, w[n + 0], 20, x[23]), 147 s = i(s, t, u, v, w[n + 5], 5, x[24]), 148 v = i(v, s, t, u, w[n + 10], 9, x[25]), 149 u = i(u, v, s, t, w[n + 15], 14, x[26]), 150 t = i(t, u, v, s, w[n + 4], 20, x[27]), 151 s = i(s, t, u, v, w[n + 9], 5, x[28]), 152 v = i(v, s, t, u, w[n + 14], 9, x[29]), 153 u = i(u, v, s, t, w[n + 3], 14, x[30]), 154 t = i(t, u, v, s, w[n + 8], 20, x[31]), 155 s = i(s, t, u, v, w[n + 13], 5, x[32]), 156 v = i(v, s, t, u, w[n + 2], 9, x[33]), 157 u = i(u, v, s, t, w[n + 7], 14, x[34]), 158 t = i(t, u, v, s, w[n + 12], 20, x[35]), 159 s = j(s, t, u, v, w[n + 5], 4, x[36]), 160 v = j(v, s, t, u, w[n + 8], 11, x[37]), 161 u = j(u, v, s, t, w[n + 11], 16, x[38]), 162 t = j(t, u, v, s, w[n + 14], 23, x[39]), 163 s = j(s, t, u, v, w[n + 1], 4, x[40]), 164 v = j(v, s, t, u, w[n + 4], 11, x[41]), 165 u = j(u, v, s, t, w[n + 7], 16, x[42]), 166 t = j(t, u, v, s, w[n + 10], 23, x[43]), 167 s = j(s, t, u, v, w[n + 13], 4, x[44]), 168 v = j(v, s, t, u, w[n + 0], 11, x[45]), 169 u = j(u, v, s, t, w[n + 3], 16, x[46]), 170 t = j(t, u, v, s, w[n + 6], 23, x[47]), 171 s = j(s, t, u, v, w[n + 9], 4, x[48]), 172 v = j(v, s, t, u, w[n + 12], 11, x[49]), 173 u = j(u, v, s, t, w[n + 15], 16, x[50]), 174 t = j(t, u, v, s, w[n + 2], 23, x[51]), 175 s = k(s, t, u, v, w[n + 0], 6, x[52]), 176 v = k(v, s, t, u, w[n + 7], 10, x[53]), 177 u = k(u, v, s, t, w[n + 14], 15, x[54]), 178 t = k(t, u, v, s, w[n + 5], 21, x[55]), 179 s = k(s, t, u, v, w[n + 12], 6, x[56]), 180 v = k(v, s, t, u, w[n + 3], 10, x[57]), 181 u = k(u, v, s, t, w[n + 10], 15, x[58]), 182 t = k(t, u, v, s, w[n + 1], 21, x[59]), 183 s = k(s, t, u, v, w[n + 8], 6, x[60]), 184 v = k(v, s, t, u, w[n + 15], 10, x[61]), 185 u = k(u, v, s, t, w[n + 6], 15, x[62]), 186 t = k(t, u, v, s, w[n + 13], 21, x[63]), 187 s = k(s, t, u, v, w[n + 4], 6, x[64]), 188 v = k(v, s, t, u, w[n + 11], 10, x[65]), 189 u = k(u, v, s, t, w[n + 2], 15, x[66]), 190 t = k(t, u, v, s, w[n + 9], 21, x[67]), 191 s = c(s, o), 192 t = c(t, p), 193 u = c(u, q), 194 v = c(v, r); 195 return m(s).concat(m(t), m(u), m(v)) 196 }; 197 198 m = function(c, d) { 199 var b = 8, a = 14; 200 var e, f = a >= 12 ? 3 : 2, g = [], h = [], i = [], j = [], k = c.concat(d); 201 for (i[0] = O(k), 202 j = i[0], 203 e = 1; f > e; e++) 204 i[e] = O(i[e - 1].concat(k)), 205 j = j.concat(i[e]); 206 return g = j.slice(0, 4 * b), 207 h = j.slice(4 * b, 4 * b + 16), 208 { 209 key: g, 210 iv: h 211 } 212 }; 213 A = function(a) { 214 var b, c = []; 215 for (b = 0; a.length > b; b++) 216 c[a[b]] = b; 217 return c 218 }; 219 B = function(a, b) { 220 var c, d; 221 for (d = 0, 222 c = 0; 8 > c; c++) 223 d = 1 === (1 & b) ? d ^ a : d, 224 a = a > 127 ? 283 ^ a << 1 : a << 1, 225 b >>>= 1; 226 return d 227 }; 228 C = function(a) { 229 var b, c = []; 230 for (b = 0; 256 > b; b++) 231 c[b] = B(a, b); 232 return c 233 }; 234 var D = z("637c777bf26b6fc53001672bfed7ab76ca82c97dfa5947f0add4a2af9ca472c0b7fd9326363ff7cc34a5e5f171d8311504c723c31896059a071280e2eb27b27509832c1a1b6e5aa0523bd6b329e32f8453d100ed20fcb15b6acbbe394a4c58cfd0efaafb434d338545f9027f503c9fa851a3408f929d38f5bcb6da2110fff3d2cd0c13ec5f974417c4a77e3d645d197360814fdc222a908846eeb814de5e0bdbe0323a0a4906245cc2d3ac629195e479e7c8376d8dd54ea96c56f4ea657aae08ba78252e1ca6b4c6e8dd741f4bbd8b8a703eb5664803f60e613557b986c11d9ee1f8981169d98e949b1e87e9ce5528df8ca1890dbfe6426841992d0fb054bb16", 2); 235 var E = A(D); 236 var F = z("01020408102040801b366cd8ab4d9a2f5ebc63c697356ad4b37dfaefc591", 2); 237 var G = C(2); 238 var H = C(3); 239 var I = C(9); 240 var J = C(11); 241 var K = C(13); 242 var L = C(14); 243 244 245 246 247 //o函数准备: 248 y = function(a) { 249 var b, c = a[0]; 250 for (b = 0; 4 > b; b++) 251 a[b] = a[b + 1]; 252 return a[3] = c, 253 a 254 }; 255 256 x = function(a) { 257 for (var b = 0; 4 > b; b++) 258 a[b] = D[a[b]]; 259 return a 260 }; 261 w = function(c) { 262 var a = 14, b = 8; 263 var d, e, f, g, h = [], i = [], j = []; 264 for (d = 0; b > d; d++) 265 e = [c[4 * d], c[4 * d + 1], c[4 * d + 2], c[4 * d + 3]], 266 h[d] = e; 267 for (d = b; 4 * (a + 1) > d; d++) { 268 for (h[d] = [], 269 f = 0; 4 > f; f++) 270 i[f] = h[d - 1][f]; 271 for (0 === d % b ? (i = x(y(i)), 272 i[0] ^= F[d / b - 1]) : b > 6 && 4 === d % b && (i = x(i)), 273 f = 0; 4 > f; f++) 274 h[d][f] = h[d - b][f] ^ i[f] 275 } 276 for (d = 0; a + 1 > d; d++) 277 for (j[d] = [], 278 g = 0; 4 > g; g++) 279 j[d].push(h[4 * d + g][0], h[4 * d + g][1], h[4 * d + g][2], h[4 * d + g][3]); 280 return j 281 }; 282 283 s = function(a) { 284 var b, d = [], e = c ? [0, 13, 10, 7, 4, 1, 14, 11, 8, 5, 2, 15, 12, 9, 6, 3] : [0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11]; 285 for (b = 0; 16 > b; b++) 286 d[b] = a[e[b]]; 287 return d 288 }; 289 r = function(a) { 290 var b, d = c ? E : D, e = []; 291 for (b = 0; 16 > b; b++) 292 e[b] = d[a[b]]; 293 return e 294 }; 295 u = function(a, b, c) { 296 var d, e = []; 297 for (d = 0; 16 > d; d++) 298 e[d] = a[d] ^ b[c][d]; 299 return e 300 }; 301 302 303 t = function(a) { 304 var b, d = []; 305 if (c) 306 for (b = 0; 4 > b; b++) 307 d[4 * b] = L[a[4 * b]] ^ J[a[1 + 4 * b]] ^ K[a[2 + 4 * b]] ^ I[a[3 + 4 * b]], 308 d[1 + 4 * b] = I[a[4 * b]] ^ L[a[1 + 4 * b]] ^ J[a[2 + 4 * b]] ^ K[a[3 + 4 * b]], 309 d[2 + 4 * b] = K[a[4 * b]] ^ I[a[1 + 4 * b]] ^ L[a[2 + 4 * b]] ^ J[a[3 + 4 * b]], 310 d[3 + 4 * b] = J[a[4 * b]] ^ K[a[1 + 4 * b]] ^ I[a[2 + 4 * b]] ^ L[a[3 + 4 * b]]; 311 else 312 for (b = 0; 4 > b; b++) 313 d[4 * b] = G[a[4 * b]] ^ H[a[1 + 4 * b]] ^ a[2 + 4 * b] ^ a[3 + 4 * b], 314 d[1 + 4 * b] = a[4 * b] ^ G[a[1 + 4 * b]] ^ H[a[2 + 4 * b]] ^ a[3 + 4 * b], 315 d[2 + 4 * b] = a[4 * b] ^ a[1 + 4 * b] ^ G[a[2 + 4 * b]] ^ H[a[3 + 4 * b]], 316 d[3 + 4 * b] = H[a[4 * b]] ^ a[1 + 4 * b] ^ a[2 + 4 * b] ^ G[a[3 + 4 * b]]; 317 return d 318 }; 319 320 321 322 q = function(b, d) { 323 var a = 14; 324 c = !0; 325 var e, f = u(b, d, a); 326 for (e = a - 1; e > -1; e--) 327 f = s(f), 328 f = r(f), 329 f = u(f, d, e), 330 e > 0 && (f = t(f)); 331 return f 332 }; 333 334 v = function(a, b) { 335 var c, d = []; 336 for (c = 0; 16 > c; c++) 337 d[c] = a[c] ^ b[c]; 338 return d 339 }; 340 341 g = function(a, b) { 342 var c, d, e = ""; 343 if (b) { 344 if (c = a[15], 345 c > 16) 346 throw "Decryption error: Maybe bad key"; 347 if (16 === c) 348 return ""; 349 for (d = 0; 16 - c > d; d++) 350 e += String.fromCharCode(a[d]) 351 } else 352 for (d = 0; 16 > d; d++) 353 e += String.fromCharCode(a[d]); 354 return e 355 }; 356 357 e = function(a) { 358 try { 359 return decodeURIComponent(escape(a)) 360 } catch (b) { 361 throw "Bad Key" 362 } 363 }; 364 365 366 o = function(a, b, c, d) { 367 b = w(b); 368 var f, h = a.length / 16, i = [], j = [], k = ""; 369 for (f = 0; h > f; f++) 370 i.push(a.slice(16 * f, 16 * (f + 1))); 371 for (f = i.length - 1; f >= 0; f--) 372 j[f] = q(i[f], b), 373 j[f] = 0 === f ? v(j[f], c) : v(j[f], i[f - 1]); 374 for (f = 0; h - 1 > f; f++) 375 k += g(j[f]); 376 return k += g(j[f], !0), 377 d ? k : e(k) 378 };