起源:

问题源于解析kissanime.io这个网站。
为反扒抑或是防止ddos攻击,此视频页面,初进去会有个5秒延迟并提交一表单验证。而其表单验证,为下面一段html代码:

  <form id="challenge-form" action="/cdn-cgi/l/chk_jschl" method="get">
<input type="hidden" name="jschl_vc" value="d5f32a77955a830758982219a37f1124"/>
<input type="hidden" name="pass" value="1500949414.776-fpKIjtEKZR"/>
<input type="hidden" id="jschl-answer" name="jschl_answer"/>
</form>

求jschl-answer值 ,用了一段js代码,此段js代码为随机生成,如下:

    var s,t,o,p,b,r,e,a,k,i,n,g,f, nyqPwxi={"KxtkYgr":+((!+[]+!![]+!![]+[])+(+!![]))};
t = document.createElement('div');
t.innerHTML="<a href='/'>x</a>";
t = t.firstChild.href;r = t.match(/https?:\/\//)[0];
t = t.substr(r.length); t = t.substr(0,t.length-1);
a = document.getElementById('jschl-answer');
f = document.getElementById('challenge-form');
;nyqPwxi.KxtkYgr*=+((!+[]+!![]+[])+(!+[]+!![]+!![]));nyqPwxi.KxtkYgr+=+((!+[]+!![]+!![]+[])+(!+[]+!![]+!![]+!![]+!![]+!![]+!![]+!![]));nyqPwxi.KxtkYgr+=+((!+[]+!![]+!![]+[])+(+!![]));nyqPwxi.KxtkYgr*=+((+!![]+[])+(!+[]+!![]+!![]+!![]+!![]+!![]));nyqPwxi.KxtkYgr+=!+[]+!![]+!![];nyqPwxi.KxtkYgr+=+((!+[]+!![]+!![]+[])+(+!![]));a.value = parseInt(nyqPwxi.KxtkYgr, 10) + t.length; '; 121'
f.submit();

没有格式化,比较凌乱。
由其可见,jschl-answer值域,是通过一系列公式运算所得。运行js得到其值,就可以模拟表单提交,通过验证

1、获取需要的js代码段

不外乎用到re这个东西。参照一个开源项目,通过以下python代码,实现js代码提取:

    try:
js = re.search(r"setTimeout\(function\(\){\s+(var "
"s,t,o,p,b,r,e,a,k,i,n,g,f.+?\r?\n[\s\S]+?a\.value =.+?)\r?\n", body).group(1)
except Exception:
raise ValueError("Unable to identify Cloudflare IUAM Javascript on website.") js = re.sub(r"a\.value = (parseInt\(.+?\)).+", r"\1", js)
js = re.sub(r"\s{3,}[a-z](?: = |\.).+", "", js)
js = re.sub(r"[\n\\']", "", js)
if "parseInt" not in js:
raise ValueError("Error parsing Cloudflare IUAM Javascript challenge.") js = js.replace('parseInt', ';return parseInt')
js = 'function answer(){%s}' % js

中间这一段:

js = re.sub(r"a\.value = (parseInt\(.+?\)).+", r"\1", js)

被蒙到了!对re.sub运用尚未纯熟,此写法,一开始忽住了我,随搜集其做研究学习,倒也有些收获。

2、re.sub(pattern, repl, string, count=0, flags=0)

这是它的原型,网上对此式解说文章,多不胜数。对第二个参数,repl,上述用法,述者寥寥。
但其功能,是以第一个参数,pattern中第一个组中值,替换pattern所匹配的字串,其格式为\number,编号从1开始第应第1组,以此类推,功能与\g<number>相同,为简洁写法。

比如:

s = '2017-01-22'
s = re.sub('(\d{4})-(\d{2})-(\d{2})', r'\2-\3-\1', s)
print s # 01-22-2017

r'\g<0>'能匹配pattern所适配的字串,而r'\0'却不能,这是测试中发现其不同处。

若在patter中有\number写法,则是要匹配其中分组,如下写法:

inputStr = "hello crifan, nihao crifan";
replacedStr = re.sub(r"hello (\w+), nihao \1", "crifanli", inputStr);
print "replacedStr=", replacedStr; #crifanli

它匹配了inuptStr整个字串,此字串,被crifanli完整替换之。

3、其它写法

repl除了字串外,它还可以是函数,以对匹配到的组,做其它操作。

照搬一个例子:

def replace_digit(m):
ss = u'〇一二三四五六七八九'
index = int(m.group())
return ss[index] s = u'1990年3月27日'
result = re.sub(u'\d', replace_digit, s, count=4) print result # 一九九〇年3月27日

参考资料:

http://www.jianshu.com/p/731efbd6029b

https://docs.python.org/2/library/re.html#re.sub

Python: re.sub()第二个参数的更多相关文章

  1. Python进阶【第二篇】多线程、消息队列queue

    1.Python多线程.多进程 目的提高并发 1.一个应用程序,可以有多进程和多线程 2.默认:单进程,单线程 3.单进程,多线程 IO操作,不占用CPU python的多线程:IO操作,多线程提供并 ...

  2. Python开发【第二篇】:初识Python

    Python开发[第二篇]:初识Python   Python简介 Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏 ...

  3. Python开发【第二章】:Python模块和运算符

    一.模块初识: Python有大量的模块,从而使得开发Python程序非常简洁.类库有包括三中: Python内部提供的模块 业内开源的模块 程序员自己开发的模块 1.Python内部提供一个 sys ...

  4. Python开发【第二十二篇】:Web框架之Django【进阶】

    Python开发[第二十二篇]:Web框架之Django[进阶]   猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 ...

  5. Python开发【第二十一篇】:Web框架之Django【基础】

    Python开发[第二十一篇]:Web框架之Django[基础]   猛击这里:http://www.cnblogs.com/wupeiqi/articles/5237704.html Python之 ...

  6. Python开发【第二十篇】:缓存

    Python开发[第二十篇]:缓存redis&Memcache   点击这里 Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy ...

  7. python核心编程第二版笔记

    python核心编程第二版笔记由网友提供:open168 python核心编程--笔记(很详细,建议收藏) 解释器options:1.1 –d   提供调试输出1.2 –O   生成优化的字节码(生成 ...

  8. 深度学习原理与框架-Alexnet(迁移学习代码) 1.sys.argv[1:](控制台输入的参数获取第二个参数开始) 2.tf.split(对数据进行切分操作) 3.tf.concat(对数据进行合并操作) 4.tf.variable_scope(指定w的使用范围) 5.tf.get_variable(构造和获得参数) 6.np.load(加载.npy文件)

    1. sys.argv[1:]  # 在控制台进行参数的输入时,只使用第二个参数以后的数据 参数说明:控制台的输入:python test.py what, 使用sys.argv[1:],那么将获得w ...

  9. Python之路(第二十五篇) 面向对象初级:反射、内置方法

    [TOC] 一.反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它 ...

随机推荐

  1. JSONArray 遍历

    JSONArray 遍历   刚遇到一个接接口任务,发现其中返回数据中,是个字符串数组,数组中就是单个json形式的内容,其实应该也可以称这种数据叫做json数组吧,只不过是字符串形式.而我需要的是将 ...

  2. VB-创建类模块DLL文件

    最近需要调用MSCOMM32.OCX控件,但是ABAP调用过程中发现无法同时发送多条记录,则需调整实现方式: a.创建DLL文件封装MSCOMM控件相关属性及方法 b.系统注册DLL文件 c.ABAP ...

  3. es6初级之解构----之一

    1. 访问对象属性 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  4. 7.final关键字.md

    1.final类型变量 定义:被final修饰的变量,一旦被赋初值后,则final类型变量的值就不能再改变. 1.1成员变量 final修饰的成员变量必须显式的赋初值. 赋值的位置: •类变量:静态初 ...

  5. 在Centos 6.5 X64下切割m3u8

    操作系统:centos 6.5 必需要参考的文章: http://blog.chinaunix.net/uid-23069658-id-4018842.html 准备工作: 安装git yum ins ...

  6. eclipse 访问GitHub 问题

  7. PageRank算法和谷歌搜索讲解

    PageRank算法和谷歌搜索讲解 吴裕雄 PageRank算法实际上就是Google使用它来计算每个网页价值的算法. Google每次的搜索结果都有成百上千万甚至上亿个相关的查询网页链接.如果将所有 ...

  8. Matlab练习——rpy2tr函数与自己实现的ZYX欧拉角的结果不同的问题

    问题背景:在根据<机器人导论>这本书的Z-Y-X欧拉角原理用Matlab实现旋转矩阵求解时,发现与直接调用机器人工具箱中的rpy2tr()函数得出的结果并不相同. 首先:先检查自己写的函数 ...

  9. java-学习6

    public class arryTest4 { //对整型数组按照由小到大的顺序进行排序 public static void main(String[] args) { int score[]= ...

  10. ubuntu下安装nodejs和npm

    第一种安装方法: 安装nodejs : 1 sudo apt-get install nodejs 运行 nodejs -v 会弹出安装node的版本号 这里使用的是 nodejs 并不是常用的nod ...