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 爬取煎蛋网妹子图实例(一)
前面介绍了爬虫框架的一个实例,那个比较简单,这里在介绍一个实例 爬取 煎蛋网 妹子图,遗憾的是 上周煎蛋网还有妹子图了,但是这周妹子图变成了 随手拍, 不过没关系,我们爬图的目的是为了加强实战应用,管 ...
随机推荐
- .net下使用NPOI读取Excel表数据
这里只写MVC下的情况 public ActionResult Index() { var path = Server.MapPath(@"/content/user.xlsx") ...
- SPOJ4717——Grid Points in a Triangle
题目的意思很简单.就是要你求出斜率为a/b的一个点在原点,一条边为x=n的RT三角形里面有多少个整数点? 看完题目后依然没有思路,依然去看各个神牛写的题解.后来才反应过来. 题目的正解应该是这样的.递 ...
- bzoj4815[CQOI2017]小Q的格子
题意 不简述题意了,简述题意之后这道题就做出来了.放个原题面. 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理. 每当小Q不知道如何解决时,就只好向 ...
- 【bzoj3992】[SDOI2015]序列统计 原根+NTT
题目描述 求长度为 $n$ 的序列,每个数都是 $|S|$ 中的某一个,所有数的乘积模 $m$ 等于 $x$ 的序列数目模1004535809的值. 输入 一行,四个整数,N.M.x.|S|,其中|S ...
- 【loj2325】「清华集训 2017」小Y和恐怖的奴隶主 概率dp+倍增+矩阵乘法
题目描述 你有一个m点生命值的奴隶主,奴隶主受伤未死且当前随从数目不超过k则再召唤一个m点生命值的奴隶主. T次询问,每次询问如果如果对面下出一个n点攻击力的克苏恩,你的英雄期望会受到到多少伤害. 输 ...
- ssh-keygen的使用方法及配置authorized_keys两台linux机器相互认证
一.概述 1.就是为了让两个linux机器之间使用ssh不需要用户名和密码.采用了数字签名RSA或者DSA来完成这个操作 2.模型分析 假设 A (192.168.20.59)为客户机器,B(192. ...
- [JSOI2009]游戏 二分图博弈
题面 题面 题解 二分图博弈的模板题,只要会二分图博弈就可以做了,可以当做板子打. 根据二分图博弈,如果一个点x在某种方案中不属于最大匹配,那么这是一个先手必败点. 因为对方先手,因此我们就是要找这样 ...
- 【BZOJ4755】扭动的回文串(Manacher,哈希)
[BZOJ4755]扭动的回文串(Manacher,哈希) 题面 BZOJ 题解 不要真的以为看见了回文串就是\(PAM,Manacher\)一类就可以过. 这题显然不行啊. 我们主要考虑如何解决跨串 ...
- 使用Empire自动获取域管理员
使用Empire自动获取域管理员 译:backlion 前言 自从Empire和BloodHound被应用来,对AD渗透已经可以获取到内网环境95%的信息量.作者发现自己一遍又一遍地在做同样重复的事 ...
- javascript中的位运算,
罗浮宫群里又有讨论位运算符号|了,做过一段时间php,数据库保存布尔值数据经常用到,比如100110 就表明了六个属性的是与否,极大减少了数据量..] ECMAScript 中位运算跟其他语言一样的. ...