当前位置: 首页 > 后端技术 > Python

Python爬虫记录一次尝试下载验证码

时间:2023-03-25 22:35:17 Python

很久没有写爬虫文章了。今天在尝试做验证码相关的研究时,遇到了收集验证码的问题。一般验证码的加载都有比较复杂的算法和加密在里面,不过今天遇到的验证码比较幸运,有迹可循。这里给出本次爬虫的相关记录。请注意,文章和代码都不会提供有关真实网站的信息,以避免不道德的行为。首先我们看一下验证码的页面,如下:如果我们尝试查看验证码加载时的源码,会发现源码如下:我们可以发现验证码的加载机制其实并不复杂。只是URL后面跟着一个时间戳,而这个时间戳是JavaScript中的一个方法生成的,函数内容是newDate().getTime()。知道了验证码背后加载的原理,我们通过Python下载验证码就不难了。遗憾的是,上述JS函数生成的时间戳是13位数字,而Python的time.time()方法生成的时间戳是小数点前10位,小数点后6位的浮点数。那么,我们如何生成一个符合上述JS函数的时间戳呢?一个简单的想法就是我们让Python调用JS!真的可能吗?幸运的是,我们的前辈已经为我们完成了这项工作。Python有一个神奇的第三方模块,叫做PyExecJS。顾名思义,这个模块就是用来执行JS代码的。该模块源码中给出了一个例子,大家可以试试看,代码如下:#-*-coding:utf-8-*-importexecjsprint(execjs.eval("'红黄蓝'.split('')"))ctx=execjs.compile("""functionadd(x,y){returnx+y;}""")print(ctx.call("add",1,2))的输出如下:['red','yellow','blue']3OK,通过上面的例子,我们知道了这个模块的使用方法,我们可以很方便的写出如下代码来下载验证码:#-*-编码:utf-8-*-importexecjsimporturllib.requestjs_func="""functionget_milliseconds(){returnnewDate().getTime();}"""ctx=execjs.compile(js_func)result=ctx.call("get_milliseconds")print(len(str(result)))#注意已经隐藏了urlurl="http://***/captcha/?%s"%resulturllib.request.urlretrieve(url,"1.png")下载的验证码如下:通过我们这次的尝试,发现:PyExecJS支持Python对JavaScript的运行,下次有机会,你可以在Python中执行JS函数;验证码的加载算法不要简单,注意加密。本次分享到此结束,感谢阅读~