一、准备工作

1.下载selenium
可以直接

 pip install selenium

2.下载chromedriver
下载浏览器自动化测试工具

二、selenium 访问页面获取验证码

获取验证码需要通过先截取整个页面然后在通过整个页面截取验证码(要注意电脑的显示设置是不是100%)

通过selenium截取整个页面,然后分别获取验证码的左上角location和验证码的大小size再通过PIL模块进行裁剪

def get_captcha():# 获取网页的截图allscreen = browser.get_screenshot_as_file('allscreen.png')# 获取captchacaptcha = browser.find_element_by_class_name('login-pwd-code')# 获取captcha的左上角位置location = captcha.location# 获取图片大小size = captcha.size# 裁取captcharangle = (location['x'],location['y'],(location['x']+size['width']),(location['y']+size['height']))i = Image.open('./allscreen.png')captcha_img = './captcha.png'frame = i.crop(rangle)frame.save(captcha_img)

三、利用超级鹰获取验证码所对应的位置

1.这里需要先注册一个超级鹰的账号认证后会给1000积分,链接https://www.chaojiying.com/user/login/
2.点击软件id,创建一个软件Id
3.下载示例代码(开发文档—>选择相应的语言–>下载示例demo),python示例代码如下所示:

#!/usr/bin/env pythonimport requests
from hashlib import md5class Chaojiying_Client(object):def __init__(self, username, password, soft_id):self.username = usernamepassword =  password.encode('utf8')self.password = md5(password).hexdigest()self.soft_id = soft_idself.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()if __name__ == '__main__':chaojiying = Chaojiying_Client('用户名', '密码', '软件ID')  #用户中心>>软件ID 生成一个替换 96001im = open('./captcha.jpg', 'rb').read()                                                  #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//print (chaojiying.PostPic(im, 9004))                                         #1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()

通过超级鹰得到验证码所需点击位置

def click_captcha():# 获取验证码需要的为点击位置chaojiying = Chaojiying_Client('用户名', '密码', '软件ID')    #用户中心>>软件ID 生成一个替换 96001im = open('./captcha.jpg', 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//location = chaojiying.PostPic(im, 9004)['pic_str']  # 1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()print(chaojiying.PostPic(im, 9004))# 将位置进行分割成    [  [  ], [ ], [ ]  ]类型location_list = [i.split(',') for i in location.split('|')]for l in location_list:x = l[0]y = l[1]#点击当前x,y所处位置ActionChains(browser).move_to_element_with_offset(browser.find_element_by_class_name('login-pwd-code'), x,y).click().perform()time.sleep(0.5)

四,解决滑动验证码

这里目前需要在 browser.get(‘https://kyfw.12306.cn/otn/resources/login.html’)后面加入

script = 'Object.defineProperty(navigator,"webdriver",{get:()=>undefined,});'browser.execute_script(script)

要不然会验证码会一直报错
因为12306会识别出是使用selenium 登陆的

def slider():#滑动验证码span = browser.find_element_by_xpath('//*[@id="nc_1_n1z"]')# 对div_tag进行滑动操作action = ActionChains(browser)# 点击长按指定的标签action.click_and_hold(span).perform()action.drag_and_drop_by_offset(span, 400, 0).perform()

下面是完整代码

from selenium import webdriver
from selenium.webdriver import ActionChains
import time
from PIL import Image
import requests
from hashlib import md5
from selenium.webdriver import ChromeOptions
#验证码识别处理
class Chaojiying_Client(object):def __init__(self, username, password, soft_id):self.username = usernamepassword =  password.encode('utf8')self.password = md5(password).hexdigest()self.soft_id = soft_idself.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 login(username,password):# 填写账号密码browser.find_element_by_id('J-userName').send_keys(username)browser.find_element_by_id('J-password').send_keys(password)# 获取验证码get_captcha()# 填写验证码click_captcha()#点击登录browser.find_element_by_id('J-login').click()time.sleep(4)#滑动验证码slider()print('成功登陆')time.sleep(3)print(browser.current_url)
def slider():#滑动验证码span = browser.find_element_by_xpath('//*[@id="nc_1_n1z"]')# 对div_tag进行滑动操作action = ActionChains(browser)# 点击长按指定的标签action.click_and_hold(span).perform()action.drag_and_drop_by_offset(span, 400, 0).perform()def click_captcha():# 获取验证码需要的为点击位置chaojiying = Chaojiying_Client('用户名', '密码', '软件id')  # 用户中心>>软件ID 生成一个替换 96001im = open('./captcha.png', 'rb').read()  # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//location = chaojiying.PostPic(im, 9004)['pic_str']  # 1902 验证码类型  官方网站>>价格体系 3.4+版 print 后要加()print(chaojiying.PostPic(im, 9004))# 将位置进行分割成    [  [  ], [ ], [ ]  ]类型location_list = [i.split(',') for i in location.split('|')]for l in location_list:x = l[0]y = l[1]ActionChains(browser).move_to_element_with_offset(browser.find_element_by_class_name('login-pwd-code'), x,y).click().perform()time.sleep(0.5)def get_captcha():# 获取网页的截图allscreen = browser.get_screenshot_as_file('allscreen.png')# 获取captchacaptcha = browser.find_element_by_class_name('login-pwd-code')# 获取captcha的左上角位置location = captcha.location# 获取图片大小size = captcha.size# 裁取captcharangle = (location['x'],location['y'],(location['x']+size['width']),(location['y']+size['height']))i = Image.open('./allscreen.png')captcha_img = './captcha.png'frame = i.crop(rangle)frame.save(captcha_img)if __name__ == '__main__':#防止被服务器识别option = ChromeOptions()  # 实例化一个ChromeOptions对象option.add_experimental_option('excludeSwitches', ['enable-automation'])  # 以键值对的形式加入参数option.add_experimental_option('useAutomationExtension', False)browser = webdriver.Chrome(options=option)# 获取响应browser.get('https://kyfw.12306.cn/otn/resources/login.html')#防止被12306识别为selenium登陆script = 'Object.defineProperty(navigator,"webdriver",{get:()=>undefined,});'browser.execute_script(script)#屏幕最大化browser.maximize_window()time.sleep(1)# 点击账号登陆browser.find_element_by_class_name('login-hd-account').click()login('用户名','密码')

Selenium自动登陆12306官网(解决图片验证码和滑块验证码问题)相关推荐

  1. 12306官网自动刷票5秒太慢了,试试这个方法提速

    使用第三方刷票软件有风险,但是12306官网的自动查询功能太慢了,笔者就想了下如果能把每5秒刷新修改为1秒刷新多次回家的票就有着落了说干就干,思路很简单,修改服务器上的JS文件是不太可能的,所以只得从 ...

  2. 【2019.06.22】12306官网模拟登陆之验证码生成与验证初探

    前言 每一个学习过爬虫的人对12306肯定都是有点想法,但在每年春节或一些假期经历过12306官网抢票后,这些念头便逐渐不剩下多少了.有时候真的是活生生的人都瞅不出来 一直没有勇气去分析一下12306 ...

  3. 爬虫实战(二)—利用requests、selenium爬取王者官网、王者营地APP数据及pymongo详解

    概述 可关注微信订阅号 loak 查看实际效果. 代码已托管github,地址为:https://github.com/luozhengszj/LOLGokSpider ,包括了项目的所有代码. 本文 ...

  4. python使用selenium爬取联想官网驱动(一):获取遍历各驱动的下载网址

    python使用selenium爬取联想官网驱动(一):获取遍历各驱动的下载网址然后wget命令试验下载 由于初期学习,所以先拿一个型号的产品驱动试验. (1)以下为在联想某型号产品获取相关驱动下载的 ...

  5. android魅族轮播图,用angularjs模仿魅族官网的图片轮播功能

    使用指令模仿魅族官网的图片轮播功能(angularjs中DOM操作都在指令中完成) html css .slider{ position: relative; width:900px; height: ...

  6. python爬取千图网_python爬取lol官网英雄图片代码

    python爬取lol官网英雄图片代码可以帮助用户对英雄联盟官网平台的皮肤图片进行抓取,有很多喜欢lol的玩家们想要官方的英雄图片当作自己的背景或者头像,可以使用这款软件为你爬取图片资源,操作很简单, ...

  7. 仿12306官网(附源码)

    文章目录 前言 一.仿写12306官网 二.HTML+CSS代码如下 1.HTML代码 2.CSS代码 总结 一.代码如下(示例): 照片就没有传上去了,可以自行替换一下 <!DOCTYPE h ...

  8. 无法登陆teamviewer官网账户

    登陆teamviewer官网账户,不出现任何错误的提示,点击登陆后,如同点击了页面刷新的按钮一样,整个页面进行了以下刷新就完了,还是那个输入登陆账户和密码的界面 问题解决:换个浏览器即可(如:谷歌浏览 ...

  9. 使用selenium自动登陆b站 图片文字验证识别

    文章目录 前言 一. 反,反反爬虫 1.反爬虫 2.反反爬虫 二,超级鹰 三.完整代码 1.导包 2.超级鹰接口 3.连接手动开启的浏览器 4.定位文本框标签 5.图片文字识别 6.文本处理,坐标处理 ...

  10. 使用selenium自动登陆滴滴打码网

    2020-7-2 by 微风 思路 1 使用webdriver调用谷歌浏览器,然后请求滴滴打码网站. 2 通过selenium的xpath定位方法找到输入账号.密码.验证码.登陆的位置,并且传送具体的 ...

最新文章

  1. document.all
  2. 查看oracle自动优化,使用索引查询更快,优化器为何不能自动识别
  3. 最短Hamilton路径
  4. Vue实现可折叠导航菜单~非常详细
  5. Python While 循环语句
  6. BootStrap基本模板
  7. 软考高项-项目知识管理体系
  8. 如何用计算机快捷键代替鼠标,什么快捷键代替鼠标左键
  9. masm32踩坑总结
  10. 01背包问题—dp算法(动态规划)—java代码
  11. 云计算与大数据应用技术————21大数据2021142247537刘新敏
  12. HikariPool-1 - Exception during pool initialization. Could not create connection
  13. 小米全国高校编程大赛 高弗雷勋爵
  14. android代码让手机降温,手机降温神器下载 手机一键降温神器 for Android v1.0.1 安卓版 下载-脚本之家...
  15. Flask教程(二十)flask-apscheduler
  16. 一篇今日头条百万阅读量爆文怎么来的,自媒体月收入暴涨10万+
  17. c语言通过epoll来实现http协议的web服务器
  18. 基于Qt上USBCAN模块的二次开发
  19. java浅谈线程安全之锁
  20. 【华为昇腾社区、鹏城实验室】中国软件开源创新大赛·赛道二:任务挑战赛(模型王者挑战赛黄金赛段)

热门文章

  1. Mac下查看公网以及内网IP地址
  2. 使用C语言绘制变换前与变换后的三角形图形——变换矩阵
  3. 百度地图infowindow上添加自定义点击事件
  4. 东南亚外卖平台分析报告
  5. 计算机u盘病毒清除方式,终极:如何消除计算机上U盘的“文件夹.EXE病毒”?
  6. Java-事务的传播特性和隔离级别
  7. jQuery 实现页面关键字查询
  8. python导出pdf文件怎么只有一页_python利用PyPDF2拆分pdf文件成单页
  9. qq实验报告c语言,C语言实现QQ密码大盗(没试验过,下回验证一下)
  10. 机器学习——多元线性回归模型