【Python】利用requests和selenium实现调用接口识别验证码并登陆12306

今天突发奇想做了一个12306自动登陆的程序!selenium环境配置:https://www.cnblogs.com/whyan/p/9206467.html

调用了接口http://littlebigluo.qicp.net:47720/ 大家酌情使用!

很多人学习python,不知道从何学起。

很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。

很多已经做案例的人,却不知道如何去学习更加高深的知识。

那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!

大概思路:

使用selenium库操作浏览器打开登陆页面并输入用户名和密码

def login(self):

  # 初始化浏览器对象

  driver = webdriver.Chrome()

  # 12306登陆页面

  login_url = "https://kyfw.12306.cn/otn/resources/login.html"

  # 设置浏览器长宽

  driver.set_window_size(1200, 900)

  # 打开登陆页面

  driver.get(login_url)

  # 找到账号登陆按钮

  account = driver.find_element_by_class_name("login-hd-account")

  # 点击按钮

  account.click()

  # 找到用户名输入框

  userName = driver.find_element_by_id("J-userName")

  # 输入用户名

  userName.send_keys(self.username)

  # 找到密码输入框

  passWord = driver.find_element_by_id("J-password")

  # 输入密码

  passWord.send_keys(self.password)

2 获取验证码图片,并保存到本地

def getVerifyImage(self):

  try:

      # 找到图片验证码标签

      img_element = WebDriverWait(self.driver, 100).until(

          EC.presence_of_element_located((By.ID, "J-loginImg"))

      )

  except Exception as e:

      print(u"验证码图片未加载!")

  # 获取图片验证码的src属性,就是图片base64加密后的数据

  base64_str = img_element.get_attribute("src").split(",")[-1]

  # base64解码得到图片的数据

  imgdata = base64.b64decode(base64_str)

  # 存入img.jpg

  with open('img.jpg', 'wb') as file:

      file.write(imgdata)

3 调用接口识别验证码图片,此技术基于深度学习,本人技术有限,暂不讲解!

def getVerifyResult(self):

  # 12306验证码识别网址

  # 发送post请求把图片数据带上

  response = requests.request("POST", url, data={"type": "1"}, files={'pic_xxfile': open('img.jpg', 'rb')})

  result = []

  print(response.text)

  # 返回识别结果

  for i in re.findall("(.*)", response.text)[0].split(" "):

      result.append(int(i) - 1)

4 根据结果选择图片验证码点击

def moveAndClick(self):

  try:

      # 创建鼠标对象

      Action = ActionChains(self.driver)

      for i in self.result:

          # 根据获取的结果取坐标选择图片并点击

          Action.move_to_element(self.img_element).move_by_offset(self.coordinate[i][0],

                                                                  self.coordinate[i][1]).click()

      Action.perform()

  except Exception as e:

      print(e)

5 点击登陆按钮

def submit(self):

  # 点击登陆按钮

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200605A0G7BA00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券