JS逆向:狐妖小红娘漫画扒取
url: http://www.chuixue.net/manhua/12533/
工具: Pycharm, Chrome, node.js
最近在学python, 接触了点爬虫的相关知识, 学以致用, 所以随手找了本漫画《狐妖小红娘》来练手。本来以为漫画网站都挺简单的,因为都是小网站, 应该不会有什么反爬机制。然而...
误区一: 小网站可能直接利用的别人的网站架构, 里面可能也有反爬的坑。就算没有运维IP检测, 想混进去也不容易。
误区二: 反爬的主要手段出了检测IP,请求头之类的, 还有一大杀器:前端JS, 因为大部分学python的对JS了解不是很多。
对于漫画网站来讲, 一张图片大小从200k到2M不等, 如果直接加载,那么我们看到的效果可能是一打开网站, 半天都是空白, 然
后刷出整个网站, 这样是非常影响体验的, 所以大部分漫画网站都采用了JS动态加载。
而针对狐妖小红娘这部漫画,它里面估计是后端分几次写的, 所以主域名都有两个, 而且前半部分的漫画和后半部分的前端文档结构不一致。下面上干货:
首先通过上面的url获取首页里面的各章节文档, 这个难度不大, 直接requests获取就OK了。
进入到下一层页面后首先一个注意点是:
我们通过requests获取到的页面都是在Sources里面的, Elements的都是本地浏览器加载JS后动态渲染后的文档结构。而打开Sources里面的文件一看, 可以发现他里面大部分都是JS代码混在一些html标签里面, 图片地址和下一页的链接都没有, 但是里面有个东西大家应该很熟悉
和加载后的文档对比就会发现这是图片的url, so,初步完成, 只要拼接url就OK了...
但是, 爬了几十章之后就断了, 再看看文档结构, 可以发现里面的图片url之前的域名居然换了!!!
检查下js会发现里面有这么个玩意
再修改下代码, 继续爬取, 可是过了几十章,又不行了, 在看看文档结构, 没什么问题啊, 可是仔细找的话会发现静态文件变了。
原来的photosr赋值没有了, 取而代之的时这么一串乱七八糟的字符串,而查查network,好像也没什么有用的ajax请求,好像不是通过
ajax动态请求图片的, 可以仔细看看这串字符串, 好像有的是以‘==’结尾的,base64解码以下, 可以获取下面这串字符串
好像是个js代码字符串啊, 把它复制到一个js文件里运行以下(需要node.js), 结果发现它报错了,说是有啥变量没有定义,很好理
解, 复制过来的代码嘛, photosr没有预定义,a这个数组也没有预定义, 那我加进去定义下呗? 结果又提示p未定义, 但是有个惊
喜是里面的return p之前是可以打印出p的, 就是我们要的图片数组...
仔细看看这串JS代码, 可以发现, 他是把需要解析的url放在了一串字符串中, 然后利用js动态从里面提取出来, 前面的a[x] =
'a/b/c/d/e.f'就是提取规则, 后面以|分隔的就是要提取的字符串, 但是a的下标里面还有p和n这个代表什么呢?研究下js方法里面的实
现就会发现, 上面传的参数里面有两个数字, 28, 28, 就是说这个解析规则是按照28进制来设置下标的(其实如果扒完了会发现
最大到了62进制), 而python最大支持的int(‘x’, base=''),只到36进制, 这就需要我们自己去写相关的python实现了, 也就是我们
需要利用python去实现这段代码解析的过程, 然后动态解析出url数组,之后再利用最开始的url拼接规则就ok啦。
其实对应最后一步, 如果不是进制原因的话, 是可以利用execjs包来在python中执行js代码的, 这样的话就可以直接获取里面的js返
回值, 但是因为进制的坑, 所以这里用到了js转python代码。
相关代码实现如下:
import os
import re
import sys
from time import sleep
import base64
from threading import Thread
import queueimport requests
from lxml import etreeq = queue.Queue(maxsize=5)sourceurl = "http://www.chuixue.net"
baseurl = "http://www.chuixue.net/manhua/12533/"
headers = {'User-Agent': 'Mozilla/5.0'
}def getImg(url, chapter, surl, num):try:headers['HOST'] = surl.split('/')[2]data = requests.get(url, headers=headers)if not os.path.exists(chapter):os.mkdir(chapter)with open(chapter + '/' + str(num) + '.' + url.split('.')[-1], 'wb') as f:f.write(data.content)except Exception as e:print('图片下载错误:', url, chapter, surl)def getIndex(u):if ord('0') <= ord(u) <= ord('9'):index = int(u)elif ord('a') <= ord(u) <= ord('z'):index = ord(u) - ord('a') + 9 + 1else:index = ord(u) - ord('A') + 35 + 1return indexdef decodeBase(pack):bbytes = base64.decodebytes(pack.encode())params = re.findall('}\((.*?)\)\)', bbytes.decode(), re.S)[0].split(',')print(params)jz = int(params[1])print(jz)totalD = []rule = re.findall('\w\[\d\]="(\S+?)"', params[0], re.S)ti = 0for ru in rule:st = params[3].strip("'").split('.')[0].strip("'").split('|')rend = ru.split('/').pop(-1).split('.')r = ru.split('/')[:-1] + renddata = []for u in r:index = -1if len(u) == 1:index = getIndex(u)else:b = 0for i in range(len(u)):b += getIndex(u[i]) * (62 ** (len(u) - i - 1))index = bdata.append(st[index] if st[index] else u)f = data.pop(-1)data = '/'.join(data) + '.' + ftotalD.append((ti, data))ti += 1return totalDdef getPage(url):print(url)headers['HOST'] = 'www.chuixue.net'try:req = requests.get(url, headers=headers)req.encoding = 'gb18030'# print(req.text)html = etree.HTML(req.text)script = html.xpath('//script[1]/text()')[0]title = html.xpath('//h1[1]/text()')[0]data = re.findall(r'.*?photosr\[(\w+)\]\s="(\S+)".*?', script, flags=re.S)if not data:pack = re.findall(r'packed="(\S+?)"', script, flags=re.S)[0]data = decodeBase(pack)print(data)count = len(data)chapter = url.split('/')[-1].split('.')[0]surl = ""if int(chapter) > 519253:surl = 'http://2.csc1998.com/'else:surl = 'http://img.csc1998.com/'num = 0for i in data:imgurl = surl + i[1]print(imgurl, surl)getImg(imgurl, title, surl, num)num += 1sleep(0.5)except:sleep(2)getPage(url)print('下载错误,请稍等会...', url)req = requests.get(baseurl, headers=headers)
html = etree.HTML(req.text)
pageurl = html.xpath('//div[@class="plist pmedium max-h200"]/ul/li/a/@href')
p = input('请输入页码:')
if not p.isdigit():sys.exit(-1)
p = int(p)
pageurl = pageurl[:-p]def pushURL():while pageurl:page = pageurl.pop()url = sourceurl + pageq.put(url)def getURL():while True:sleep(1)if not q.empty():url = q.get()getPage(url)tlist = []
for i in range(3):thread = Thread(target=pushURL)tlist.append(thread)thread.start()for i in range(3):thread = Thread(target=getURL)tlist.append(thread)thread.start()for i in range(len(tlist)):tlist[i].join()
JS逆向:狐妖小红娘漫画扒取相关推荐
- 狐妖小红娘——漫画中的tfboys
本文参考自: 原文地址 如果我们能活着出去的话,万水千山,你愿意陪我一起看吗? 忍不住要吐槽.好多人都说精华在后面,可是我完整地把王权富贵篇和月红篇看完了,不明白泪点在哪里.个人感觉王权富贵篇感情的高 ...
- 【资源集合/国产】狐妖小红娘动画+漫画[带P站精选红红图]
_(:з」∠)_都是每话保存的,第一次这样保存一部漫画,真花费数个小时才完成,需要的就下载 =-=-=-=-=-=-==-==-=-=-=-=-=-==-==-=-=-=-=-=-==-==-=-=- ...
- selenium抓取卡推漫画--狐妖小红娘
1.流程框架 1.1.抓取漫画每一话的链接 利用selenium驱动浏览器通过css selector搜索得到漫画每一话的链接 1.2.抓取某一话漫画的名称以及每个图片的链接 利用selenium驱动 ...
- 1万条数据大概占多大空间_10月漫画数据月报丨多平台收藏数,评论数较上月稳定提升,狐妖小红娘播放量再创新高...
作者 | 栗子 编辑 | 潘漫熳 视觉 | BBQ 一. 各漫画平台总体趋势 1.快看漫画 2019年10月快看漫画平台评论数相比前月呈现出下降趋势,为269.9万条:收藏数方面,10月快看漫画平台收 ...
- 狐妖小红娘手游服务器维护,狐妖小红娘手游官网-腾讯游戏
各位红线仙大家好,我是苏苏.你们平时如何与自己的恋人联系呢?容容姐说,很久以前,涂山没有没有电话和网络,情人若相隔两地,想要互诉衷肠,必须依靠最古老的方式---书信. 如今,咱们<狐妖小红娘&g ...
- 用计算机弹奏若当来世,狐妖小红娘的主题曲求若当来世完整版。
满意答案 雪eroo0 推荐于 2017.11.25 采纳率:52% 等级:10 已帮助:616人 [若当来世 ] <狐妖小红娘>第三季 演唱:冥月&Mario Mario: ...
- 狐妖小红娘手游如何用电脑玩 狐妖小红娘手游PC电脑版教程
<狐妖小红娘>手游是根据同名人气动漫改编而成的,游戏高度还原了动漫中的剧情,人物也是制作的更加精致,瞬间让我们融入动漫中去.全新的日系风格设计,各种萌妹子登场,讲诉一段离奇的人妖恋!下面小 ...
- 狐妖小红娘手游服务器维护多久,狐妖小红娘手游为什么进不去 无法登录解决方法...
狐妖小红娘手游目前正在内测还没正式上线,有些有内测资格的小伙伴们可能会碰到无法进入的问题,那么这是什么原因呢?下面就让我们来看看狐妖小红娘手游进不去的一些原因吧. 网络问题 首先第一个肯定是网络问题, ...
- 狐妖小红娘手游服务器维护,狐妖小红娘手游日常任务速刷攻略
狐妖小红娘手游日常任务怎么速刷?狐妖小红娘手游必做日常任务有哪些?来看看9k9k小编带来的狐妖小红娘手游日常任务速刷攻略 日常分为20次除虫,10次一起气,20次委托,10次答题,10次比武. 除虫和 ...
最新文章
- 基于RT-Thread开发智能视觉组智能车 - 温州大学 - 春华秋实
- c语言5的阶乘流程图_2020年,5种将死的编程语言!
- CAM350 10.7 中文界面
- html鼠标悬停盒子凸起,css3 transform动画鼠标悬停div容器凸起放大显示
- 10款中小企业必备的开源免费安全工具
- 电容降压LED驱动电路
- 平衡二叉查找树的构造与遍历(C++)
- 《深度学习笔记》——训练加速篇
- rehat 出现GDB debuginfo-install 问题处理
- 监控流媒体服务器的搭建和使用
- 计算机工程师难度排名,【2018一级造价工程师考试各个科目的难度排行榜】- 环球网校...
- 任凭弱水三千,我只取一瓢饮
- Gold Nanoparticles ,Au Coated Fe3O4 MagneticNanoparticles金磁微粒的介绍
- android studio按键精灵,按键精灵要点讲解一 - godlike的个人页面 - OSCHINA - 中文开源技术交流社区...
- java winrar_Java使用winrar解压缩 | 学步园
- 硅谷钢铁侠--Elon Musk
- 三角形 css_CSS三角形
- 山东大学人工智能专业认知科学与类脑计算回忆版
- 迎接第五次工业革命浪潮,不当纳米知识文盲
- js电影票预订座位网页js特效