随着爬虫,反爬技术的升级,优秀的web开发工程师又相处了更变态的验证码。那就是点触验证码!例如最著名的,连人类有时候都识别不出来的,12306网站的验证码。
点触验证码的设计原理是给出一张复杂的图片,根据图片上的指示,点击图片特点区域。前端通过js收集点击坐标,后台进行校验,更变态一点的还要求,点击顺序。例如下面这些:
图像识别,人工智能,maybe。但是技术难度大,实现周期长,投入成本高。现在市面上出现了提供验证码服务的服务提供商,也出现了提供识别验证码的服务提供商。所以这里我们给大家介绍超级鹰这个网站。
http://www.chaojiying.com/,
具体流程是我们将网页上的验证码图片发送给超级鹰后台,它识别后,返回需要点击的坐标点。我们拿到坐标点后再通过selenium点击图片上的具体位置,从而实现验证功能。
在今后的开发过程中我们会用到很多的第三方服务,例如短信接口,cdn,对象存储等,要学会查看接口文档以及调试和使用。
打开超级鹰的文档开发,找到python语言,下载demo
下载解压之后有一个chaojiying.py
的文件,正常情况,你应该可以看懂它的,不会的自觉墙角面壁思过。
首次注册会赠送1000分用来测试。在用户中心生成一个软件id以便在接口中调用。
还有一个要注意的是,在调用接口时,需要指定验证码类型,在价格体系中可以查看各种验证码的费用情况以及类型码。
准备好这些,我们就可以开始写代码了。
此外点触型验证码的识别还在学习,此只讨论代码的可行性
以某个网站的的登录界面为例
import requests
import time
import random
from selenium import webdriver
from io import BytesIO
from chaojiying import Chaojiying
CHAOJIYING_USERNAME = '13548612815'
CHAOJIYING_PASSWORD = 'admin123'
CHAOJIYING_SOFT_ID = 899000
CHAOJIYING_TYPE = 9004
class CarHouse:
def __init__(self):
self.driver = webdriver.Chrome()
self.driver.maximize_window()
self.driver.implicitly_wait(10)
self.chaojiying = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID)
def login(self):
self.driver.get('https://account.autohome.com.cn/')
res = self.check_captcha()
if res:
print('验证成功')
else:
print('验证失败')
def check_captcha(self):
element = self.driver.find_element_by_xpath('//*[@id="embed-captcha"]/div/div[2]/div[1]/div[3]')
element.click()
# 滑动验证码
slider = self.driver.find_elements_by_xpath('//div[@class="geetest_slider_button"]')
if slider:
slider = slider[0]
print('滑动验证码')
return False
# 点触验证码
img = self.driver.find_elements_by_xpath('//img[@class="geetest_item_img"]')
if img:
print('点触验证码')
img = img[0]
img_content = self.download_img(img.get_attribute('src'))
data = self.chaojiying.post_pic(img_content, CHAOJIYING_TYPE)
points = data['pic_str'].split('|')
# points = ['178,277', '101,155']
print(points)
for point in points:
x, y = point.split(',')
webdriver.ActionChains(self.driver).move_to_element_with_offset(img, xoffset=int(x), yoffset=int(y)).click().perform()
time.sleep(random.random() + 1.5)
self.driver.find_element_by_xpath('//a[@class="geetest_commit"]').click()
time.sleep(1)
if self.driver.find_element_by_xpath('//*[@id="embed-captcha"]/div/div[2]/div[2]/div/div[2]/span[1]').text == '验证成功':
return True
def download_img(self, url):
print(url)
response = requests.get(url)
# img = BytesIO()
# img.write(response.content)
return response.content
if __name__ == '__main__':
carhouse = CarHouse()