12306登录
思路:
- 一、先解决登录验证码的问题
- 二、使用selenium来模拟登录
- 三、使用selenium来查询所需票
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格式文件即可