python3爬虫.4.下载煎蛋网妹子图
开始我学习爬虫的目标 ----> 煎蛋网
通过设置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.下载煎蛋网妹子图的更多相关文章
- python3爬虫爬取煎蛋网妹纸图片(上篇)
		其实之前实现过这个功能,是使用selenium模拟浏览器页面点击来完成的,但是效率实际上相对来说较低.本次以解密参数来完成爬取的过程. 首先打开煎蛋网http://jandan.net/ooxx,查看 ... 
- python3爬虫爬取煎蛋网妹纸图片(下篇)2018.6.25有效
		分析完了真实图片链接地址,下面要做的就是写代码去实现了.想直接看源代码的可以点击这里 大致思路是:获取一个页面的的html---->使用正则表达式提取出图片hash值并进行base64解码--- ... 
- 项目: python爬虫 福利 煎蛋网妹子图
		嘿嘿嘿! 嘿嘿嘿! 福利一波, 之前看小甲鱼的python教学视频的时候, 看到上面教的爬虫, 爬美女图片的, 心很痒痒, 但是不知道为啥, 按照视频一个字一个字敲的代码,总是报错, 有一天花了 一下 ... 
- Python 爬虫:煎蛋网妹子图
		使用 Headless Chrome 替代了 PhatomJS. 图片保存到指定文件夹中. import requests from bs4 import BeautifulSoup from sel ... 
- python学习笔记(12)--爬虫下载煎蛋网图片
		说明: 1. 这个其实是在下载漫画之前写的,比那个稍微简单点,之前忘放到博客备份了. 2. 不想说啥了,总结放到漫画那个里面吧! import urllib.request import re imp ... 
- Python 爬虫 爬取 煎蛋网 图片
		今天, 试着爬取了煎蛋网的图片. 用到的包: urllib.request os 分别使用几个函数,来控制下载的图片的页数,获取图片的网页,获取网页页数以及保存图片到本地.过程简单清晰明了 直接上源代 ... 
- python爬虫–爬取煎蛋网妹子图片
		前几天刚学了python网络编程,书里没什么实践项目,只好到网上找点东西做. 一直对爬虫很好奇,所以不妨从爬虫先入手吧. Python版本:3.6 这是我看的教程:Python - Jack -Cui ... 
- python爬虫爬取煎蛋网妹子图片
		import urllib.request import os def url_open(url): req = urllib.request.Request(url) req.add_header( ... 
- Python Scrapy 爬取煎蛋网妹子图实例(一)
		前面介绍了爬虫框架的一个实例,那个比较简单,这里在介绍一个实例 爬取 煎蛋网 妹子图,遗憾的是 上周煎蛋网还有妹子图了,但是这周妹子图变成了 随手拍, 不过没关系,我们爬图的目的是为了加强实战应用,管 ... 
随机推荐
- 图文详解 IntelliJ IDEA 15 创建普通 Java Web 项目
			第 1 部分:新建一个 Java Web Application 项目 File -> New -> Project…,请选择 Java EE 这个模块下的 Web Application ... 
- PHP关于传众多参数还是传上下文对象的性能测试
			在开发微信公众平台平台的过程中,有这么几个参数总是需要传来传去,$userOpenId,$message,$time. 在整个程序的运行过程中,为了函数方便的处理,将这三个变量一直放在参数列表里.关于 ... 
- java 基础 --final--008
			finally:被finally控制的语句一定会执行,但是如果执行之前jvm退出了,就不会执行了.比如System.exit(0);final:常见的可以修饰类(该类不能被继承) 方法(方法不能被重写 ... 
- Java 中 Vector、ArrayList、List 使用深入剖析
			线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文试图通过简单的描述,向读者阐述各个类的作用以 ... 
- [Git/Github] ubuntu 14.0 下github 配置
			转载自:http://www.faceye.net/search/77573.html 一:创建Repositories1:首先在github下创建一个帐号.这个不用多说,然后创建一个Reposito ... 
- iOS 通过网络请求获取图片的下载歌曲
			1.导入代理<NSURLConnectionDataDelegate> @interface ViewController ()<NSURLConnectionDataDelegat ... 
- luogu 1967 货车运输(最大生成树+LCA)
			题意:给出一颗n个点的图,q个询问,每次询问u到v的路径中最小的边最大是多少. 图的最大生成树有一个性质,对于该图的任意两个点,在树中他们之间路径的最小边最大. 由于这个图不一定联通,于是我们对它的联 ... 
- C++函数中的那些坑
			平时写程序时,我们可能或多或少对一些用法感到朦胧,下面我对一些易困惑大家,或者易用错的地方作点介绍. 一.函数的一些注意点 1.函数返回类型不能是数组类型或函数类型,但可以是指向数组或函数的指针. 2 ... 
- [九]SpringBoot 之 定时任务
			代码: package me.shijunjie.config; import org.springframework.context.annotation.Configuration; import ... 
- C++解析(4):引用的本质
			0.目录 1.引用的意义 2.特殊的引用 3.引用的本质 4.函数返回引用 5.小结 1.引用的意义 引用作为变量別名而存在,因此在一些场合可以代替指针 引用相对于指针来说具有更好的可读性和实用性 注 ... 
