python 爬虫 自动切换 learnku 的白天 / 夜间模式

准备

  • 进入终端,输入 pip install requests,lxml 来下载 requests 爬虫库和 lxml(调用 xpath)模块。
  • 将你的电脑时间设置为正规时间

流程#

  1. 使用 session 会话的方法登录 learnku。

  2. 进入查看目前时间的循环

  3. 判断当前时间

  4. 18 点到凌晨 4 点开启夜间模式,其它时间开启白天模式

1. 登录 learnku#

由于 learnku 每隔 24 小时都会给我们的 cookie 和 token 进行一个小修改,所以我们就不用 cookie 登录法了,这里我们就是用 session 来登录吧(账号与密码的办法)。
如果想进一步地了解 session 和 cookie,请参考 python3 下使用 requests 实现模拟用户登录

from lxml import etree
import requests
s = requests.Session() #断点1

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36'
}
s.headers.update(headers) #断点2
text = s.get('https://learnku.com').text
html = etree.HTML(text)
login_token = html.xpath('//meta[@name="csrf-token"]/@content') #断点3
payload = {
    '_token':login_token,
    'remember': 'yes',
    'return_back': 'yes',
    'username': '你的账号名',
    'password': '你的账号密码'
}
s.post('https://learnku.com/auth/login', data=payload) #断点4

断点 1:创建一个 session 会话的对象。

断点 2:将 session 会话的 user-agent 设置为 Mozilla/5.0 (Windows NT 6.1; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36,主要是为了反反爬。

断点 3:这段代码找出了登录接口所需要的参数 token。

断点 4:对登录接口 https://learnku.com/auth/login 进行请求(登录)。

对了,在调用切换白天 / 夜间模式之前,你还要找出使用 session 再一次找出新 token。

token = html.xpath('//meta[@name="csrf-token"]/@content')

2. 对切换白天 / 夜间模式接口进行请求#

代码:

url = 'https://learnku.com/users/settings/night_mode'
data = {'_method':'POST',
        '_token':token}
s.post(url,data=data)

3.datetime 获取当前时间#

在无数的时间模块之间,datetime 模块是让我最满意的。datetime 是个内置模块,使用起来非常方便,所以我非常推荐大家学一学。如果你想进一步地了解 datetime 模块,不妨去看一下 Python3 标准库大全之 datetime 教程
回到我们的主题

首先,我们要导入 datetime 模块。

import datetime

然后我们就可以弄个判断时间的永远循环了。

while True:
    now = datetime.now()
    hour = now.hour
    text = s.get('https://learnku.com').text
    html = etree.HTML(text)
    day_or_night = html.xpath('/html[@lang="zh"]/@class')[0] #断点
    if hour > 18 or hour < 4:
        if day_or_night == "":
            s.post(url,data=data)
    else:
        if day_or_night == 'night-node':
            s.post(url,data=data)

断点:查看当前的模式为白天还是夜间。

完整代码:

from lxml import etree
import requests
from datetime import datetime
s = requests.Session()

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; ) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36'
}
s.headers.update(headers)

text = s.get('https://learnku.com').text
html = etree.HTML(text)
login_token = html.xpath('//meta[@name="csrf-token"]/@content')
payload = {
    '_token':login_token,
    'remember': 'yes',
    'return_back': 'yes',
    'username': '你的账号名',
    'password': '你的密码'
}
s.post('https://learnku.com/auth/login', data=payload)
text = s.get('https://learnku.com').text
html = etree.HTML(text)
token = html.xpath('//meta[@name="csrf-token"]/@content')
url = 'https://learnku.com/users/settings/night_mode'
data = {'_method':'POST',
        '_token':token}
while True:
    now = datetime.now()
    hour = now.hour
    text = s.get('https://learnku.com').text
    html = etree.HTML(text)
    day_or_night = html.xpath('/html[@lang="zh"]/@class')[0]
    if hour > 18 or hour < 4:
        if day_or_night == "":
            print("夜间模式已开启")
            s.post(url,data=data)
    else:
        if day_or_night == 'night-node':
            print("白天模式已开启")
            s.post(url,data=data)
本作品采用《CC 协议》,转载必须注明作者和本文链接
coder Derek