网页抓取解密(煎蛋网妹子图怎么爬,文件夹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 = $(&#x27;[查看原图]</a>&#x27;);

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 .*&#x27;

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&#x27;jandan_load_img.*?var c.*?"(.*?)"&#x27;

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(&#x27;//span[@class="img-hash"]/text()&#x27;)

55 # print(img_hash)

56 return img_hash

57

58def init_md5(str):

59 """封装 md5"""

60 md5 = hashlib.md5()

61 md5.update(str.encode(&#x27;utf-8&#x27;))

62 return md5.hexdigest()

63

64def decode_base64(data):

65 """封装 base64"""

66 return base64.b64decode(data + (4 - len(data) % 4) * &#x27;=&#x27;)

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 &#x27;&#x27;

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 = &#x27;&#x27;

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 = &#x27;&#x27;

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), &#x27;wb&#x27;) 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 = &#x27;http://jandan.net/ooxx/&#x27;

136 for i in range(page+1):

137 page_url = base_url + &#x27;page-{}/&#x27;.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 = &#x27;w&#x27;+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, &#x27;http:&#x27; + img_url)

145

146 if r: print(&#x27;success&#x27;)

147

148

149if __name__ == &#x27;__main__&#x27;:

150 dir_path = &#x27;E:/jiandan/&#x27;

151 main(dir_path)

152

153

  这一次,不知道为什么煎蛋的解密变得容易了。…

  最后非常感谢原作者的分享,一下子学到了很多。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线