汉字点击验证码识别_Python_qq_43561314的博客

CSDN博客

在开始之前应该配置好selenium+firefox

一、得到验证码图片

只有当鼠标移动到验证码上时,图片才会显示出来。因此我们可以采用鼠标悬停的的方式显示验证码,并得到图片保存在本地。

鼠标悬停拥有两种方式,一种是悬停到具体坐标,另一种是悬停到某一具体元素。我们选择前一种,原因有两点:由于最后识别出验证码时,需要点击具体坐标(每个字并不具有相对应的元素)。并且每一次鼠标执行都会在上一次的移动的坐标下再次移动(因此需要元素的坐标)。

  1. from selenium import webdriver

  2. from selenium.webdriver.common.action_chains import ActionChains

  3. driver=webdriver.Firefox()

  4. driver.get('http://www.xxx.com')

  5. ActionChains(driver).move_by_offset(762.5,447.76).perform()

  6. img=driver.find_element_by_xpath('//*[@id="jcaptchaimage"]')

二、验证码识别

字体验证码采用腾讯云字体识别(传输的图片信息必须是图片url或者base64编码),返回识别字体及字体位置。字体位置返回的是相对图片验证码的字体四个顶点的位置,可以设置函数,得到字体中心距离坐标(相对验证码左上角)。

具体可看官方文档:https://cloud.tencent.com/product/ocr/developer

  1. from tencentcloud.common import credential

  2. from tencentcloud.common.profile.client_profile import ClientProfile

  3. from tencentcloud.common.profile.http_profile import HttpProfile

  4. from tencentcloud.common.exception.tencent_cloud_sdk_exception import TencentCloudSDKException

  5. from tencentcloud.ocr.v20181119 import ocr_client, models

  6. with open('1.png','rb') as f:

  7. base64_data=base64.b64encode(f.read())

  8. cred = credential.Credential("SecretId", "SecretKey")

  9. httpProfile = HttpProfile()

  10. httpProfile.endpoint = "ocr.tencentcloudapi.com"

  11. clientProfile = ClientProfile()

  12. clientProfile.httpProfile = httpProfile

  13. client = ocr_client.OcrClient(cred, "ap-beijing", clientProfile)

  14. req = models.GeneralBasicOCRRequest()

  15. params = '{"ImageBase64":"'+s+'"}'

  16. req.from_json_string(params)

  17. resp = client.GeneralBasicOCR(req)

  18. res=resp.to_json_string()

  19. except TencentCloudSDKException as err:

  20. def texts_and_locations(img_str):

  21. img_str=json.loads(img_str)

  22. TextDetections=img_str['TextDetections']

  23. for t_d in TextDetections:

  24. texts.append(t_d['DetectedText'])

  25. x,y=cen_location(t_d['Polygon'])

  26. cen_locations.append([x,y])

  27. return (texts,cen_locations)

百度云智能云也可进行字体识别:

详细可看官方文档:https://cloud.baidu.com/doc/OCR/OCR-Python-SDK.html

三、位置处理

由于每次坐标移动都是在上一次坐标的基础上进行移动,因此可以设置函数在每次移动过后,再相反移动一次,恢复原来坐标。然后将步骤二得到的中心位置进行点击。注意:由于中心坐标是相对于验证码左上角的位置,因此进行识别字体点击前必须先将坐标移动到验证码左上角(验证码左上角相对于页面的坐标)

  1. def mo_click(driver,xy,left_click=True):

  2. ActionChains(driver).move_by_offset(xy[0],xy[1]).click().perform()

  3. ActionChains(driver).move_by_offset(xy[0],xy[1]).context_click().perform()

  4. ActionChains(driver).move_by_offset(-xy[0],-xy[1]).perform()

  5. def simulation_clicks(driver,by_cen_locations):

  6. for xy in by_cen_locations:

本文由 黑白世界4648 第一时间收藏到GET,原文来自 → blog.csdn.net

「GetParty」

关注微信号,推送好文章

微信中长按图片即可关注

更多精选文章

评论
微博一键登入