我前两天无聊,鬼灭之刃第一季完结了,我暂时没啥动漫看,就想着看看鬼灭之刃的漫画,找了半天,找一个叫漫画堆的网站

鬼灭之刃​www.manhuadui.com

网页版的还可以,但是我当时拿手机在看,翻一个页就是一个性感XX,在线发牌在下面晃。

晃的爷好烦a!

然后我就想着干脆爬取整个鬼灭之刃,自己慢慢看,省着看广告

虽然不难,但是这整个过程也没那么简单。

因为涉及到一点点字符串解密。

而且也比较闲,弄点技术相关的东西也总比发呆好

我把这个程序归到动态爬虫里,但是好像又不算动态爬虫,有点特殊。

BB is cheap,show me your code

代码如下:

#开始时间:2019年10月22日 16:07:40
#结束时间:2019年10月28日 08:47:33
#作者:DMaple
#功能:爬取漫画堆漫画-鬼灭之刃
#版本1.0
#
'''
前提条件:需要在文件工程下添加那个下面的js文件。断断续续写了一周,
涉及功能:
request 获取网页代码
json & execjs   python调用js代码
os 文件的读写
re 正则表达式的应用'''import requests
import json
import time
import os
import re
import execjshost='https://mhcdn.manhuazj.com/'
l_url = "https://www.manhuadui.com"
url = "https://www.manhuadui.com/manhua/guimiezhiren/"
headers = {  # 模拟浏览器访问网页'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36'}
response = requests.get(url=url, headers=headers)def main():#获取章节地址list_source = dir()get_chapters(list_source)'''
功能:查找所有章节网址
返回值:字符串:包含每个章节的url以及章节名称
'''
def dir():#正则,匹配章节url以及章节名称pattern = re.compile('href="/manhua/.+.html.+title=.+"')print("dir 正则过滤-----------------------------")print("正在查找该漫画所有章节的url以及名称")list_source=pattern.findall(response.text)#print(list_source)return list_source'''
功能:获得章节的url以及名称
心得:正则表达式的写法以及python正则表达式的使用
'''
def get_chapters(list_source):#遍历所有章节的urli=0for chapter in list_source:#print(chapter)r_url = re.search('/manhua/.+.html', chapter).group()# 章节urlchapter_url = l_url + r_urlprint(chapter_url)chapter_name = re.search('title=".+" ', chapter).group()chapter_name = chapter_name[7:-2]print(chapter_name)#获取具体章节网页的静态代码res = requests.get(chapter_url, headers)chapter_image_list = get_js_chapterImage(res)chapter_path = get_chapter_Path(res)print("down_url:")chapter_root='gmzr//'+chapter_namecount=1for chapter_image in chapter_image_list:down_url = host+chapter_path+chapter_imageprint(down_url)download_image(down_url,chapter_root,chapter_image,count)count+=1# 降低服务器压力,每爬取一个章节的所有图片,延时10秒# 每爬取5个章节,再延时20秒print('延时20秒')time.sleep(20)i += 1if (i % 5 == 0):print('延时60秒')time.sleep(20)
#这里从网页的script标签里,找数据,chapterImage被后台加密,放到script标签里
'''
参数:章节url
ex:https://www.manhuadui.com/manhua/guimiezhiren/410940.html
返回值:章节所有图片的名称 [***.jpg]
返回值类型:list
'''
def get_js_chapterImage(res):#print(res.text)#正则过滤数据chapter_image_code = re.search('chapterImages = ".+";var chapterPath', res.text).group()chapter_image_code = re.search('".+"', chapter_image_code).group()print("chapter_image_code")print(chapter_image_code)chapter_image_code = chapter_image_code[1:-1]#解密章节图片乱码,还原成*.jpg格式chapter_Image_list = get_decryptImages(chapter_image_code)print("正在查询当前章节的所有图片")print(chapter_Image_list)return chapter_Image_listdef get_chapter_Path(res):chapter_path = re.search('chapterPath = ".+";var chapterP', res.text).group()chapter_path = re.search('".+"', chapter_path).group()chapter_path = chapter_path[1:-1]#print(chapter_path)return chapter_pathdef get_js():# f = open("D:/WorkSpace/MyWorkSpace/jsdemo/js/des_rsa.js",'r',encoding='UTF-8')f = open("decrypt20180904.js", 'r', encoding='UTF-8')line = f.readline()htmlstr = ''while line:htmlstr = htmlstr + lineline = f.readline()#print(htmlstr)return htmlstr#解密
def get_decryptImages(chapterImages):#获取解密js,进行解密js_str = get_js()ctx = execjs.compile(js_str)print(chapterImages)images =  ctx.call('decrypt20180904',chapterImages)#过滤数据:把字符串两边的符号["........."]过滤,以中间符号","进行切分images_list=str(images)[2:-2].split('","')return images_list#下载图片
def download_image(url,chapter_root,image_name,count):root = 'D://ManHua//TEST//'  #给个目录root = root+chapter_root+'//'#url = 'https://mhcdn.manhuazj.com/images/comic/5/8412/1551394269327841209ad0db6d.jpg'path = root + str(count)+'页.jpg'print(path)try:if not os.path.exists(root):os.mkdir(root)# 判断根目录是否存在,os.madir()创建根目录if not os.path.exists(path):r = requests.get(url)# 判断文件是否存在,不存在将从get函数获取with open(path, 'wb')as f:# wb存为二进制文件f.write(r.content)# 将返回内容写入文件 r.content返回二进制形式f.close()print('文件保存成功')else:print('文件已经存在')except:print('爬取失败')if __name__ == '__main__':main()

前提条件:需要在文件工程下添加decrypt20180904.js文件。像上图那样。

这个文件我做了一点小修改,是decrypt和crypto整合修改出来的

decrypt20180904改成这样,因为我们只要那个decryptedStr

function decrypt20180904(chapterImages) {var key = CryptoJS.enc.Utf8.parse("123456781234567G");  //十六位字符作为密钥var iv = CryptoJS.enc.Utf8.parse('ABCDEF1G34123412');var decrypt = CryptoJS.AES.decrypt(chapterImages,key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });var decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);//chapterImages = JSON.parse(decryptedStr.toString());return decryptedStr
}

然后把crypto-js的所有代码都粘贴到decrypt20180904下面去

像这样:

说一下思路吧

第一步:获取当前漫画的所有章节的url

dir()方法

第二步:遍历所有章节的url并获取其名称

get_chapters()方法

第三步:获取当前章节的所有图片

下面详细讲

能看动态爬虫文章的人,我默认阁下会爬取静态的网页

所以关于静态的知识就不详细介绍了。

*********************

前两步不难,有点基础就看得懂得

第三步这里就有说法了,因为有点难度了

想要爬取图片,就一定要知道图片具体的url,比如

https://mhcdn.manhuazj.com/images/comic/5/8412/1551394269327841209ad0db6d.jpg

上图为第一话的第一张图

首先,网页图片并不是静态html上的,查看网站源码

可知,图片并不在静态代码上。

初步判断在js上,先初步查看一下网页上所有的代码,script

仔细观察,找到了一点有趣的变量

明明是chapterImages(章节图片),但是这些东西都看不懂,而且这种乱码很容易让人厌烦就错过去,其实,越是这种让人厌烦的东西,越是要在意

(此地无银三百两,隔壁王二不曾偷)

也就是说,这东西应该就是chapterImages,但是被加密了

再粗略的查看一下network下所有的js文件,所有的js文件我粗略的看了一遍

这里有四个文件比较重要

config.js 配置文件,怎么都得看一眼

crypto-js.js 经百度得知这东西是一种前端经常应用的一种加密方法 crypto加密

(会英语真他娘的重要)

decrypt20180904.js 解密

仔细看common.js文件,仔细的看了一遍(这js真长)

你以为躲起来就找不到你了吗?没有用的,你是那样拉风的注释,不管在什么地方就好像漆黑中的萤火虫一样,那样的鲜明,那样的出众,你那忧郁的文字,唏嘘的代码,神乎奇迹的命名,还有那个正则表达式,都深深的迷住了我

是的,初期我就在这里上当了,耽搁了很长时间

仔细看了看,return上面那句,是字符串拼接,一个章节图片的url分为三部分

host+chapter.path+filename

host在config.js里面写死了

chapter.path和chapterImages在一个script标签里。

而且,既然进行拼接。说明,chapterImages已经被解密了

那就找一下chaperImages在哪里被解密的

找decrypt***.js那个文件,查看代码

decryptedStr这个变量,应该就是被解密后的变量了

我们需要这个。

所以做了一些改动,改动什么的上面已经提过了。

这里是程序运行时控制台打印的数据

多观察或者查看这些js代码,可以发现

每一张图片的格式都是:

https://mhcdn.manhuazj.com/images/comic/5/8471/1551394849149847143b3deea8.png

其实就是host+chapter.path+filename

到这里,思路已经完全说明。

具体代码什么的就不一一解读了,我觉得注释写的挺详细的。

有什么不懂的或者探讨的可以评论区留言


分割线:从130话开始,解密出来的就不是那个image名称了,而是正儿八经的url

如:URL:https://mhcdn.manhuazj.com//ManHuaKu//g//guimiezhiren//136//201915493.jpg

当然了,格式不是这样的,需要你自己去调整,代码不贴了,一点不难。

js rsa解密中文乱码_python解析JS爬取漫画网站--动态爬虫相关推荐

  1. js rsa解密中文乱码_建议收藏 | 最全的 JS 逆向入门教程合集

    点击上方"咸鱼学Python",选择"加为星标" 第一时间关注Python技术干货! 嘿,大家好,截止今天咸鱼零零散散分享爬虫.数据分析基础和 Web 的内容已 ...

  2. js rsa解密中文乱码,js中文rsa,中文加密偶尔解密不出来

    https://blog.csdn.net/lionking1990/article/details/106092990 直接改动jsencrypt.js文件,在文件最下方的 JSEncrypt.ve ...

  3. RSA解密中文乱码解决,前端加密后端解密

    var name = '中文测试'var nameen = encodeURIComponent(name);var name = encrypt.encrypt(nameen); 先用encodeU ...

  4. python超详细零基础 bs4解析之爬取唯美图片

    文章目录 前言 前言 本篇文章主要介绍使用bs4解析来爬取某网站上的唯美高清大图,涉及到的零碎知识较多,详细易懂,适合新手小白爬虫入门. 思路如下: ①拿到主页面的源代码,然后提取到子页面的链接地址h ...

  5. 爬虫实例(re解析):爬取电影排行榜(含全部代码)

    爬虫实例(re解析):爬取电影排行榜 在爬虫之前明确自己的步骤: 一.获取要爬取的网页的源代码(会用到requests库) 二.通过正则解析提取想要的有效信息(要用到re) 三.保存数据(csv) 找 ...

  6. node.js读取文件中文乱码问题

    node.js读取文件中文乱码问题 出现乱码原因: 在windows中,默认的中文编码方式是根据系统的locale决定的,中文系统中的默认的编码方式为gb2312而不是utf-8 解决方法: 如果读取 ...

  7. 关于RSA加密后,后台解密中文乱码的解决方法

    关于RSA后台解密中文乱码的问题 首先你得前端在加密中文之前把中文进行处理一下,处理成 %E5%B8%82%E8%83%BD%E6%BA%90%E5%B1%80%E7%AE%A1%E7%90%86%E ...

  8. jsp中引入外部js文件发生中文乱码

    jsp中引入外部js文件发生中文乱码 前言 排查 解决问题 前言 我在写作业时发现自己的作业出现中文乱码 排查 我先检查了一番 根据F12找到了span标签的id,在编译器中进行搜索找到找到了语句的所 ...

  9. js function如何传入参数未字符串_Python爬虫 JS 案例讲解:爬取漫画

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 以下文章来源于Python爬虫案例,作者麦自香 转载地址 https://blo ...

最新文章

  1. 操作系统学习:系统调用与Linux0.12初始化详细流程
  2. 看完书要及时消化(1)《暗时间》
  3. 自由自在意式手工冰淇淋走俏仲夏之季
  4. Exchange2013恢复已删除用户邮箱
  5. 96. Unique Binary Search Trees1和2
  6. linux 键盘过滤,linux – 需要拦截HID Keyboard事件(然后阻止它们)
  7. C#LeetCode刷题-随机数
  8. 关于maven pom
  9. 计算机科学对社会发展的作用,科学技术在计算机领域对社会发展的作用及影响...
  10. 【统计学】英文概念之Mean和Average的区别
  11. DIY回音壁多媒体音箱
  12. lisp 左手钢筋_左手键配置程序
  13. es7,es8,es9新特性
  14. 2022泰迪杯数据分析技能赛B题方案及赛后总结:银行客户忠诚度分析
  15. 工业通讯 | STM32F4xx应用控制器与SoM集成 Ⅱ
  16. 360wifi在linux系统如何使用,在树莓派上使用360WIFI(也适用于小米、百度、腾讯WIFI)...
  17. 计算机毕业设计JAVA派大星水产商城mp4mybatis+源码+调试部署+系统+数据库+lw
  18. autom4te.cache简介及可能引发的问题
  19. ElasticSearch:部署ElasticSearch Kibana
  20. python安全开发-多线程目录扫描端口扫描子域名爆破dou瓣属性爬取

热门文章

  1. mysql导入库排除某个表_mysql导入数据排除表-mysql导入数据排除某张表或多张表-吾爱编程网...
  2. java实现客服转接_Java微信公众平台开发(9) 关键字回复以及客服接口实现
  3. gd动态曲线 php_PHP 高级编程之多线程
  4. volatile指令重排_学会了volatile,你变心了,我看到了
  5. python窗体处理access数据库_用Python操作MS Access数据库
  6. (万里开源)greatdb mysql 8.0以上版本创建用户并授权远程连接
  7. Shrink space合并表的碎片
  8. Nagios飞信linux系统免费短信报警配置
  9. linux arm桌面程序,Electron 从零创建一个 Windows/OS X/Linux 的桌面可执行程序
  10. 华硕h81m一k跳线图_股票入门基础知识:你真的看懂了K线图了?【建议收藏】1...