多测师是一家拥有先进的教学理念,强大的师资团队,业内好评甚多的接口自动化测试培训机构!

17727591462

联系电话

您现在所在位置:接口自动化测试培训 > 新闻资讯

使用selenium解决12306的登录问题

更新时间:2022-03-11 09:32:59 作者:多测师 浏览:215

  最近接触了一些selenium模块的相关知识,觉得还挺有意思的,于是决定亲自尝试写一些爬虫程序来强化selenium模块(一定要多尝试、多动手、多总结)。本文主要使用python爬虫来模拟登录铁路12306官网。这儿得吐槽一句,铁路12306网站的反爬机制做的还是比较好。特别是12306的验证码很是令人很头疼的事,有时候自己去验证都不一定能通过。接下来就使用selenium模块解决验证码。

使用selenium解决12306的登录问题

  实现过程

  首先通过selenium创建一个浏览器,并通过向页面嵌入js代码去掉webdriver控件,如果不嵌入js代码就会被webdriver控件检测出,不管你怎么滑动滑块都是失败的。

  # 绕过window.navigator.webdriver控件检测

  option = Options()

  option.add_experimental_option('excludeSwitches', ['enable-automation'])

  option.add_argument('--disable-blink-features=AutomationControlled')

  driver = webdriver.Chrome(options=option)

  driver.maximize_window()

  # 切换到账号密码登录窗口

  driver.get('https://kyfw.12306.cn/otn/resources/login.html')

  time.sleep(3)

  driver.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a').click()

  time.sleep(2)

  嵌入js代码这样就不会被12306检测到是使用selenium自动化登录了。

  我们先解决最难的验证码。为了实现自动化登录我们使用超级鹰打码平台。

  · 注册并登录超级鹰账号:点击链接进行注册https://www.chaojiying.com/user/login/;

  · 点击购买题分,并进行充值;

  · 点击软件id,创建一个软件Id(程序中会用到);

  自动去帮我们去识别验证码。

  # 初始化超级鹰

  chaojiying = Chaojiying_Client('超级鹰账号', '超级鹰密码', '软件ID') # 没有软件ID的可以去自己在超级鹰平台生成

  # 处理验证码

  code_img_element = driver.find_element_by_xpath('//*[@id="J-loginImg"]') # 定位到验证码的位置

  # 用超级鹰去识别验证码

  dic = chaojiying.PostPic(code_img_element.screenshot_as_png, 9004) # 定位验证码并截图,调用chaojiying里的PostPic类;9004是验证码类型

  result = dic['pic_str'] # x1,y1|x2,y2;超级鹰返回回来的数据是json格式的

  rs_list = result.split("|")

  for rs in rs_list:

  p_temp = rs.split(",")

  x = int(p_temp[0]) # 拿到的是"x"而不是x

  y = int(p_temp[1])

  # 要让鼠标移动到某一个位置,然后进行点击

  ActionChains(driver).move_to_element_with_offset(code_img_element, x, y).click().perform() # 提交事件;以element为原点移动鼠标去点击验证码

  验证码有可能需要我们点击多个,所以通过打码平台会得到多个坐标,就比如这种,需要点击两次,通过超级鹰就会得到两个坐标。如下图。我们发现有两个坐标会有一个“|”,有三个坐标就有两个“|”,所以我们就把他们split下,让每个坐标嵌套再一个列表里。我们得到了验证码的坐标,下一步就是去点击验证码。但是,这个坐标是相对于验证码的图片的坐标,我们必须用ActionChains来移动一下动作链的位置。

  最后就是比较简单的传输账号密码登录了。

  # 输入用户名和密码

  driver.find_element_by_xpath('//*[@id="J-userName"]').send_keys('账号')

  driver.find_element_by_xpath('//*[@id="J-password"]').send_keys('密码')

  # 点击登录按钮

  driver.find_element_by_xpath('//*[@id="J-login"]').click()

  time.sleep(4)

  # 移动滑块

  btn = driver.find_element_by_xpath('//*[@id="nc_1_n1z"]')

  ActionChains(driver).drag_and_drop_by_offset(btn, 300, 0).perform() # 拖拽滑块向右移动300像素

  这个代码是超级鹰提供的接口。我封装成一个类了。

  #!/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()

  if __name__ == '__main__':

  chaojiying = Chaojiying_Client('超级鹰账号', '超级鹰密码', '96001')#用户中心>>软件ID 生成一个替换 96001

  im = open('a.jpg', 'rb').read()# 本地图片文件路径来替换 a.jpg 有时WIN系统须要//

  print(chaojiying.PostPic(im, 1902))# 1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()

  下面是selenium登录的代码:

  from selenium import webdriver

  import time

  from chaojiying import Chaojiying_Client

  from selenium.webdriver.common.action_chains import ActionChains

  from selenium.webdriver.chrome.options import Options

  # 初始化超级鹰

  chaojiying = Chaojiying_Client('超级鹰账号', '超级鹰密码.', '软件ID')

  # 绕过window.navigator.webdriver控件检测

  option = Options()

  option.add_experimental_option('excludeSwitches', ['enable-automation'])

  option.add_argument('--disable-blink-features=AutomationControlled')

  driver = webdriver.Chrome()

  driver.maximize_window()

  driver.get('https://kyfw.12306.cn/otn/resources/login.html')

  time.sleep(3)

  driver.find_element_by_xpath('/html/body/div[2]/div[2]/ul/li[2]/a').click()

  time.sleep(2)

  # 处理验证码

  code_img_element = driver.find_element_by_xpath('//*[@id="J-loginImg"]')

  # 用超级鹰去识别验证码

  dic = chaojiying.PostPic(code_img_element.screenshot_as_png, 9004)

  result = dic['pic_str'] # x1,y1|x2,y2

  rs_list = result.split("|")

  for rs in rs_list:

  p_temp = rs.split(",")

  x = int(p_temp[0]) # 拿到的是"x"而不是x

  y = int(p_temp[1])

  # 要让鼠标移动到某一个位置,然后进行点击

  ActionChains(driver).move_to_element_with_offset(code_img_element, x, y).click().perform() # 提交事件

  # 输入用户名和密码

  driver.find_element_by_xpath('//*[@id="J-userName"]').send_keys('12306账号')

  driver.find_element_by_xpath('//*[@id="J-password"]').send_keys('12306密码')

  # 点击登录按钮

  driver.find_element_by_xpath('//*[@id="J-login"]').click()

  time.sleep(4)

  # 移动滑块

  btn = driver.find_element_by_xpath('//*[@id="nc_1_n1z"]')

  ActionChains(driver).drag_and_drop_by_offset(btn, 300, 0).perform()

  以上内容为大家介绍了使用selenium解决12306的登录问题,本文由多测师亲自撰写,希望对大家有所帮助。了解更多自动化测试相关知识:https://www.aichudan.com/xwzx/

联系电话

17727591462

返回顶部