黑板客爬虫闯关

来源:互联网 发布:淘宝网店必备软件 编辑:程序博客网 时间:2024/04/29 18:33

这个爬虫闯关挺适合入门的,主要是爬取静态网页以及模拟登陆。
一共有5关,重点讲第4关和第5关。
1-3关

  • 第1关是每个页面都带有一串数字,然后要把这串数字替换到url上再访问,从而进入下一个地址获取下一串数字,直至过关。对于了解html的人来说不难,使用beautifulsoup+lxml解析获取到的html即可。

  • 第2关是猜密码,密码是0-30内的一个数字,这里就用到post方法了
    先手动在网页上提交一次,然后打开开发者工具查看提交的表单都有什么内容(我使用的是chrome),然后在post方法中加入这些内容即可。

  • 第3关同样是猜密码,但是多了一个cookies验证方式,同样使用开发者工具查看,会发现多了一个csrfmiddlewaretoken,这个在请求网页的时候获得,用以检验是否是接收到网页的本机在操作,因此只需要在post的data中加入这个cookie即可

第4关
长密码获取,进入第4关之前登陆步骤与第3关类似,然后随便输入一个密码登陆后显示密码错误,但是给了一个可以获取密码的地址,这个地址里面有13页,每一页有8行(最后一页4行),每一行显示密码的index与密码在该index对应的数字,一共有100位数字。那思路就很简单,进入每一页然后爬取index与数字信息保存到两个list,然后用一个长101的数组按照对应index去储存这些数字,最后把数组拼接成密码。
运行完后会发现两个问题:

  1. 网页加载很慢,完成13页的爬取操作要好几分钟。
  2. 爬取完13页之后会发现密码不够100位

问题1先不管,问题2的原因是每一页的index是随机的,因此爬完13页也不一定能找到所有位置的密码,那就要循环爬取直到爬出100个位置。如果网页加载很快的话,这样做也没有问题,但是现在网页很慢,如果还是一个网页一个网页爬的话效率就十分低下。

我们应该把等待的时间都放到一起,同时爬多个网页。这里就用到多线程了(import threading)。

 thread = threading.Thread(target = retrivePw, args=(num,)) thread.start()

用多个线程去爬取密码,速度能缩短到几分钟,运气好的话。

第5关
第5关再加了一层验证,验证码输入,这个比较麻烦,需要提取验证码图片然后进行图像识别。
验证码验证我选择使用Google的Tesseract-Ocr,虽然识别率很低(也许是验证码中的字符比较歪),但勉强能使用,在python中使用有3个步骤,

  1. 安装tesseract-ocr,在GitHub上可以找到下载地址
  2. python中安装pytesseract包
  3. python中安装PIL/pillow

python中安装使用pip即可

环境配置好后,就可以进行验证码识别了

  1. 先获取验证码地址
  2. 然后使用get方法获得验证码图片
  3. 使用pytesseract的image_to_string方法识别验证码
  4. 对识别出来的字符进行正则表达式匹配,是否满足'^[A-Z | a-z]{4}$'是的话才可以算作识别成功

值得注意的是,在开发者工具中查看post数据可以发现,除了验证码,还有一个隐藏的加密字符串captcha_0要post,,这个字符串可以在登陆页面获取

captcha_0_value = soup.find('input', id="id_captcha_0").get('value')

其中soup是beautifulsoup的一个实例
最后剩下密码要输入,类似第2关和第3关,从0开始猜密码。
整理后的postdata类似于:

    guess_data = {        'username' : 'medyg',        'password' : pw,        'csrfmiddlewaretoken' : cookie2['csrftoken'],        'captcha_0' : captcha_0_value,        'captcha_1' : captcha_1    }

post之后要注意要先检验验证码是否正确,可以根据post之后返回的页面中是否有“验证码输入错误”来判断,验证码不正确的话密码不用变,验证码正确了然后才是判断密码是否正确。

加入了正确率的计算,发现这个验证码识别只有18%左右的命中率……不知道增加一些训练样本后会不会变好。

以上是我的黑板客爬虫闯关心得,点击这里可以查看我的代码