开始我学习爬虫的目标 ----> 煎蛋网

通过设置User-Agent获取网页,发现本该是图片链接的地方被一个js函数代替了

于是全局搜索到该函数

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

该函数提取span.img-hsah传到另一个函数中,继续查找,有两个定义,于是选择靠后的那个

 var jdTzcXZnL0V2WZZ8eq9786xeOdkyoBXlDR=function(m,r,d){
var e="DECODE";
var r=r?r:"";
var d=d?d:0;
var q=4;
r=md5(r);
var o=md5(r.substr(0,16));
var n=md5(r.substr(16,16));
if(q){if(e=="DECODE"){var l=m.substr(0,q)}}
else{var l=""}
var c=o+md5(o+l);
var k;
if(e=="DECODE"){m=m.substr(q);
k=base64_decode(m)}
var h=new Array(256);
for(var g=0;g<;g++){h[g]=g}
var b=new Array();
for(var g=0;g<256;g++){b[g]=c.charCodeAt(g%c.length)}
for(var f=g=0;g<256;g++){f=(f+h[g]+b[g])%256;
tmp=h[g];
h[g]=h[f];
h[f]=tmp}
var t="";
k=k.split("");
for(var p=f=g=0;
g<k.length;
g++){p=(p+1)%256;
f=(f+h[p])%256;
tmp=h[p];
h[p]=h[f];
h[f]=tmp;
t+=chr(ord(k[g])^(h[(h[p]+h[f])%256]))}
if(e=="DECODE"){if((t.substr(0,10)==0||t.substr(0,10)-time()>0)&&t.substr(10,16)==md5(t.substr(26)+n).substr(0,16)){t=t.substr(26)}
else{t=""}
}
return t
};

参考文章:  http://www.tendcode.com/article/jiandan-meizi-spider/

其中有对js的函数的改写

最后代码如下

 # -*- coding = UTF-8 -*-
'''
目标:煎蛋网妹子图
2018/4/22
环境:pyhton3 ''' import urllib.request #使用url处理包,urllib.request模块是用来打开和读取URLs的
import re #使用正则表达式
import hashlib #
import base64 #
from bs4 import BeautifulSoup #
import time #time
import logging #log
import sys # '''
下载单张图片到制定的文件夹下
'''
def load_img(imgurl, file):
name = imgurl.split('/')[-1]
item = urllib.request.urlretrieve('http:'+imgurl,\
#'C:\\Users\\74172\\Pictures\\jandan2\\%s'%(name))
file+'\\%s'%(name))
print(name+' is loaded') '''
md5加密
'''
def _md5(value):
m = hashlib.md5()
m.update(value.encode('utf-8'))
return m.hexdigest() '''
bash64解码
注意 原字符串长度报错问题
'''
def _base64_decode(data):
missing_padding = 4 - len(data) % 4
if missing_padding:
data += '=' * missing_padding
return base64.b64decode(data) '''
解密获取图片链接
'''
def get_imgurl(m, r='', d=0):
e = "DECODE"
q = 4
r = _md5(r)
o = _md5(r[0:0 + 16])
n = _md5(r[16:16 + 16])
l = m[0:q]
c = o + _md5(o + l)
m = m[q:]
k = _base64_decode(m)
h = list(range(256))
b = [ord(c[g % len(c)]) for g in range(256)] f = 0
for g in range(0, 256):
f = (f + h[g] + b[g]) % 256
tmp = h[g]
h[g] = h[f]
h[f] = tmp t = ""
p, f = 0, 0
for g in range(0, len(k)):
p = (p + 1) % 256
f = (f + h[p]) % 256
tmp = h[p]
h[p] = h[f]
h[f] = tmp
t += chr(k[g] ^ (h[(h[p] + h[f]) % 256]))
t = t[26:]
return t '''
获取关键字符串
'''
def get_r(js_url):
js_respon = urllib.request.urlopen(js_url)
js = js_respon.read().decode('utf-8')
_r = re.findall('c=[\w\d]+\(e,"(.*?)"\)', js)
return _r '''
获取一个页面的所有图片的链接
'''
def get_urls(url,pages,file):
page = 0
imagNum = 0
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36',
'Host': 'jandan.net'
}
#########################################
while page < pages:
req = urllib.request.Request(url, headers=headers)
respon = urllib.request.urlopen(req)
html = respon.read().decode('utf-8')
##########################################
js_url = 'http:' + re.findall('<script src="(//cdn.jandan.net/static/min/[\w\d]+\.\d+\.js)"></script>', html)[-1]
_r = get_r(js_url)[0]
soup = BeautifulSoup(html, 'lxml')
tags = soup.select('.img-hash')
for tag in tags:
img_hash = tag.text
img_url = get_imgurl(img_hash,_r)
print(imagNum,'------>',img_url)
imagNum = imagNum+1
load_img(img_url,file)
############################################
nextUrl = re.findall(r'Older Comments" href=".+?.#comments"',html)[0]
print('page#',90-page,'---->done!')
url = 'http:' + nextUrl[22:-1]
page += 1
time.sleep(10)
print('done all!')
print('located---->',file) if __name__ == '__main__':
url = 'http://jandan.net/ooxx/'
pages = 1      
file = 'C:\\jandan_meizi'
get_urls(url,pages,file)

//************2018.05.03*******************************

刚下班回来爬图,发现中间有个报错,

是get_url一次返回的多张图片链接,于是的改段

     for tag in tags:
img_hash = tag.text
img_urls = get_imgurl(img_hash,_r)
img_urls = re.findall(r'//wx.+?.jpg',img_urls)
for img_url in img_urls:
print(imagNum,'------>',img_url)
imagNum = imagNum+1
load_img(img_url,file)

//************2018.5.23***********************************

又报错了,暂时没有解决。

python3爬虫.4.下载煎蛋网妹子图的更多相关文章

  1. python3爬虫爬取煎蛋网妹纸图片(上篇)

    其实之前实现过这个功能,是使用selenium模拟浏览器页面点击来完成的,但是效率实际上相对来说较低.本次以解密参数来完成爬取的过程. 首先打开煎蛋网http://jandan.net/ooxx,查看 ...

  2. python3爬虫爬取煎蛋网妹纸图片(下篇)2018.6.25有效

    分析完了真实图片链接地址,下面要做的就是写代码去实现了.想直接看源代码的可以点击这里 大致思路是:获取一个页面的的html---->使用正则表达式提取出图片hash值并进行base64解码--- ...

  3. 项目: python爬虫 福利 煎蛋网妹子图

    嘿嘿嘿! 嘿嘿嘿! 福利一波, 之前看小甲鱼的python教学视频的时候, 看到上面教的爬虫, 爬美女图片的, 心很痒痒, 但是不知道为啥, 按照视频一个字一个字敲的代码,总是报错, 有一天花了 一下 ...

  4. Python 爬虫:煎蛋网妹子图

    使用 Headless Chrome 替代了 PhatomJS. 图片保存到指定文件夹中. import requests from bs4 import BeautifulSoup from sel ...

  5. python学习笔记(12)--爬虫下载煎蛋网图片

    说明: 1. 这个其实是在下载漫画之前写的,比那个稍微简单点,之前忘放到博客备份了. 2. 不想说啥了,总结放到漫画那个里面吧! import urllib.request import re imp ...

  6. Python 爬虫 爬取 煎蛋网 图片

    今天, 试着爬取了煎蛋网的图片. 用到的包: urllib.request os 分别使用几个函数,来控制下载的图片的页数,获取图片的网页,获取网页页数以及保存图片到本地.过程简单清晰明了 直接上源代 ...

  7. python爬虫–爬取煎蛋网妹子图片

    前几天刚学了python网络编程,书里没什么实践项目,只好到网上找点东西做. 一直对爬虫很好奇,所以不妨从爬虫先入手吧. Python版本:3.6 这是我看的教程:Python - Jack -Cui ...

  8. python爬虫爬取煎蛋网妹子图片

    import urllib.request import os def url_open(url): req = urllib.request.Request(url) req.add_header( ...

  9. Python Scrapy 爬取煎蛋网妹子图实例(一)

    前面介绍了爬虫框架的一个实例,那个比较简单,这里在介绍一个实例 爬取 煎蛋网 妹子图,遗憾的是 上周煎蛋网还有妹子图了,但是这周妹子图变成了 随手拍, 不过没关系,我们爬图的目的是为了加强实战应用,管 ...

随机推荐

  1. php opensll加解密类

    <?php $pri = "-----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQCzJc4RrAqaH2Es02XQ91Cqp/JK0yX893 ...

  2. 条形码生成库 BarcodeLib

    官方介绍 在ASP.NET,Windows,Reporting Service,Crystal Reports 和 RDLC Reports应用程序中轻松生成条形码 生成准确的条形码图像,并可以保存为 ...

  3. ZOJ3529_A Game Between Alice and Bob

    题目的意思是给你若干个数字,两个游戏者轮流操作,每次可以将该数变为一个小于当前的一个约数,无法操作的游戏者fail. 和其他的博弈题目大同小异吧. 不同点有两个,逐一分析吧. 一.每次改变一个数只能改 ...

  4. android面试(1)----布局

    1.说出android 五中布局,并说出各自作用? FrameLayout: 堆叠布局,也是就可以堆在一起.最长应用于Fragment的使用上. LinearLayout: 线性布局,可以是竖排或水平 ...

  5. BZOJ4976 宝石镶嵌(动态规划)

    显然被留下的宝石应该贡献至少一位,否则就可以扔掉.所以如果n-k>=logw,直接输出所有数的or.现在n变得和k同阶了.于是设f[i][j]为前i个数or为j时至少选几个数,转移显然.当然可以 ...

  6. 【hdu6072】Logical Chain

    Kosaraju算法,然後bitset優化 主要是學習一下自寫bitset的姿勢 #include<cstring> #include<algorithm> #include& ...

  7. Docker学习笔记四:Docker镜像、容器管理工具shipyard

    一.拉取以下几种镜像: docker pull alpineshipyard/shipyarddocker pull swarm docker pull shipyard/shipyarddocker ...

  8. 【Luogu1912】【NOI2009】诗人小G(动态规划)

    [Luogu1912][NOI2009]诗人小G(动态规划) 题面 洛谷 题解 原来\(NOI\)这么多神仙题... 考虑一个极其明显的\(dp\) 设\(f[i]\)表示前\(i\)个句子产生的最小 ...

  9. 洛谷 P4721 【模板】分治 FFT 解题报告

    P4721 [模板]分治 FFT 题目背景 也可用多项式求逆解决. 题目描述 给定长度为 \(n−1\) 的数组 \(g[1],g[2],\dots,g[n-1]\),求 \(f[0],f[1],\d ...

  10. 怎样才能高效地使用JQuery

    1. 使用最新版本的jQuery jQuery的版本更新很快,你应该总是使用最新的版本.因为新版本会改进性能,还有很多新功能.下面就来看看,不同版本的jQuery性能差异有多大.这里是三条最常见的jQ ...