Python爬虫基础:验证码的爬取和识别详解

今天要给大家介绍的是验证码的爬取和识别,不过只涉及到最简单的图形验证码,也是现在比较常见的一种类型 。
运行平台:windows
Python版本:Python3.6
IDE: Sublime Text
其他:Chrome浏览器
简述流程:
步骤1:简单介绍验证码
步骤2:爬取少量验证码图片
步骤3:介绍百度文字识别OCR
步骤4:识别爬取的验证码
步骤5:简单图像处理
目前,很多网站会采取各种各样的措施来反爬虫,验证码就是其中一种,比如当检测到访问频率过高时会弹出验证码让你输入,确认访问网站的不是机器人 。但随着爬虫技术的发展,验证码的花样也越来越多,从最开始简单的几个数字或字母构成的图形验证码(也就是我们今天要涉及的)发展到需要点击倒立文字字母的、与文字相符合的图片的点触型验证码,需要滑动到合适位置的极验滑动验证码,以及计算题验证码等等,总之花样百出,让人头秃 。验证码其他的相关知识大家可以看下这个网站:captcha.org
再来简单说下图形验证码吧,就像这张:

Python爬虫基础:验证码的爬取和识别详解

文章插图
 
由字母和数字组成,再加上一些噪点,但为了防止被识别,简单的图形验证码现在也变得复杂,有的加了干扰线,有的加噪点,有的加上背景,字体扭曲、粘连、镂空、混用等等,甚至有时候人眼都难以识别,只能默默点击“看不清,再来一张” 。
验证码难度的提高随之带来的就是识别的成本也需要提高,在接下来的识别过程中,我会先直接使用百度文字识别OCR,来测试识别准确度,再确认是否选择转灰度、二值化以及去干扰等图像操作优化识别率 。
接下来我们就来爬取少量验证码图片存入文件 。
首先打开Chrome浏览器,访问刚刚介绍的网站,里面有一个captcha图像样本链接:https://captcha.com/captcha-examples.html?cst=corg,网页里有60张不同类型的图形验证码,足够我们用来识别试验了 。
Python爬虫基础:验证码的爬取和识别详解

文章插图
 
直接来看代码吧:
Python爬虫基础:验证码的爬取和识别详解

文章插图
 
import requestsimport osimport timefrom lxml import etreedef get_Page(url,headers): response = requests.get(url,headers=headers) if response.status_code == 200: # print(response.text) return response.text return Nonedef parse_Page(html,headers): html_lxml = etree.HTML(html) datas = html_lxml.xpath('.//div[@class="captcha_images_left"]|.//div[@class="captcha_images_right"]') item= {} # 创建保存验证码文件夹 file = 'D:/******' if os.path.exists(file): os.chdir(file) else:os.mkdir(file) os.chdir(file)for data in datas: # 验证码名称 name = data.xpath('.//h3') # print(len(name)) # 验证码链接 src = https://www.isolves.com/it/cxkf/yy/Python/2019-11-19/data.xpath('.//div/img/@src')# print(len(src)) count = 0 for i in range(len(name)): # 验证码图片文件名 filename = name[i].text + '.jpg' img_url = 'https://captcha.com/' + src[i] response = requests.get(img_url,headers=headers) if response.status_code == 200: image = response.content with open(filename,'wb') as f: f.write(image) count += 1 print('保存第{}张验证码成功'.format(count)) time.sleep(1)def main(): url = 'https://captcha.com/captcha-examples.html?cst=corg' headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'} html = get_Page(url,headers) parse_Page(html,headers)if __name__ == '__main__': main()仍然使用Xpath爬取,在右键检查图片时可以发现,网页分为两栏,如下图红框所示,根据class分为左右两栏,验证码分别位于两栏中 。
Python爬虫基础:验证码的爬取和识别详解

文章插图
 
datas = html_lxml.xpath('.//div[@class="captcha_images_left"]|.//div[@class="captcha_images_right"]')这里我使用了Xpath中的路径选择,在路径表达式中使用“|”表示选取若干路径,例如这里表示的就是选取class为"captcha_images_left"或者"captcha_images_right"的区块 。再来看下运行结果:
Python爬虫基础:验证码的爬取和识别详解

文章插图
 
由于每爬取一张验证码图片都强制等待了1秒,最后这个运行时间确实让人绝望,看样子还是需要多线程来加快速度的,关于多进程多线程我们下次再说,这里我们先来看下爬取到的验证码图片 。
Python爬虫基础:验证码的爬取和识别详解


推荐阅读