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
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!