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 爬取煎蛋网妹子图实例(一)
前面介绍了爬虫框架的一个实例,那个比较简单,这里在介绍一个实例 爬取 煎蛋网 妹子图,遗憾的是 上周煎蛋网还有妹子图了,但是这周妹子图变成了 随手拍, 不过没关系,我们爬图的目的是为了加强实战应用,管 ...
随机推荐
- 虚拟机Centos设置静态IP
首先确保虚拟网卡(VMware Network Adapter VMnet8)是开启的,然后在windows的命令行里输入“ipconfig /all”,找到VMware Network Adapte ...
- javascript与python的比较
1:javascript与python大小写皆敏感 2:javascript使用{}来组织代码块,与大部分语言相同 python使用缩进来组织代码块,与大部分语言不同,请务必遵守约定俗成的习惯,坚持 ...
- PHP面向对象之接口
接口(interface)技术 什么是接口? 先看抽象类: abstract class 类名 { 属性1: 属性2: ..... 非抽象方法1: 非抽象方法2: ...... 抽象方法1: 抽 ...
- [Code Festival 2017 qual A] C: Palindromic Matrix
题意 给出一个小写字母组成的字符矩阵,问能否通过重排其中的字符使得每行每列都是回文串. 分析 简化版:给出一个字符串,问能否通过重排其中的字符使得它是回文串.那么如果字符串长度为偶数,就需要a到z的个 ...
- 【Java】JAVA开发人员常见环境工具安装
1.安装配置JDK1.7:jdk-7u45-windows-x64.exe,环境变量配置:JAVA_HOME---[F:\1024\jdk1.7],CLASSPATH---[.;%JAVA_HOME% ...
- 【JavaScript】JAVA-表格里的c:foreach使用及数字总计
两步:1.上图 2.上代码 <div class="group-accordion" collapsible="true" active="tr ...
- [CF1111C]Creative Snap
题目大意:有一个长度为$2^n(n\leqslant30)$的格子,有$k(k\leqslant10^5)$个球,分布在这些格子中,有两种消灭格子的方法: 1. 若一段格子长度大于等于$2$,可以对半 ...
- 廖大大python学习笔记1
列表classmates = ['Michael', 'Bob', 'Tracy']classmates.append('tom')print classmates# classmates.inser ...
- [CTSC2016]时空旅行
description 题面 solution 线段树分治+斜率优化毒瘤题 题目可以简化为: 你要维护一个包含元素\((x,c)\)的集合 修改操作为从以前的一个版本更新,修改内容为添加或删除一个元素 ...
- 用python + openpyxl处理excel(07+)文档 + 一些中文处理的技巧
sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频教程) https://study.163.com/course/introduction.htm?courseId=1005269003&am ...