爬虫日常-cookies登录12306

前言

hello兄弟们,今天没事干也不晓得更什么内容.就把上次和大家说的可以采用cookies登录12306的方法告诉大家。这个功能熟练了的话还是比较简单的,毕竟可以直接通过pickle(建议大家可以自行搜索下吓唬这个库的功能)获取到cookie的值

页面分析

对于登录模块的页面分析前面的文章也和大家分享过了,就不在这里多说。我本来的思路是设计一个判定来检测本地是否保存有cookie文件。有的话直接获取内部cookie数据登录,没有的话就打开浏览器,由用户扫码登录,然后获取cookie值。但是在扫码登录这一模块出现了问题,在手机上确认登录后网页是不做跳转的,所以我就更换为发送用户密码的方式登录。

代码设计

代码基本上是基于前面文章的自动购票源码改写的,我在这里暂时只添加了判断登录模块,后面的购票暂时未改动。盆友们可以把两篇的源码自行结合,自己尝试修改购票的功能,争取能把‘购’改成‘抢’。
在这里插入图片描述我们先看第一部分代码

if __name__ == '__main__':
    opt = Options()
    opt.add_experimental_option('excludeSwitches', ['enable-automation'])  # 去除浏览器顶部显示受自动化程序控制
    opt.add_experimental_option('detach', True)  # 规避程序运行完自动退出浏览器
    web = Chrome(options=opt)
    web.get('https://kyfw.12306.cn/otn/resources/login.html')
    # 解除浏览器特征识别selenium
    script = 'Object.defineProperty(navigator,"webdriver", {get: () => false,});'
    web.execute_script(script)
    user = ''  # 此处输入账号
    pwd = ''   # 此处输入密码

首先是对浏览器做一些基本处理,定义了用户名,密码参数。这就是最开始的准备行动。然后我们就要开始加入一个判定了​

if __name__ == '__main__':
    opt = Options()
    opt.add_experimental_option('excludeSwitches', ['enable-automation'])  # 去除浏览器顶部显示受自动化程序控制
    opt.add_experimental_option('detach', True)  # 规避程序运行完自动退出浏览器
    web = Chrome(options=opt)
    web.get('https://kyfw.12306.cn/otn/resources/login.html')
    # 解除浏览器特征识别selenium
    script = 'Object.defineProperty(navigator,"webdriver", {get: () => false,});'
    web.execute_script(script)
    user = ''  # 此处输入账号
    pwd = ''   # 此处输入密码
    if not os.path.exists('./12306cookies.pkl'):
        login(user, pwd)
        web.refresh()
    else:
        cookies_login()
        web.refresh()

在判断中我们首先检测是否为首次运行,通过检测是否存在12306cookies.pkl文件进行判断。如果为首次登录就开启浏览器登录,不是就开启cookie登录。

那么我们就要开始修改浏览器登录函数login(user,pwd)了

# 定义登录方法
def login(user, pwd):
    login_choice = web.find_element(By.XPATH, '//*[@id="toolbar_Div"]/div[2]/div[2]/ul/li[1]')
    # 点击账号密码登录方式
    login_choice.click()
    username = web.find_element(By.XPATH, '//*[@id="J-userName"]')  # 向账号框传入账号信息
    passwd = web.find_element(By.XPATH, '//*[@id="J-password"]')  # 向密码框传入密码
    username.click()
    username.send_keys(user)
    passwd.click()
    passwd.send_keys(pwd)
    # 定位到登录按钮并点击
    web.find_element(By.XPATH, '//*[@id="J-login"]').click()
    # 设置显示等待直到滑块的span标签被定位到
    WebDriverWait(web, 2, 0.5).until(EC.presence_of_element_located((By.ID, 'nc_1_n1z')))
    span = web.find_element(By.ID, 'nc_1_n1z')
    action = ActionChains(web)
    action.click_and_hold(span).move_by_offset(300, 0).perform() # click_and_hold代表点击并保持点击动作。move_by_offset(x, y),其中x代表水平移动距离,y代表垂直移动距离
    WebDriverWait(web, 10, 1).until(EC.url_to_be('https://kyfw.12306.cn/otn/view/index.html'))
    pickle.dump(web.get_cookies(), open('./12306cookies.pkl', 'wb'))
    print('cookies保存成功')

其实对比前文就只是在绕过登录验证后做了一个显示等待并把cookie信息保存到12306cookies.pkl文件中。我这里给大家看下运行效果
在这里插入图片描述
可以看到此时我的文件目录下是没有12306cookies.pkl文件的,所以代码运行效果如下

在这里插入图片描述
在登录功能事项,目录下保存了我的cookie信息。到了这一步首次登录的功能就实现了。那么我们把目光放到cookie登录上
代码如下

def cookies_login():
    cookies = pickle.load(open('./12306cookies.pkl', 'rb'))
    for cookie in cookies:
        cookie_dic = {
            'domain': '.12306.cn',
            'name': cookie.get('name'),
            'value': cookie.get('value')
        }
        web.add_cookie(cookie_dic)
    web.get('https://kyfw.12306.cn/otn/leftTicket/init')
    print('cookies载入成功')

​其实操作非常简单,就是加载保存在本地的cookie文件,获取其中保存的关键字段,并使web加载得到的关键字段。我们要注意这里请求的url就不再是登录页面了。而是直接请求到的购票页面。我运行下代码给大家看一下效果

在这里插入图片描述可以看到运行效果非常好,右上角也可以看到我们直接通过本人信息进入到了购票界面。相比前文的普通登录购票要省去很多步骤与时间。时间空余的盆友们可以开始动手试试了。
关于后面的‘抢票’功能的话,我只能说我还没有深入研究,大家可以自己深入研究研究,但最好也别太深入
在这里插入图片描述
​另外五一假期临近,后面几天我的课还有点多。假期还要去和好基友happy,假期过后再来和兄弟们交流。大家可以这几天自己动手练练。假期过后我也可能会接着‘研究研究’。就说这么多,五一happy,没事干的朋友也不要久坐于电脑面前,难得的假期记得活动活动。祝大家五一快乐,记得点个小赞赞哦。
在这里插入图片描述

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一名无聊的网友

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值