当前位置: 首页 > 科技观察

Python爬虫遇到验证码的几种处理方式,文章末尾有源码

时间:2023-03-11 23:07:04 科技观察

Python爬虫遇到的验证码有几种处理方式。源码在文末搁置了一段时间,确实有点退步了,真是大错特错。其实我也在想,大三的时候,是应该去考研,还是继续这样学习新技术,然后,或者,继续钻爬虫之道,虽然我不会知道这条路走得顺不顺,我也抓不住光。这期间晚上大概用了一个月左右的时间,终于粗略的过了Django。一次,剩下的就是针对官方文档和一些实际项目进行操作。我也打算开一个专栏,记录下我学习Django的一些心酸历程。学习还是这样。不学就会输,很莫名其妙,真的很奇怪,有人的奖学金是靠关系的,某个项目的获奖者只是临时改了个名字而已。..撇开这些没关系,本篇博客封装了两种比较优秀的图片验证码处理方式,分别是百度的aip和最近流行的识别muggle-ocr。这里我主要提一下百度aip,里面的东西真的很多,我还扩展了一个识别色情图片的功能,有兴趣的可以去玩玩,学了爬虫之后,这些图片真是应接不暇,还有网站太多了,希望净网运营多下功夫,其他的就不比较了,看实际操作吧。本文介绍了爬虫中验证码的处理方法,并将这些功能封装起来供我们使用。涉及到百度AIP的调用方法和最新开源库麻瓜识别库的使用。内容:学习调用百度的aip接口:扩展百度色情识别接口:学习muggle_ocr识别接口:封装源码:学习调用百度的aip接口:1、首先需要注册一个账号:https://login.bce.baidu.com/注册完成后登录2.创建项目在这些技术中找到文字识别,然后点击创建。项目创建完成后:后面会用到图中的AppID、APIkey、SecretKey。下一步可以查看官网文档,也可以直接使用我写的代码。3.安装依赖库pipinstallbaidu-aip这只是一个接口,需要一些前期设置。defreturn_ocr_by_baidu(self,test_image):"""ps:先在__init__函数中完成自己baidu_aip的一些参数设置,本次测试使用高精度版本测试,如果速度很慢,可以切换回普通versionself.client.basicGeneral(image,options)相关参考网址:https://cloud.baidu.com/doc/OCR/s/3k3h7yeqa:paramtest_image:待测文件名:return:返回识别效果这个验证码,错了可以调用多次"""image=self.return_image_content(test_image=self.return_path(test_image))#调用通用文字识别(高精版)#self.client.basicAccurate(image)#如果有可选参数,相关参数可以在上面的URL中列出findoptions={}options["detect_direction"]="true"options["probability"]="true"#Callresult=self.client.basicAccurate(image,options)result_s=result['words_result'][0]['words']#不打印关闭print(result_s)ifresult_s:returnresult_s.strip()else:raiseException("TheresultisNone,tryit!")展开百度色情识别接口:写代码一定要有乐趣,不能这么无聊吧?色情识别接口在内容审核里面,查一下就好了。调用方法源码:#-*-coding:utf-8-*-#@Time:2020/10/2217:30#@author:沙漏在下雨#@Software:PyCharm#@CSDN:https://me.csdn.net/qq_45906219fromaipimportAipContentCensorfromocrimportMyOrcclassAuditing(MyOrc):"""这是一个调用百度内容审计的aip接口,主要用来审计一些色情反恐恶心的东西,网址:https://ai.baidu。com/ai-doc/ANTIPORN/tk3h6xgkn"""def__init__(self):#super().__init__()APP_ID='填写你的ID'API_KEY='填写你的KEY'SECRET_KEY='填写你的SECRET_KEY'self.client=AipContentCensor(APP_ID,API_KEY,SECRET_KEY)defreturn_path(self,test_image):returnsuper().return_path(test_image)defreturn_image_content(self,test_image):returnsuper().return_image_content(test_image)defreturn_Content_by_baidulf_of_image=0"测试,inherit"se)中的一些方法,因为都放在一起了,少了一点代码内容审核:关于图片中是否存在一些非法和不良信息,contentreview也可以实现textreview。我觉得有点鸡肋,所以没封装在一起。url:https://ai.baidu.com/ai-doc/ANTIPORN/Wk3h6xg56:paramtest_image:待测试的图片可以是本地文件也可以是URL:parammode:default=0表示识别本地文件mode=1表示识别出的图片URLlink:return:返回识别结果"""ifmode==0:filepath=self.return_image_content(self.return_path(test_image=test_image))elifmode==1:filepath=test_imageelse:raiseException("Themodeis0or1butyourmodeis",mode)#调用色情识别接口result=self.client.imageCensorUserDefined(filepath)#"""如果图片是url调用如下"""#result=self.client.imageCensorUserDefined('http://www.example.com/image.jpg')print(result)returnresulta=Auditing()a.return_Content_by_baidu_of_image("test_image/2.jpg",mode=0)学习识别muggle_ocr的接口:这个包最近很火,用起来很简单,其他功能不多安装pipinstallmuggle-ocr这个下载有点慢,最好用目前手机热点(清华/阿里)的镜像网站还没有更新这个包因为这个包是最新的ocrmodel12调用接口defreturn_ocr_by_muggle(self,test_image,mode=1):"""调用此函数使用muggle_ocr进行识别:paramtest_image要识别的文件名被测试是最好的绝对路径:parammodelmode=0表示ModelType.OCR表示识别普通打印文本mode=1时默认表示ModelType.Captcha表示识别4-6位简单英文输入验证码官网:https://pypi.org/project/muggle-ocr/:return:返回该验证码的识别结果。如果错了,可以多次调用。0:sdk=muggle_ocr.SDK(model_type=muggle_ocr.ModelType.OCR)else:raiseException("Themodeis0or1,butyourmode==",mode)filepath=self.return_path(test_image=test_image)withopen(filepath,'rb')asfr:captcha_bytes=fr.read()result=sdk.predict(image_bytes=captcha_bytes)#不打印offprint(result)returnresult.strip()封装源码:#-*-coding:utf-8-*-#@Time:2020/10/2214:12#@author:沙漏在下雨#@Software:PyCharm#@CSDN:https://me.csdn.net/qq_45906219importmuggle_ocrimportosfromaipimportAipOcr"""PS:这个功能主要是做一个包到结合两个常用的图片/验证码识别方式如何一起使用取决于自己接口1:muggle_ocrpipinstallmuggle-ocr这个下载有点慢,最好用手机热点目前镜像网站(清华/阿里)有没有更新到这个包,因为这个包是最新的一个ocr模型界面2:baidu-aippipinstallbaidu-aip这个应该很多人都知道,但我觉得新的包麻瓜比调用方法更猛。可以参考官网文档:https://cloud.baidu.com/doc/OCR/index.html或者我用下面的方法就可以了:paramimage_path要识别的图片路径如果目录很深的话,建议使用绝对路径"""classMyOrc:def__init__(self):#设置一些必要的信息使用自己的百度aip内容APP_ID='你的ID'API_KEY='你的KEY'SECRET_KEY='你的SECRET_KEY'self.client=AipOcr(APP_ID,API_KEY,SECRET_KEY)defreturn_path(self,test_image):""":returnabsimage_path"""#确定路径ifos.path.isabs(test_image):filepath=test_imageelse:filepath=os.path.abspath(test_image)returnfilepathdefreturn_image_content(self,test_image):""":returntheimagecontent"""withopen(test_image,'rb')asfr:returnfr.read()defreturn_ocr_by_baidu(self,test_image):"""ps:先在__init__函数中完成自己baidu_aip的一些参数设置。本次测试使用的是高精度版测试,如果速度很慢,可以切换回普通版,待测文件名:return:返回本次验证码的识别效果,如果有是报错,可以多次调用。"""image=self.return_image_content(test_image=self.return_path(test_image))#调用通用文字识别(高精版)#self.client.basicAccurate(image)#如果有可选参数,相关参数可以在上面的网址中找到options={}options["detect_direction"]="true"options["probability"]="true"#callresult=self.client.basicAccurate(image,options)result_s=result['words_result'][0]['words']#Donotprintcloseprint(result_s)ifresult_s:returnresult_s.strip()else:raiseException("TheresultisNone,tryit!")defreturn_ocr_by_muggle(self,test_image,mode=1):"""调用这个函数使用muggle_ocr标识:paramtest_image待测文件名的最佳绝对路径:paramModelmode=0表示ModelType,OCR表示识别普通打印文本,当mode=1时,默认表示ModelType,captcha表示识别4-6位数字简单英文输入验证码官网:https://pypi.org/project/muggle-ocr/:return:返回这个验证码的识别结果,如果错误可以多次调用muggle_ocr.ModelType.Captcha)elifmode==0:sdk=muggle_ocr.SDK(model_type=muggle_ocr.ModelType.OCR)else:raiseException("Themodeis0or1,butyourmode=",mode)filepath=self.return_path(test_image=test_image)withopen(filepath,'rb')asfr:captcha_bytes=fr.read()result=sdk.predict(image_bytes=captcha_bytes)#不打印offprint(result)returnresult.strip()#a=MyOrc()#a.return_ocr_by_baidu(test_image='test_image/digit_img_1.png')