爬虫 之 打码平台
爬虫验证码中还是有很多的特别难破解的,比如BT的12306
1-1哈哈~,是不是被难倒了,没关系,这次说的是打码平台,可以有效解决这类问题。
这次主要说说超级鹰:http://www.chaojiying.com/,进去之后呢,首先要找到开发文档
1-2下载即可,里面的内容还是很简洁和容易理解的,这里就不详细说明了,下载完后之后把超级鹰开发文档和你的代码放在同级目录下,然后就开始进入正题吧。
以这个url为例:https://kyfw.12306.cn/otn/login/init
1-3打开大概就是这个样子,我们要先获取到验证码图片
browser = webdriver.Chrome()
browser.get(url)
time.sleep(15)
img = browser.find_element_by_class_name('touclick-image')
延时稍微长了一点,为了防止验证码图片加载不出来,然后我们需要这个验证码图片的左上角和右下角的坐标。
left = img.location['x']#验证码图片左上角横坐标
top = img.location['y']#验证码图片左上角纵坐标
right = left + img.size['width']#验证码图片右下角横坐标
bottom = top + img.size['height']#验证码图片右下角纵坐标
将验证码图片保存成二进制文件,因为超级鹰那边验证需要传入验证码图片的二进制数据。
#页面快照
screenshot = browser.get_screenshot_as_png()
#打开快照文件
screenshot = Image.open(BytesIO(screenshot))
#截取验证码图片
captcha = screenshot.crop((left, top, right, bottom))
captcha.save("./name.png")
bytes_array = BytesIO()
#图片二进制
captcha.save(bytes_array,format='PNG')
这一步有点看不懂的可以看我的另一片文章 爬虫 之 验证码(一),里面比较详细一点。
然后超级鹰要登场了
1-4 1-5chaojiying = Chaojiying(账号, 密码, id) #id 请参考图片1-4
result = chaojiying.post_pic(bytes_array.getvalue(), 验证码类型编号) #二进制数据和类型编号,类型编号请参考图片1-5
最后就是处理一下超级鹰返回的结果,模拟点击即可
#验证码结果进行解析
groups = result.get('pic_str').split('|')
#遍历验证结果,再用逗号切分变量后的验证结果,转换成整数
locations = [[int(number)for numberin group.split(',')]for groupin groups]
for locationin locations:
print(location)
# 当前页面点击,move_to_element_with_offset:把鼠标移动到某个偏移量 的 位 置, 相对于图片左上角的位置,perform()连续执行
ActionChains(browser).move_to_element_with_offset(img, location[0],location[1]).click().perform()
time.sleep(1)
最后附上源码和运行结果
1-5import time
from seleniumimport webdriver
from PILimport Image
from ioimport BytesIO
from selenium.webdriverimport ActionChains
from chaojiyingimport Chaojiying
EMAIL ='账号'
PASSWORD ='密码'
CHAOJIYING_SOFT_ID ="id"
CHAOJIYING_KIND =9004
#账号、密码、解码类型编号
chaojiying = Chaojiying(EMAIL, PASSWORD, CHAOJIYING_SOFT_ID)
url ='https://kyfw.12306.cn/otn/login/init'
browser = webdriver.Chrome()
browser.get(url)
time.sleep(15)
img = browser.find_element_by_class_name('touclick-image')
left = img.location['x']#验证码图片左上角横坐标
top = img.location['y']#验证码图片左上角纵坐标
right = left + img.size['width']#验证码图片右下角横坐标
bottom = top + img.size['height']#验证码图片右下角纵坐标
print(left, top, right, bottom)
#页面快照
screenshot = browser.get_screenshot_as_png()
#打开快照文件
screenshot = Image.open(BytesIO(screenshot))
#截取验证码图片
captcha = screenshot.crop((left, top, right, bottom))
captcha.save("./name.png")
bytes_array = BytesIO()
#图片二进制
captcha.save(bytes_array,format='PNG')
result = chaojiying.post_pic(bytes_array.getvalue(), CHAOJIYING_KIND)
#验证码结果进行解析
groups = result.get('pic_str').split('|')
#遍历验证结果,再用逗号切分变量后的验证结果,转换成整数
locations = [[int(number)for numberin group.split(',')]for groupin groups]
for locationin locations:
print(location)
# 当前页面点击,move_to_element_with_offset:把鼠标移动到某个偏移量的位置,相对 于图片左上角的位置,perform()连续执行
ActionChains(browser).move_to_element_with_offset(img, location[0],location[1]).click().perform()
time.sleep(1)
成功率还是蛮高的,本篇文章到此结束,希望看到这篇文章的人有所收获。