展开全部
真实图片地址是2113在客户端javascript代码中计算出来的.
你需要寻5261找Ly93dzMuc2luYWltZy5jbi9tdzYwMC8wMDczdExQR2d5MWZ3Z3h6ajlrMGtqMzBpYjBramtnaS5qcGc=
这样的内容4102,取出
Ly93dzMuc2luYWltZy5jbi9tdzYwMC8wMDczdExQR2d5MWZ3Z3h6ajlrMGtqMzBpYjBramtnaS5qcGc=
这段内容,做base64解码即得图片地址。1653
相应的脚本在
//cdn.jandan.net/static/min/91798e4c623fa60181a31d543488217eB2GDr79r.03100001.js
这段内容你通过get_page()爬到地页面中有,同样,该页面中有这样的html(为便于阅读已重排格式):
这个img的onload调用的函数就在前面给出的那个js文件中:function jandan_load_img(b){
var d=$(b);
var f=d.next("span.img-hash");
var e=f.text();
f.remove();
var c=jdDw3Ldvi4NcbKboi4X19hCAmdC3Q3aZvN(e,"DGmLfT4H73yJdXXpXs3pw7uAiICcflZS");
'" target="_blank" class="view_img_link">[查看原图]
');d.before(a);
d.before("
");
d.removeAttr("onload");
d.attr("src",location.protocol+c.replace(/(\/\/\w+\.sinaimg\.cn\/)(\w+)(\/.+\.gif)/,"$1thumb180$3"));
if(/\.gif$/.test(c)){
d.attr("org_src",location.protocol+c);
b.οnlοad=function(){
add_img_loading_mask(this,load_sina_gif)
}
}
它调用了jdDw3Ldvi4NcbKboi4X19hCAmdC3Q3aZvN对img-hash的内容做解码,这个函数同样在这个js文件中:var jdDw3Ldvi4NcbKboi4X19hCAmdC3Q3aZvN=function(o,y,g){
var d=o;var l="DECODE";
var y=y?y:"";
var g=g?g:0;
var h=4;
y=md5(y);
var x=md5(y.substr(0,16));
var v=md5(y.substr(16,16));
...中间部分略去...
if(l=="DECODE"){
m=base64_encode(m);
var c=new RegExp("=","g");
m=m.replace(c,"");
m=u+m;
m=base64_decode(d)
}
return m
};
你只需要在Python使用相应的库对抓取到的img-hash内容做解码即可得到图片地址。
你使用了str的find来从文本中定位位置,这样做太麻烦了,太多的代码细节,使用re模块做正则匹配就简单很多,更快的是直接使用现有的爬虫库.
使用re进行正则匹配,只需要使用正则式'(.+?)<'即可提取出该页面中所有加密的图片地址。import re
import base64
pat = re.compile('(.+?)<')
...
def get_imgurls(url):
urls = []
for imgurl in pat.findall(url_open(url).decode('utf-8')):
.append(str(base64.b64decode(imgurl), 'utf-8'))
return urls
然后就可以对get_imgurls返回的列表遍历,逐个交给save_img处理了。
使用爬取库也只需要寻找span,从中找出class='img-hash'即可读取text。