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 爬取煎蛋网妹子图实例(一)
前面介绍了爬虫框架的一个实例,那个比较简单,这里在介绍一个实例 爬取 煎蛋网 妹子图,遗憾的是 上周煎蛋网还有妹子图了,但是这周妹子图变成了 随手拍, 不过没关系,我们爬图的目的是为了加强实战应用,管 ...
随机推荐
- struts.xml 文件中的 namespace 属性图文详解
namespace:名称空间.默认值是""(空字符串). 名称空间+动作名称:构成了动作的访问路径
- HDU4786_Fibonacci Tree
题目很新颖的,略带智商,很好. 题目的意思是给你一些白色边和黑色边,现在问你能否用两色边构造出一颗生成树,且树中白色边的数量为一个Fibonacci数. 其实在没做题目之前我就已经听说了这个题目的解题 ...
- C#非泛型集合类与泛型集合类的区别 (转)
来自:http://blog.csdn.net/jiayanhui2877/article/details/7623845 C# 泛型集合之非泛型集合类与泛型集合类的对应: ArrayList对应Li ...
- BZOJ3875 AHOI2014/JSOI2014骑士游戏(动态规划)
容易想到设f[i]为杀死i号怪物所消耗的最小体力值,由后继节点更新.然而这显然是有后效性的,正常的dp没法做. 虽然spfa已经死了,但确实还是挺有意思的.只需要用spfa来更新dp值就可以了.dij ...
- C++解析(13):临时对象与const对象
0.目录 1.临时对象 2.const对象 3.类成员 4.小结 1.临时对象 一个有趣的问题--下面的程序输出什么?为什么? #include <stdio.h> class Test ...
- 关于upper、lower bound 的探讨
lower_bound(A, A+n, x) - A 返回第一个大于等于x的数的下标 lower_bound(A, A+n, x) - A - 1 返回最后一个小于x的数的下标 upper_boun ...
- 【数组】- ArrayList自动扩容机制
不同的JDK版本的扩容机制可能有差异 实验环境:JDK1.8 扩容机制: 当向ArrayList中添加元素的时候,ArrayList如果要满足新元素的存储超过ArrayList存储新元素前的存储能力, ...
- Toast与Snackbar的那点事
背景 Toast是Android平台上的常用技术.从用户角度来看,Toast是用户与App交互最基本的提示控件:从开发者角度来看,Toast是开发过程中常用的调试手段之一.此外,Toast语法也非常简 ...
- 【LOJ6436】【PKUSC2018】神仙的游戏(NTT)
[LOJ6436][PKUSC2018]神仙的游戏(NTT) 题面 LOJ 题解 看到\(zsy\)从\(PKUSC\)回来就秒掉了这种神仙题 吓得我也赶快看了看\(PKUSC\)都有些什么神仙题 然 ...
- BZOJ3295:[CQOI2011]动态逆序对——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=3295 Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数 ...