Scrapy笔记十四:12306登录

12306登录

  • https://curl.trillworks.com 这个网站可以通过复制对应的URL,然后会返回对应的cookies和headers等等便于复制

思路:

一、先解决登录验证码的问题

  • 1、先找到验证码的URL
  • 2、找到校验验证码的URL
  • 3、下载验证码并校验验证码
    • 1、通过requests的session中get请求将验证码下载下来
      2、然后通过post请求校验URL,发送对应的form表单
      3、form表单中的验证码坐标可以通过“超级鹰”打码平台提供的API来获取
      4、通过列表生成式或者chain库中的方法将打码平台超级鹰API返回的二维列表转化为一维列表
      

二、使用selenium来模拟登录

  • 1、创建一个Selenium_12306类来登录,使用xpath获取12306登录页面的账号密码框
  • 2、解决验证码识别的问题
    • 1、使用xpath获取验证码图片的html对象,使用对象中的location方法获取验证码图片的左上角坐标,
      然后使用size获取整个框的像素大小
      2、使用screenshot截取整个登录界面,使用Image方法打开图片,
      使用crop方法去对截图中的验证码图片进行定位,最后使用save方法保存验证码图片
      3、将验证码图片发送给打码平台(超级鹰),获取到对应的值并处理得到所需的字符串坐标值
      
  • 3、使用WebDriverWait显示等待
    • from selenium.webdriver.common.by import By
      from selenium.webdriver.support.ui import WebDriverWait #显示等待函数
      from selenium.webdriver.support import expected_conditions as EC #条件等待
      # 使用以下语句定位到验证码图片的对象
      WebDriverWait(driver,10).until(EC.presence_of_element_located((By.CLASS_NAME,'对应的html类名')))
      
  • 4、使用ActionChains模拟鼠标事件操作
    在这里插入图片描述
    • from selenium.webdriver import ActionChains
      #使用该语句模拟鼠标点击事件
      例句:ActionChains(driver).move_to_element_with_offset(element,coor[0],coor[1]).click().perform()
      
  • 5、判断点击登录过后的url是否有变化来判断是否登陆成功
    • if driver.current_url not in [API_URL.Login_URL_1,API_URL.Login_URL_2]:
      	print('登录成功')
      else:
          print('登录失败,请重新登录')
      

三、使用selenium来查询所需票

  • 1、使用手动账号密码登录
  • 2、找到车票购买的按钮页面,输入北京到长沙的单程票并选择日期点查询
  • 3、F12/Ctrl+Shift+i进入检查页面,由于是运用了Ajax技术,所以在XHR里面找到对应的网址
    • url链接:
      https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2019-11-21&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=CSQ&purpose_codes=ADULT
    • 这里会发现URL带有参数,有你输入的起始点和目的地和日期。然后起始点和目的地的URL都是英文,说明是被转换过后的,那网站中应该有对应的包含了json文件的url
  • 4、找到对应的包含了转换信息的json文件的url
    • url链接:
      https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9119
    • 这里面包含了对应的站点转换信息
      • 通过requests.get请求得到里面的信息
      • 处理得到的信息(转换成列表等),便于后面调用
  • 5、通过input输入参数get访问步骤3中得到的网站
    • 这里需要添加Requests headers
  • 6、提取对应的车次时间座位等信息到字典中,然后返回字典或者json格式文件即可
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值