python爬取付费隐藏内容_如何用python 爬取网页中隐藏的div内容?

图片所在的html元素id叫 viewimg ,这个元素是由 view.js 当中的 loadview 函数创建的。该函数吧serverurl跟photosrc这个array里头的元素拼接,并把他设置成viewimg的src属性,这就是图片链接。

图片链接由前半部分服务器链接和后半部分GET参数构成。

服务器链接相对固定,实际只发现了两个:

img.tsjjx.com

img.hi328.com

GET参数有 id hash file mode。形如:

考察 global.js ,不难发现 id 其实是由 window.location.pathname 来拿到的。把id跟file两个拼接起来,再计算md5,md5的十六进制数字表示就是hash,这里的md5就是RFC 1321当中说的md5,易求。

那么file参数从何而来呢?

进一步考察js代码,不难发现file是photosr这个Array当中的元素。

给Array当中元素赋值的过程经过base64编码后,储存在网页的header中,搜索 packed 就能看到。

base64解码后能够看到用来计算file值(给photosr赋值)的js函数:

(function (p, a, c, k, e, d) {

e = function (c) {

return (c < a ? '' : e(parseInt(c / a))) + ((c = c % a) > 35 ? String.fromCharCode(c + 29) : c.toString(36))

};

if (!''.replace(/^/, String)) {

while (c--) {

d[e(c)] = k[c] || e(c)

}

k = [function (e) {

return d[e]

}];

e = function () {

return '\\w+'

};

c = 1

}

;

while (c--) {

if (k[c]) {

p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c])

}

}

return p

}('e[1]="c/d/0/10/a/w.b";e[2]="c/d/0/10/a/v.b";e[3]="c/d/0/10/a/u.b";e[4]="c/d/0/10/a/s.b";e[5]="c/d/0/10/a/t.b";e[6]="c/d/0/10/a/x.b";e[7]="c/d/0/10/a/y.b";e[8]="c/d/0/10/a/C.b";e[9]="c/d/0/10/a/B.b";e[10]="c/d/0/10/a/r.b";e[11]="c/d/0/10/a/z.b";e[12]="c/d/0/10/a/D.b";e[13]="c/d/0/10/a/n.b";e[14]="c/d/0/10/a/j.b";e[15]="c/d/0/10/a/i.b";e[16]="c/d/0/10/a/h.b";e[17]="c/d/0/10/a/f.b";e[18]="c/d/0/10/a/g.b";e[19]="c/d/0/10/a/k.b";e[l]="c/d/0/10/a/E.b";e[o]="c/d/0/10/a/m.b";e[0]="c/d/0/10/a/q.b";e[p]="c/d/0/10/a/A.b";e[I]="c/d/0/10/a/1b.b";e[1a]="c/d/0/10/a/U.b";e[a]="c/d/0/10/a/X.b";e[Z]="c/d/0/10/a/Y.b";e[W]="c/d/0/10/a/V.b";e[1c]="c/d/0/10/a/1d.b";e[S]="c/d/0/10/a/J.b";e[K]="c/d/0/10/a/T.b";e[H]="c/d/0/10/a/F.b";e[G]="c/d/0/10/a/L.b";e[M]="c/d/0/10/a/R.b";e[Q]="c/d/0/10/a/P.b";e[N]="c/d/0/10/a/O.b";',

62,

76,

'22||||||||||26|jpg|2013|08|photosr|533|534|532|531|530|535|20|537|529|21|23|538|526|520|521|519|518|517|522|523|527|539|525|524|528|536|548|33|32|24|546|31|549|34|36|552|551|35|550|30|547|541|544|28|542|543|27|||||||||||25|540|29|545'.split('|'),

0,

{}));

首先观察其第四个参数,该参数是一个js的Array,易知就是其中的数字构成了file的值,姑且称之为 密码本。譬如2013年份,500+的图片编号,还有一个jpg的后缀。年份,图片编号,图片后缀易知,但是其中四个两位数字如何排列呢?

考察该函数可知,他一开头就先声明了helper函数 e ,把这个函数体放入浏览器控制台中,与之交互,不难发现,这其实实现了从十进制转换到62进制的功能。

把完整参数跟函数体放到控制台中运行,可以发现,函数返回值与所求photosr非常接近。

至此,易知第一个参数中形如 e[1]="c/d/0/10/a/w.b" 的部分,当中的数字跟字母,其实都是62进制数字,如数字c,十进制是12,密码本中索引12,正是年份2013。

综上所述,我们只消请求到页面的html,拿到其header中的packed值就能知道图片的链接。

图片链接中,服务器地址量少且基本固定,id 就是页面在服务器中相对路径易知,用py的hashlib就可以计算hash码。用py的base64解码packed后,用regex简单抓取年份日期等数字,经62、10进制转换,就能知道file路径。

初学编程,多指教!