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 爬取煎蛋网妹子图实例(一)
前面介绍了爬虫框架的一个实例,那个比较简单,这里在介绍一个实例 爬取 煎蛋网 妹子图,遗憾的是 上周煎蛋网还有妹子图了,但是这周妹子图变成了 随手拍, 不过没关系,我们爬图的目的是为了加强实战应用,管 ...
随机推荐
- 【vue】index.html main.js app.vue index.js怎么结合的? 怎么打包的?搜集的信息
转载:https://blog.csdn.net/yudiandemingzi/article/details/80247137 怎么结合的: 一.启动项目 第一步:cmd进入项目文件里,运行npm ...
- 树状数组模板(pascal) 洛谷P3374 【模板】树状数组1
题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...
- [BZOJ1503][NOI2004]郁闷的出纳员 无旋Treap
1503: [NOI2004]郁闷的出纳员 Time Limit: 5 Sec Memory Limit: 64 MB Description OIER公司是一家大型专业化软件公司,有着数以万计的员 ...
- 【BZOJ1014】火星人(Splay,哈希)
[BZOJ1014]火星人(Splay,哈希) 题面 BZOJ 题解 要动态维护这个串,一脸的平衡树. 那么用\(Splay\)维护这个哈希值就好了. 每次计算答案的时候二分+Splay计算区间哈希值 ...
- 洛谷 P1171 售货员的难题 【状压dp】
题目描述 某乡有n个村庄(1<n<20),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(0<s<1000)是已知的,且A村到B村与B村到A村的路大多不同.为了提高效率 ...
- 洛谷U14200 Changing 题解 【杨辉三角】
题目描述 有nnn盏灯环形排列,顺时针依次标号为1⋯n1\cdots n1⋯n.初始时刻为000,初始时刻第iii盏灯的亮灭aia_iai给定,000表示灭,111表示亮.下一时刻每盏灯的亮灭取决于 ...
- (转)搭建本地 8.8 W 乌云漏洞库
下载地址: 开源地址: https://github.com/m0l1ce/wooyunallbugs 百度网盘: 链接: http://pan.baidu.com/s/1nvkFKox 密码: 94 ...
- 解题:APIO 2008 免费道路
题面 我们发现我们可以很容易知道最终完成的生成树中有多少鹅卵石路,但是我们不好得到这棵生成树的结构,所以我们尽量“谨慎”地完成生成树·,最好是一点点加到我们要达到的标准而不是通过删掉一些东西来完成 我 ...
- poj 1945 Power Hungry Cows A*
Description: 就是给你一个数,你可以把它自乘,也可以把他乘或除以任意一个造出过的数,问你最多经过多少次操作能变换成目标数 思路:这题真的不怎么会啊.n = 20000,每一层都有很 ...
- Codeforces Round #298 (Div. 2)A B C D
A. Exam time limit per test 1 second memory limit per test 256 megabytes input standard input output ...