「爬虫技术」识别简单计算题验证码的实现

IT知识
649
0
0
2022-06-28
标签   网络爬虫

先对各位关注易本地工作室的同学们说声抱歉,这么久没发文了,因为最进在忙于开发手机APP,话说现在一个公司没有个APP在运营,出去都不好意思说是搞互联网的公司。(手动滑稽)

言归正传,今天依然教大家去识别验证码。请看下图:

「爬虫技术」识别简单计算题验证码的实现

公式验证码

今天一个小项目遇到这样的验证码,我们可以利用之前教大家的Tesseract识别验证码的方式来处理这样的验证码。因为字体还算比较规整,所以出来起来不算难。这里我们以C#为例,分析此类验证码的识别方式。

首先我们需要对图片进行二值化处理。这里提供给大家自己写的一个算法来处理这类图片。

/// <summary>
/// 对图片进行二值化处理
/// </summary>
/// <param name="oldbitmap">原图</param>
/// <param name="rr">红色阀值</param>
/// <param name="gg">绿色阀值</param>
/// <param name="bb">蓝色阀值</param>
/// <returns>处理后的图片</returns>
public static Bitmap GetImgInColor(Bitmap oldbitmap, int rr, int gg, int bb)
{
    if (oldbitmap == null)
    {
        return null;
    }
    int Height = oldbitmap.Height;
    int Width = oldbitmap.Width;
    Bitmap newbitmap = new Bitmap(Width-10, Height);
    Color pixel;
    for (int y = 0; y < Height; y++)
    {
        for (int x =0; x < Width-10; x++)
        {
            int r, g, b;
            pixel = oldbitmap.GetPixel(x+5, y);
            r = pixel.R;
            g = pixel.G;
            b = pixel.B;
            if (r >= rr && g >= gg && b >= bb)
            {
                newbitmap.SetPixel(x, y, Color.FromArgb(255, 255, 255));
            }
            else
            {
                newbitmap.SetPixel(x, y, Color.FromArgb(0, 0, 0));
            }
        }
    }
    return newbitmap;
}

对于此次的图片,我们的参数设置为90,10,40为最佳(这个值大家可以用这个算法写个公式,改变不同的输入值查看输出效果。能获取到完整的黑白字符为准)。

处理后的效果如下图:

「爬虫技术」识别简单计算题验证码的实现

这样我们直接用Tesseract进行识别。这里要注意对Tesseract进行初始化的时候,设置白名单字符为“0123456789+-*/=?”就可以了,因为这些公式中只可能有这些字符。这样可以提高识别率。

Tesseract.TesseractEngine te = new TesseractEngine(Application.StartupPath + "\\tessdata", "eng", EngineMode.Default);
te.SetVariable("tessedit_char_whitelist", "0123456789+-*/=?");
te.DefaultPageSegMode = PageSegMode.SingleLine;

进行识别操作:

Page PG = te.Process(PixConverter.ToPix(bChapcha), PageSegMode.SingleLine);//bChapcha为处理后的图片。
string sVailCode = KeyReplace(PG.GetText());
PG.Dispose();

得到识别结果:1+7=?这时候我们只需要通过程序计算这个公式的结果就可以了。我们首先用正则表达式(.+?)=获取该题的计算部分,也就是等号前面的部分,后面的不管啦,如果没有识别出等于号。基本上就是这个图片识别失败,正则获取结果为空,这样的结果我们直接重新下载再处理就可以了。

获取公式部分后我们可以直接用算法计算出结果:

try
{
    DataTable table = new DataTable();
    sVailCode = table.Compute(sVailCode, "").ToString();
}
catch
{
    sVailCode = "";
}

这里利用的DataTable自带的算式计算功能,简单方便。得到的结果为8,提交给服务器,验证码通过。这种验证码就形同虚设了。

「爬虫技术」识别简单计算题验证码的实现

部分关键代码

好了,今天就教大家这些,如果觉得文章不错,还请收藏分享,因为您的支持这是小编活着的动力来源。