美文网首页
煎蛋妹子图爬虫

煎蛋妹子图爬虫

作者: v1coder | 来源:发表于2018-12-25 00:13 被阅读0次

为了不增加网站的负担,这里只做一个demo,输出一页的图片地址


代码:

# python3
# -*- coding: utf-8 -*-
# Filename: jandan_demo.py
"""
输出煎蛋妹子图地址

@author: v1coder
"""

import requests
from bs4 import BeautifulSoup
import base64

headers = {'User-Agent': ''}

url = 'http://jandan.net/top-ooxx'
data = requests.get(url, headers=headers).content
soup = BeautifulSoup(data, 'lxml')
url_tags = soup.find_all('span', class_="img-hash")
for url_tag in url_tags:
    url_hash = url_tag.text
    # base64 to bytes
    url_bytes = base64.b64decode(url_hash)
    # bytes to str
    url = str(url_bytes, encoding='utf-8')
    complete_url = 'http:' + url
    print(complete_url)

煎蛋的网页源代码找不到图片地址,所以我们换一种方法

具体方法:

  • 找到图片代码位置

打开 Chrome 浏览器开发者工具(Mac 下快捷键 option+command+I),点击开发者工具左上角的箭头,再将点击网页中的图片,就能定位到图片代码的位置

  • 网页源码中找信息

Chrome 浏览器打开网页源码(Mac 下快捷键 option+command+U),在本该出现图片地址的位置是以下代码

<p><img src="//img.jandan.net/img/blank.gif" onload="jandan_load_img(this)" /><span class="img-hash">Ly93eDEuc2luYWltZy5jbi9tdzYwMC84MmU5ODk1Mmx5MWZ5Z29hcmZqeHFqMjB1bzFoYzdjaS5qcGc=</span></p>

这里有两个关键信息:

jandan_load_img(this) 函数和"img-hash"> 后面的值

  • 解码网址

先从 jandan_load_img(this) 入手

开发者模式下全局搜索(Windows快捷键 ctrl+shift+f,Mac 快捷键 option+command+F),搜函数名jandan_load_img ,找到对应的的 js 文件,再点击花括号

就可以看到 js 文件的代码,在里面搜索(快捷键 command+F)函数名jandan_load_img

function jandan_load_img(b) {
    var d = $(b);
    var f = d.next("span.img-hash");
    var e = f.text();
    f.remove();
    var c = jdQFXcEeWzpGANTZyHb1G0w0ggDlCZ5ILV(e, "qOzLfOL8mfbbsawjoQQPkWwkakHnOGze");
    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)
        }
    }
}

大概意思是说取到 class='img-hash' 的 span 标签中的值, 通过 jdQFXcEeWzpGANTZyHb1G0w0ggDlCZ5ILV 这个函数处理之后, 然后再拼接成图片的地址。

我们再查找jdQFXcEeWzpGANTZyHb1G0w0ggDlCZ5ILV 这个函数

var jdQFXcEeWzpGANTZyHb1G0w0ggDlCZ5ILV = 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 (h) {
        if (l == "DECODE") {
            var b = md5(microtime());
            var e = b.length - h;
            var u = b.substr(e, h)
        }
    } else {
        var u = ""
    }
    var t = x + md5(x + u);
    var n;
    if (l == "DECODE") {
        g = g ? g + time() : 0;
        tmpstr = g.toString();
        if (tmpstr.length >= 10) {
            o = tmpstr.substr(0, 10) + md5(o + v).substr(0, 16) + o
        } else {
            var f = 10 - tmpstr.length;
            for (var q = 0; q < f; q++) {
                tmpstr = "0" + tmpstr
            }
            o = tmpstr + md5(o + v).substr(0, 16) + o
        }
        n = o
    }
    var k = new Array(256);
    for (var q = 0; q < 256; q++) {
        k[q] = q
    }
    var r = new Array();
    for (var q = 0; q < 256; q++) {
        r[q] = t.charCodeAt(q % t.length)
    }
    for (var p = q = 0; q < 256; q++) {
        p = (p + k[q] + r[q]) % 256;
        tmp = k[q];
        k[q] = k[p];
        k[p] = tmp
    }
    var m = "";
    n = n.split("");
    for (var w = p = q = 0; q < n.length; q++) {
        w = (w + 1) % 256;
        p = (p + k[w]) % 256;
        tmp = k[w];
        k[w] = k[p];
        k[p] = tmp;
        m += chr(ord(n[q]) ^ (k[(k[w] + k[p]) % 256]))
    }
    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
};

大概意思是对图片网址进行了 base64 编码,所以我们尝试对源码中的"img-hash"> 后面的值进行 base64 解码。

解码方式:

import base64
b = 'Ly93eDEuc2luYWltZy5jbi9tdzYwMC84MmU5ODk1Mmx5MWZ5Z29hcmZqeHFqMjB1bzFoYzdjaS5qcGc='
base64.b64decode(b)
# 输出
b'//wx1.sinaimg.cn/mw600/82e98952ly1fygoarfjxqj20uo1hc7ci.jpg'
  • 最后

把 bytes 对象转换成 str ,再把网址拼接完整就可以了。

url = str(url_bytes, encoding='utf-8')
complete_url = 'http:' + url

鸣谢:
hellospider - jandan
Python爬虫爬取煎蛋网无聊图
oversplit - Jandan

2018-12-25

相关文章

网友评论

      本文标题:煎蛋妹子图爬虫

      本文链接:https://www.haomeiwen.com/subject/ywxxlqtx.html