世界杯门票_托马斯穆勒世界杯进球数 - noh16.com

世界杯门票_托马斯穆勒世界杯进球数 - noh16.com

shape
  • Home
  • 乌拉圭世界杯冠军
  • 打码平台的使用

打码平台的使用

  • 2026-01-16 12:08:39
  • admin

# 打码平台的使用 # 学习目标 了解 常见的打码平台 掌握 通过打码平台处理验证码的方法 # 1 为什么需要了解打码平台的使用 现在很多网站都会使用验证码来进行反爬,所以为了能够更好的获取数据,需要了解如何使用打码平台爬虫中的验证码

# 2 常见的打码平台 云打码:http://www.yundama.com/ (opens new window)

能够解决通用的验证码识别

极验验证码智能识别辅助:http://jiyandoc.c2567.com/ (opens new window)

能够解决复杂验证码的识别

# 3 云打码的使用 下面以云打码为例,了解打码平台如何使用

# 3.1 云打码官方接口 下面代码是云打码平台提供,做了个简单修改,实现了两个方法:

indetify:传入图片的响应二进制数即可 indetify_by_filepath:传入图片的路径即可识别 其中需要自己配置的地方是:

username = 'whoarewe' # 用户名

password = '***' # 密码

appid = 4283 # appid

appkey = '02074c64f0d0bb9efb2df455537b01c3' # appkey

codetype = 1004 # 验证码类型

123456789云打码官方提供的api如下:

#yundama.py

import requests

import json

import time

class YDMHttp:

apiurl = 'http://api.yundama.com/api.php'

username = ''

password = ''

appid = ''

appkey = ''

def __init__(self, username, password, appid, appkey):

self.username = username

self.password = password

self.appid = str(appid)

self.appkey = appkey

def request(self, fields, files=[]):

response = self.post_url(self.apiurl, fields, files)

response = json.loads(response)

return response

def balance(self):

data = {'method': 'balance', 'username': self.username, 'password': self.password, 'appid': self.appid,

'appkey': self.appkey}

response = self.request(data)

if (response):

if (response['ret'] and response['ret'] < 0):

return response['ret']

else:

return response['balance']

else:

return -9001

def login(self):

data = {'method': 'login', 'username': self.username, 'password': self.password, 'appid': self.appid,

'appkey': self.appkey}

response = self.request(data)

if (response):

if (response['ret'] and response['ret'] < 0):

return response['ret']

else:

return response['uid']

else:

return -9001

def upload(self, filename, codetype, timeout):

data = {'method': 'upload', 'username': self.username, 'password': self.password, 'appid': self.appid,

'appkey': self.appkey, 'codetype': str(codetype), 'timeout': str(timeout)}

file = {'file': filename}

response = self.request(data, file)

if (response):

if (response['ret'] and response['ret'] < 0):

return response['ret']

else:

return response['cid']

else:

return -9001

def result(self, cid):

data = {'method': 'result', 'username': self.username, 'password': self.password, 'appid': self.appid,

'appkey': self.appkey, 'cid': str(cid)}

response = self.request(data)

return response and response['text'] or ''

def decode(self, filename, codetype, timeout):

cid = self.upload(filename, codetype, timeout)

if (cid > 0):

for i in range(0, timeout):

result = self.result(cid)

if (result != ''):

return cid, result

else:

time.sleep(1)

return -3003, ''

else:

return cid, ''

def post_url(self, url, fields, files=[]):

# for key in files:

# files[key] = open(files[key], 'rb');

res = requests.post(url, files=files, data=fields)

return res.text

username = 'whoarewe' # 用户名

password = '***' # 密码

appid = 4283 # appid

appkey = '02074c64f0d0bb9efb2df455537b01c3' # appkey

filename = 'getimage.jpg' # 文件位置

codetype = 1004 # 验证码类型

# 超时

timeout = 60

def indetify(response_content):

if (username == 'username'):

print('请设置好相关参数再测试')

else:

# 初始化

yundama = YDMHttp(username, password, appid, appkey)

# 登陆云打码

uid = yundama.login();

print('uid: %s' % uid)

# 查询余额

balance = yundama.balance();

print('balance: %s' % balance)

# 开始识别,图片路径,验证码类型ID,超时时间(秒),识别结果

cid, result = yundama.decode(response_content, codetype, timeout)

print('cid: %s, result: %s' % (cid, result))

return result

def indetify_by_filepath(file_path):

if (username == 'username'):

print('请设置好相关参数再测试')

else:

# 初始化

yundama = YDMHttp(username, password, appid, appkey)

# 登陆云打码

uid = yundama.login();

print('uid: %s' % uid)

# 查询余额

balance = yundama.balance();

print('balance: %s' % balance)

# 开始识别,图片路径,验证码类型ID,超时时间(秒),识别结果

cid, result = yundama.decode(file_path, codetype, timeout)

print('cid: %s, result: %s' % (cid, result))

return result

if __name__ == '__main__':

pass

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142# 3.2 代码中调用云打码的接口 下面以豆瓣登录过程中的验证码为例,了解云打码如何使用

# coding=utf-8

from selenium import webdriver

import time

import requests

from yundama import indetify

driver = webdriver.Chrome()

driver.get("https://www.douban.com/")

#输入用户名

driver.find_element_by_id("form_email").send_keys("78****@qq.com")

#输入密码

driver.find_element_by_id("form_password").send_keys("****")

#获取验证码的地址

img_url = driver.find_element_by_id("captcha_image").get_attribute("src")

response = requests.get(img_url) #请求验证码的地址

ret = indetify(response.content) #验证码识别

#输入验证码

driver.find_element_by_id("captcha_field").send_keys(ret)

time.sleep(5)

#点击登录

driver.find_element_by_class_name("bn-submit").click()

time.sleep(10)

print(driver.get_cookies())

driver.quit()

12345678910111213141516171819202122232425262728293031# 4 常见的验证码的种类 # 4.1 url地址不变,验证码不变 这是验证码里面非常简单的一种类型,对应的只需要获取验证码的地址,然后请求,通过打码平台识别即可

# 4.2 url地址不变,验证码变化 这种验证码的类型是更加常见的一种类型,对于这种验证码,大家需要思考:

在登录的过程中,假设我输入的验证码是对的,对方服务器是如何判断当前我输入的验证码是显示在我屏幕上的验证码,而不是其他的验证码呢?

在获取网页的时候,请求验证码,以及提交验证码的时候,对方服务器肯定通过了某种手段验证我之前获取的验证码和最后提交的验证码是同一个验证码,那这个手段是什么手段呢?

很明显,就是通过cookie来实现的,所以对应的,在请求页面,请求验证码,提交验证码的到时候需要保证cookie的一致性,对此可以使用requests.session来解决

# 小结 了解打码平台能够识别的验证码的类型 理解验证码的不同类型和不同处理方式 能够应用云打码进行验证码的识别

<<<
Previous Post
蛋疼是什么原因引起的

Copyright © 2088 世界杯门票_托马斯穆勒世界杯进球数 - noh16.com All Rights Reserved.

友情链接