首页 > 编程语言 > 详细

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

时间:2020-04-30 21:33:08      阅读:54      评论:0      收藏:0      [点我收藏+]

??好久没有写过爬虫的文章了,今天在尝试着做验证码相关的研究时,遇到了验证码的收集问题。
??一般,验证码的加载都有着比较复杂的算法和加密在里边,但是笔者今天碰到的验证码却比较幸运,有迹可循。在此,给出本爬虫的相关记录。
??注意,文章和代码中均不会给出相关的真实网站的信息,避免不道德的行为。
??首先,让我们来看一看该验证码的页面,如下:
技术分享图片
如果我们尝试着查看该验证码加载时的源代码,会发现源码如下:
技术分享图片
我们可以发现,该验证码的加载机制其实并不复杂,只是在网址后面跟了一个时间戳,而这个时间戳,是由JavaScript中的方法产生的,函数内容为new Date().getTime()
??知道了验证码背后加载的原理,那么我们不难通过Python来实现验证码的下载。
??可惜的是,上述JS函数产生的时间戳是13位数字,而Python的time.time()方法产生的时间戳为浮点数,小数点前10位,小数点后6位。那么,我们如果来产生符合上述JS函数产生的时间戳呢?
??一个简单的想法是,我们让Python来调用JS。真的可以吗?幸运的是,前人已经提我们做好了这个工作,有个神奇的Python第三方模块,叫做PyExecJS。顾名思义,这个模块就是用来执行JS代码的。
??该模块的源码中给出了一个例子,我们可以尝试下,代码如下:

# -*- coding: utf-8 -*-

import execjs

print(execjs.eval("‘red yellow blue‘.split(‘ ‘)"))

ctx = execjs.compile("""
         function add(x, y) {
             return x + y;
         }
        """)

print(ctx.call("add", 1, 2))

输出结果如下:

[‘red‘, ‘yellow‘, ‘blue‘]
3

??OK,有了上面的例子,我们就知道如何使用该模块了,我们可以轻松地写出下面的代码来下载验证码了:

# -*- coding: utf-8 -*-

import execjs
import urllib.request

js_func = """
             function get_milliseconds(){
                 return new Date().getTime();
             }
          """

ctx = execjs.compile(js_func)
result = ctx.call("get_milliseconds")
print(len(str(result)))

# 注意,网址已经隐藏
url = "http://***/captcha/?%s" % result

urllib.request.urlretrieve(url, "1.png")

下载的验证码如下:
技术分享图片
??通过我们这次的尝试,发现如下:

  • PyExecJS支持Python对JavaScript的操作,所以下次有机会,可以在Python中执行JS函数;
  • 验证码的加载算法不宜简单,要注意加密。

??本次分享到此结束,感谢大家的阅读~

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

原文:https://www.cnblogs.com/jclian91/p/12811184.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!