黑板客爬虫闯关5

youncyb 发布于 2017-08-11 1530 次阅读 Python


1.这一关是真的皮,首先加了个验证码,所以首想到 python的pytesseract这个模块,不过这个模块的识别率有点低,连斜倒的英文字母都无法  识别,正确率低的可怜,本想到做一些图形预处理,再切割字符,由于只有英文字母,只需储存所有的验证码字母,再进行相似度对比,但是工程量好大,还是算了,识别率低就低吧,只要输入验证码不对,反复识别直到输入正确验证码为止,这样就可判断密码是否正确。

2.这个密码是搞哪样啊,最大长度20位,又没提示不试到死?查了下别人的博客,发现还是遵从0-30的数字?试了下,所有密码都不对,没辙了,哪位仁兄知道后通知我我一下。

还是上一下代码,供大家参考下。

#! /user/bin/env python
# -*- coding:utf-8 -*-
import pytesseract
from PIL import Image
import requests
from lxml import etree
import time
def getCode(session,req):#存储验证码,并返回cookie值
    tree=etree.HTML(req).xpath('//img/@src')
    captcha_0=etree.HTML(req).xpath('//input/@value')[1]
    token=etree.HTML(req).xpath('//input/@value')[0]
    url="http://www.heibanke.com"
    for i in tree:
        url+=i
    req=session.get(url,timeout=5).content
    with open(r'D:/code.png','wb') as f:
        f.write(req)
    return (captcha_0,token)
def try_pwd(session,url1,url2,i):
        req=session.get(url2,timeout=5)
        cookies=requests.utils.dict_from_cookiejar(session.cookies)
        data1={'username':'youncyb','password':'heibanke163com','csrfmiddlewaretoken':cookies['csrftoken']}
        req=session.post(url2,data=data1).text
        (captcha_0,token)=getCode(session,req)
        im=Image.open(r'D:/code.png')
        code_string=pytesseract.image_to_string(im)
        data={'username':'adc','password':i,'csrfmiddlewaretoken':token,'captcha_0':captcha_0,'captcha_1':code_string}
        print (data)
        ret=session.post(url1,data=data).text
        content=etree.HTML(ret).xpath('//h3/text()')
        return (content,i)
def main():
    url1="http://www.heibanke.com/lesson/crawler_ex04/"
    url2="http://www.heibanke.com/accounts/login/?next=/lesson/crawler_ex04/"
    session=requests.Session()
    a="您输入的密码错误, 请重新输入"
    b="验证码输入错误"
    for i in range(30):
        (content,m)=try_pwd(session,url1,url2,i)
        print(content)
        if b in content:#只要验证码输入不对,就重复实验此密码
            while True:
                content=try_pwd(session,url1,url2,m)
                print(content)
                if b not in content[0]:
                    break
if __name__ == '__main__':
    main()