1. 程式人生 > >python3爬蟲爬取煎蛋網妹紙圖片

python3爬蟲爬取煎蛋網妹紙圖片

port 商業 技術分享 爬取 其中 lar c函數 base 技術

其實之前實現過這個功能,是使用selenium模擬瀏覽器頁面點擊來完成的,但是效率實際上相對來說較低。本次以解密參數來完成爬取的過程。

首先打開煎蛋網http://jandan.net/ooxx,查看網頁源代碼。我們搜索其中一張圖片的編號,比如3869006,看下在源代碼中是否能找到圖片鏈接

技術分享圖片

技術分享圖片

從上面的HTML結構中找到這個標號對應的一些屬性,沒有直接的圖片鏈接地址,只有一個src=//img.jandan.net/blank.gif,這很明顯不是個真實的鏈接地址,因為每一個圖片編號都有這個值。我們註意到後面還有一個onload=‘jandan_load_img(this)’,可以大膽猜測真實地址有關,傳入了一個this參數,也就是調用它的對象。然後後面還有一個img-hash,後面文本一長串的字符,按命名來看應該是圖片的hash值,這個目前不知道什麽用,先留意下就好,繼續往後走,我們去看jandan_load_img()這個函數。

打開chrome F12開發者工具,刷新網頁,查看NetWork選項卡中的js,可以在左側列表項裏找到一個包含jandan_load_img()函數的js。如下圖:

技術分享圖片

下面我們把這個函數拿出來分析下:

function jandan_load_img(b) {
  // 傳入一個參數b,把b賦值給變量d,把d的img-hash賦值給f,把f的文本提取出來。。。說白了就是e等於圖片的hash值
var d = $(b); var f = d.next("span.img-hash"); var e = f.text(); f.remove(); // 重點關註下面兩句
var c = jdN1vojzUDgDM5WyoSjf4YBLbPRYr4ovPc(e, "9e03YzcYoHuEBMj5eS4c2tbLVWiqSgn1"); var a = $(‘<a href="‘ + c.replace(/(\/\/\w+\.sinaimg\.cn\/)(\w+)(\/.+\.(gif|jpg|jpeg))/, "$1large$3") +
‘" target="_blank" class="view_img_link">[查看原圖]</a>‘); d.before(a); d.before("<br>"); 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.onload = function() { add_img_loading_mask(this, load_sina_gif) } } }

很明顯可以看到裏面有句話,查看原圖,說明這個原始圖片鏈接在這裏。所以這個a就是我們所需要的,但是a是拼接起來的一個標簽,真實的圖片地址應該是c.replace(/(\/\/\w+\.sinaimg\.cn\/)(\w+)(\/.+\.(gif|jpg|jpeg))/, "$1large$3"),所以現在算出c就可以了,看到變量c=jdN1vojzUDgDM5WyoSjf4YBLbPRYr4ovPc(e, "9e03YzcYoHuEBMj5eS4c2tbLVWiqSgn1"),這是一個函數,傳入了兩個參數,一個e(圖片hash值),還有一個字符串,返回值賦值給了c。那我們繼續找jdN1vojzUDgDM5WyoSjf4YBLbPRYr4ovPc函數,和jandan_load_img()在同一個js文件中。

函數如下:

var jdN1vojzUDgDM5WyoSjf4YBLbPRYr4ovPc = function(n, t, e) {
    var f = "DECODE";
    var t = t ? t : "";
    var e = e ? e : 0;
    var r = 4;
    t = md5(t);
    // 將n也就是圖片的hash值賦值給變量d
    var d = n;
    var p = md5(t.substr(0, 16));
    var o = md5(t.substr(16, 16));
    if (r) {
        if (f == "DECODE") {
            var m = n.substr(0, r)
        }
    } else {
        var m = ""
    }
    var c = p + md5(p + m);
    var l;
    if (f == "DECODE") {
        n = n.substr(r);
        l = base64_decode(n)
    }
    var k = new Array(256);
    for (var h = 0; h < 256; h++) {
        k[h] = h
    }
    var b = new Array();
    for (var h = 0; h < 256; h++) {
        b[h] = c.charCodeAt(h % c.length)
    }
    for (var g = h = 0; h < 256; h++) {
        g = (g + k[h] + b[h]) % 256;
        tmp = k[h];
        k[h] = k[g];
        k[g] = tmp
    }
    var u = "";
    l = l.split("");
    for (var q = g = h = 0; h < l.length; h++) {
        q = (q + 1) % 256;
        g = (g + k[q]) % 256;
        tmp = k[q];
        k[q] = k[g];
        k[g] = tmp;
        u += chr(ord(l[h]) ^ (k[(k[q] + k[g]) % 256]))
    }
    if (f == "DECODE") {
        if ((u.substr(0, 10) == 0 || u.substr(0, 10) - time() > 0) && u.substr(10, 16) == md5(u.substr(26) + o).substr(0, 16)) {
            u = u.substr(26)
        } else {
            u = ""
        }
        //進行base64解碼
        u = base64_decode(d)
    }
    return u
};

這個代碼寫的真。。。長,但是我們只分析自己需要的部分,上面jandan_load_img函數裏的c是這個函數的返回值,也就是說我們只需要關註返回值就好。註意到這個返回值是y一個u,找到離return語句最近的u的賦值情況,可以看到,就是那句u=base64_decode(d),這個是一個base64解碼,參數是d。我們再找這個d是神馬玩意。主要到這個函數只有一句與d有關,就是var d = n,這個n是函數的第一個函數,也就是圖片的hash值。也就是說,這個圖片hash值經過一個base64解碼後返回值就是c,也就是圖片地址。

納尼!!!!!!!!!你寫這麽長的代碼就是整這麽個事情麽?!

我們以剛才那個圖片hash值為例,用python代碼寫一下,看看到底是不是能得到圖片的url。

#! usr/bin/env python
# coding:utf-8

import base64

img_hash = Ly93eDQuc2luYWltZy5jbi9tdzYwMC8wMDc2QlNTNWx5MWZzbWRxd2F1dzBqMzBnazBrcGFkOS5qcGc=
url = base64.b64decode(img_hash)
print(url)

技術分享圖片

用瀏覽器打開這個鏈接看一下。

技術分享圖片

我感覺我收到了侮辱!!!!!!我先吃碗面壓壓驚。相信大家看到這裏,應該都會爬取煎蛋妹子圖片了吧。代碼改天再補,我是真的吃面去了。。

僅供學習,請勿用於商業用途哦。

python3爬蟲爬取煎蛋網妹紙圖片