python 爬蟲 自動切換 learnku 的白天 / 夜間模式

Coolest發表於2020-05-05

準備

  • 進入終端,輸入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

相關文章