网页抓取解密(煎蛋网妹子图怎么爬,文件夹js处理的网页防盗图)
优采云 发布时间: 2022-02-19 00:02网页抓取解密(煎蛋网妹子图怎么爬,文件夹js处理的网页防盗图)
最近有朋友一直在问我怎么爬的修改版,因为他们用尽了所有的精力,结果抓到了一整文件夹的防盗图片。很久以前在博客里说过,对于这种js处理的网页,抓取网页上看到的数据大致有三种方式:
分析网页
首先打开inspect元素查看他的实际响应内容,可以看到img标签中实际src属性的值是固定值 ///img/blank.gif。onload 属性指向一个 js jandan_load_img() 函数,this 参数在大多数情况下是指当前标签。其后是 span 标签中收录的一串哈希值。
目前我们已经找到了jandan_load_img()函数,接下来需要确定收录该函数的js文件。方法很简单,在每一个返回的js响应中,去搜索。
当前的js文件是经过压缩和混淆处理的,我们可以复制到在线解压工具中解压。如果您使用的是 Chrome,您可以找到源文件并单击图标下方带有红色框的按钮:
jandan_load_img() 函数的内容是
1function jandan_load_img(b) {
2 var d = $(b);
3 var f = d.next("span.img-hash");
4 var e = f.text();
5 f.remove();
6 var c = jdXFKzuIDxRVqKYQfswJ5elNfow1x0JrJH(e, "zE4N6eHuAQP8vkQPb0wcuEcWnLzHYVhy");
7 var a = $('[查看原图]</a>');
8 d.before(a);
9 d.before("
");
10 d.removeAttr("onload");
11 d.attr("src", location.protocol + c.replace(/(\/\/\w+\.sinaimg\.cn\/)(\w+)(\/.+\.gif)/, "$1thumb180$3"));
12 ...
13}
14
可以看到js文件依赖于PQuery库,它获取img标签,然后获取span标签的内容,然后将它和一个常量传递给这个字符串的函数,获取返回的内容把这个字符串的函数,放入img和a标签中。
我们在当前的js文件中搜索jdXFKzuIDxRVqKYQfswJ5elNfow1x0JrJH()函数。如果不出意外,我们可以搜索 2 个函数。我们选择后一种,内容如下:
1var jdXFKzuIDxRVqKYQfswJ5elNfow1x0JrJH = function(m, r, d) {
2 var e = "DECODE";
3 var r = r ? r : "";
4 var d = d ? d : 0;
5 var q = 4;
6 r = md5(r);
7 var o = md5(r.substr(0, 16));
8 var n = md5(r.substr(16, 16));
9 if (q) {
10 if (e == "DECODE") {
11 var l = m.substr(0, q)
12 }
13 } else {
14 var l = ""
15 }
16 var c = o + md5(o + l);
17 var k;
18 if (e == "DECODE") {
19 m = m.substr(q);
20 k = base64_decode(m)
21 }
22 var h = new Array(256);
23 for (var g = 0; g .*'
35 result = re.findall(pattern, html)
36 js_url = "http://" + result[len(result) - 1]
37 except Exception as e:
38 print(e)
39 js = get_html(js_url).text
40
41 return js
42
43def get_salt(js):
44 """正则匹配 js 中的加密常量"""
45 pattern = r'jandan_load_img.*?var c.*?"(.*?)"'
46 salt = re.findall(pattern, js, re.S)[0]
47 # print(salt)
48 return salt
49
50def all_img_hash(page_url):
51 """请求页面,返回页面中所有图片 hash"""
52 html = get_html(page_url).text
53 doc = etree.HTML(html)
54 img_hash = doc.xpath('//span[@class="img-hash"]/text()')
55 # print(img_hash)
56 return img_hash
57
58def init_md5(str):
59 """封装 md5"""
60 md5 = hashlib.md5()
61 md5.update(str.encode('utf-8'))
62 return md5.hexdigest()
63
64def decode_base64(data):
65 """封装 base64"""
66 return base64.b64decode(data + (4 - len(data) % 4) * '=')
67
68def simulation_js(img_hash, salt):
69 """
70 翻译 js 加密方式
71 :param img_hash: 图片 hash
72 :param salt: 加密常量
73 :return: 图片 url
74 """
75 # r = salt if salt else ''
76 # d = 0
77 # q = 4
78 # r = init_md5(r)
79 # o = init_md5(r[:16])
80 # n = init_md5(r[16:32])
81 # if q:
82 # l = img_hash[:q]
83 # else: l = ''
84 #
85 # c = o + init_md5(o + l)
86 # img_hash = img_hash[q:]
87 # k = decode_base64(img_hash)
88 #
89 # h = list(range(256))
90 # b = list(range(256))
91 # for g in range(256):
92 # b[g] = ord(c[g % len(c)])
93 # f = 0
94 # for g in range(256):
95 # f = (f + h[g] + b[g]) % 256
96 # h[g], h[f] = h[f], h[g]
97 #
98 # t = ''
99 # p = f = 0
100 # for g in range(len(k)):
101 # p = (p + 1) % 256
102 # f = (f + h[p]) % 256
103 # h[p], h[f] = h[f], h[p]
104 # t += chr(k[g] ^ (h[(h[p] + h[f]) % 256]))
105 # t = t[26:]
106 t = decode_base64(img_hash)
107 # print(t)
108 return t
109
110def parse_hash(salt, page_url):
111
112 img_hash = all_img_hash(page_url)
113 # print(img_hash)
114 for i in img_hash:
115 yield simulation_js(i, salt)
116
117def download_img(dir_path, img_url):
118 """下载"""
119 filename = img_url[-14:]
120 # print(img_url)
121 img_content = get_html(img_url).content
122 if not os.path.exists(dir_path):
123 os.mkdir(dir_path)
124 try:
125 with open(os.path.join(dir_path, filename), 'wb') as f:
126 f.write(img_content)
127 return True
128 except Exception as e:
129 print(e)
130 return False
131
132def main(dir_path, page=1):
133 js = get_js_file()
134 salt = get_salt(js)
135 base_url = 'http://jandan.net/ooxx/'
136 for i in range(page+1):
137 page_url = base_url + 'page-{}/'.format(58-i)
138 # print(page_url)
139 # //wx1.sinaimg.cn/large/672f3952gy1g0u2mqymhyj20u00u0dja.jpg 正确结果
140 for img_url in parse_hash(salt, page_url):
141 # img_url = 'w'+str(img_url, encoding = "utf-8")
142 img_url = str(img_url, encoding = "utf-8")
143 print(img_url)
144 r = download_img(dir_path, 'http:' + img_url)
145
146 if r: print('success')
147
148
149if __name__ == '__main__':
150 dir_path = 'E:/jiandan/'
151 main(dir_path)
152
153
这一次,不知道为什么煎蛋的解密变得容易了。…
最后非常感谢原作者的分享,一下子学到了很多。