爬虫 之 打码平台

2018-12-19  本文已影响0人  煎炼

爬虫验证码中还是有很多的特别难破解的,比如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')

这一步有点看不懂的可以看我的另一片文章 爬虫 之 验证码(一),里面比较详细一点。

然后超级鹰要登场了

chaojiying = Chaojiying(账号, 密码, id)      #id 请参考图片1-4

result = chaojiying.post_pic(bytes_array.getvalue(), 验证码类型编号)    #二进制数据和类型编号,类型编号请参考图片1-5

1-4 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)

最后附上源码和运行结果

import 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)

1-5

成功率还是蛮高的,本篇文章到此结束,希望看到这篇文章的人有所收获。

上一篇下一篇

猜你喜欢

热点阅读