一.
自己去chaojiying官网注册一个账号,购买相关的产品.
爬虫时候,自动识别需要登录的验证码,并实现自动登录,第一步使用超级鹰识别出网站的验证码
#!/usr/bin/env python
# coding:utf-8
import requests
from hashlib import md5
class Chaojiying_Client(object):
def __init__(self, username, password, soft_id):
self.username = username
password = password.encode('utf8')
self.password = md5(password).hexdigest()
self.soft_id = soft_id
self.base_params = {
'user': self.username,
'pass2': self.password,
'softid': self.soft_id,
}
self.headers = {
'Connection': 'Keep-Alive',
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
}
def PostPic(self, im, codetype):
"""
im: 图片字节
codetype: 题目类型 参考 http://www.chaojiying.com/price.html
"""
params = {
'codetype': codetype,
}
params.update(self.base_params)
files = {'userfile': ('ccc.jpg', im)}
r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)
return r.json()
def ReportError(self, im_id):
"""
im_id:报错题目的图片ID
"""
params = {
'id': im_id,
}
params.update(self.base_params)
r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
return r.json()
def main1(name):
chaojiying = Chaojiying_Client("这里输入超级鹰的账号和密码,还有服务型号") # 用户中心>>软件ID 生成一个替换 96001
im = open(name, 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
return chaojiying.PostPic(im, 1902) # 1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()
if __name__ == '__main__':
chaojiying = Chaojiying_Client('这里输入超级鹰的账号和密码,还有服务型号') #用户中心>>软件ID 生成一个替换 96001
im = open('a1.jpg', 'rb').read() #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
print(chaojiying.PostPic(im, 1902)) #1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()
二.图片识别py程序
步骤:
1.打开chrome浏览器实现截图,这里使用到了
screenhot = browser.get_screenshot_as_png()
2.保存图片(这里可以使用两种方法)
第一种是:with open 'wb'二进制格式写入
第二种是: 使用pillow, 在PIL库中的Img.open方法
image.png
3.以上保存的是页面的整个屏幕截图,下一步是从大图中抠出小验证码,思路是确定验证码整个div的横纵坐标,得到验证码框.
image.png- 使用超级鹰进行图片识别:
这里的main1方法是调用超级鹰里面定义的main1
result = main1('crop.png')
print(result)
最后识别结果如下:
image.png
5.模拟登录
browser.close()
源码如下:仅供参考
from io import BytesIO
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from PIL import Image
from chaojiying import main1
def main():
# 打开浏览器chrome实现截图
url = 'http://bm.e21cn.com/log/login.aspx'
browser = webdriver.Chrome()
wait = WebDriverWait(browser, 10)
browser.get(url)
#由于屏幕分辨率太小,导致截图不到验证码,需要拖拽屏幕
# browser.execute_script('window.scrollTo(1000,2000)')
screenhot = browser.get_screenshot_as_png()
print(screenhot)
# 1.保存大图 (使用with open)
# with open('login_screen.png', 'wb') as f:
# f.write(screenhot)
# 2.保存大使图(使用pillow)
img = Image.open(BytesIO(screenhot))
img.save('login1_screen.png')
#再确定验证码的横纵坐标,再从大图中抠出小验证码
input = wait.until(
EC.presence_of_element_located((By.CSS_SELECTOR, '#imgCheckCode'))
)
location = input.location
size = input.size
#保存图片中x:578 y:196
# location中 x:748 y:
left = location['x']
left_bottom = location['y']
right = location['x'] + size['width']
right_bottom = location['y'] + size['height']
capchta = img.crop((left, left_bottom, right, right_bottom))
capchta.save('crop.png')
# print(capchta)
#使用超级鹰进行图片识别
result = main1('crop.png')
print(result)
#模拟登录
browser.close()
if __name__ == '__main__':
main()
---部分代码转载来自超级鹰官网,时注明超级鹰文档,仅供技术交流:
网友评论