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逆向:狐妖小红娘漫画扒取相关推荐

  1. 狐妖小红娘——漫画中的tfboys

    本文参考自: 原文地址 如果我们能活着出去的话,万水千山,你愿意陪我一起看吗? 忍不住要吐槽.好多人都说精华在后面,可是我完整地把王权富贵篇和月红篇看完了,不明白泪点在哪里.个人感觉王权富贵篇感情的高 ...

  2. 【资源集合/国产】狐妖小红娘动画+漫画[带P站精选红红图]

    _(:з」∠)_都是每话保存的,第一次这样保存一部漫画,真花费数个小时才完成,需要的就下载 =-=-=-=-=-=-==-==-=-=-=-=-=-==-==-=-=-=-=-=-==-==-=-=- ...

  3. selenium抓取卡推漫画--狐妖小红娘

    1.流程框架 1.1.抓取漫画每一话的链接 利用selenium驱动浏览器通过css selector搜索得到漫画每一话的链接 1.2.抓取某一话漫画的名称以及每个图片的链接 利用selenium驱动 ...

  4. 1万条数据大概占多大空间_10月漫画数据月报丨多平台收藏数,评论数较上月稳定提升,狐妖小红娘播放量再创新高...

    作者 | 栗子 编辑 | 潘漫熳 视觉 | BBQ 一. 各漫画平台总体趋势 1.快看漫画 2019年10月快看漫画平台评论数相比前月呈现出下降趋势,为269.9万条:收藏数方面,10月快看漫画平台收 ...

  5. 狐妖小红娘手游服务器维护,狐妖小红娘手游官网-腾讯游戏

    各位红线仙大家好,我是苏苏.你们平时如何与自己的恋人联系呢?容容姐说,很久以前,涂山没有没有电话和网络,情人若相隔两地,想要互诉衷肠,必须依靠最古老的方式---书信. 如今,咱们<狐妖小红娘&g ...

  6. 用计算机弹奏若当来世,狐妖小红娘的主题曲求若当来世完整版。

    满意答案 雪eroo0 推荐于 2017.11.25 采纳率:52%    等级:10 已帮助:616人 [若当来世 ] <狐妖小红娘>第三季 演唱:冥月&Mario Mario: ...

  7. 狐妖小红娘手游如何用电脑玩 狐妖小红娘手游PC电脑版教程

    <狐妖小红娘>手游是根据同名人气动漫改编而成的,游戏高度还原了动漫中的剧情,人物也是制作的更加精致,瞬间让我们融入动漫中去.全新的日系风格设计,各种萌妹子登场,讲诉一段离奇的人妖恋!下面小 ...

  8. 狐妖小红娘手游服务器维护多久,狐妖小红娘手游为什么进不去 无法登录解决方法...

    狐妖小红娘手游目前正在内测还没正式上线,有些有内测资格的小伙伴们可能会碰到无法进入的问题,那么这是什么原因呢?下面就让我们来看看狐妖小红娘手游进不去的一些原因吧. 网络问题 首先第一个肯定是网络问题, ...

  9. 狐妖小红娘手游服务器维护,狐妖小红娘手游日常任务速刷攻略

    狐妖小红娘手游日常任务怎么速刷?狐妖小红娘手游必做日常任务有哪些?来看看9k9k小编带来的狐妖小红娘手游日常任务速刷攻略 日常分为20次除虫,10次一起气,20次委托,10次答题,10次比武. 除虫和 ...

最新文章

  1. 基于RT-Thread开发智能视觉组智能车 - 温州大学 - 春华秋实
  2. c语言5的阶乘流程图_2020年,5种将死的编程语言!
  3. CAM350 10.7 中文界面
  4. html鼠标悬停盒子凸起,css3 transform动画鼠标悬停div容器凸起放大显示
  5. 10款中小企业必备的开源免费安全工具
  6. 电容降压LED驱动电路
  7. 平衡二叉查找树的构造与遍历(C++)
  8. 《深度学习笔记》——训练加速篇
  9. rehat 出现GDB debuginfo-install 问题处理
  10. 监控流媒体服务器的搭建和使用
  11. 计算机工程师难度排名,【2018一级造价工程师考试各个科目的难度排行榜】- 环球网校...
  12. 任凭弱水三千,我只取一瓢饮
  13. Gold Nanoparticles ,Au Coated Fe3O4 MagneticNanoparticles金磁微粒的介绍
  14. android studio按键精灵,按键精灵要点讲解一 - godlike的个人页面 - OSCHINA - 中文开源技术交流社区...
  15. java winrar_Java使用winrar解压缩 | 学步园
  16. 硅谷钢铁侠--Elon Musk
  17. 三角形 css_CSS三角形
  18. 山东大学人工智能专业认知科学与类脑计算回忆版
  19. 迎接第五次工业革命浪潮,不当纳米知识文盲
  20. js电影票预订座位网页js特效

热门文章

  1. rk3568 修改开机logo
  2. L1-051 打折 (5分)(C语言)
  3. 服务器程序运行的相关操作
  4. 计算机音乐欢乐颂谱子,小学人音版六年级音乐下册简谱欢乐颂(10页)-原创力文档...
  5. 华钜同创:各大卖家提前备货万圣节,再不准备就晚啦!
  6. 告诉你1年读100本书的方法
  7. 2021年茶艺师(初级)考试题及茶艺师(初级)模拟考试
  8. DE、SaDE、JADE、SHADE、L-SHADE算法整理
  9. 免费的mathematica
  10. linux nas解决方案_畅快玩转NAS 篇一:Linux权限简单讲解