Docker + Selenium 自动刷新Gitee静态页面
Keep Team Lv4

  之前在《Docker + Git 部署Hexo发布》中留了一个关于页面刷新的小坑,主要针对Gitee 静态页面(免费版)需手动刷新页面这一问题。那么在我们搭建好Selenium Docker环境之后就可以开始尝试利用爬虫完成页面的自动刷新了。

流程

  既然是利用爬虫,那首先得弄清楚手工刷新Gitee静态页面的时候,会采取什么样的流程。

流程图

  流程并不复杂,简单讲就是登陆Gitee(让浏览器获得登陆后的session),打开设置页面并点击“更新”按钮等待完成即可。唯一需要注意的就是Gitee对频繁更新做了限制,所以需要检查一下是否有“等待60秒”的提示。

完整代码

  只需要填入正确的用户名和登录密码即可。

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait as wait
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains as action
import time, logging

def initDriver():
    driver = webdriver.Remote(
        command_executor="http://chrome:4444/wd/hub",
        desired_capabilities=DesiredCapabilities.CHROME
    )
    driver.implicitly_wait(10)
    return driver
def close(driver):
    driver.close()
    driver.quit()
    
def login(driver, username, passwd):
    driver.get("https://gitee.com/login")
    wait(driver, 10).until(EC.presence_of_element_located((By.ID,"user_login")))
    driver.find_element_by_id('user_login').send_keys(username)
    driver.find_element_by_id('user_password').send_keys(passwd)
    action(driver).click(driver.find_element_by_name('commit')).perform()
    wait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//a[text()="{}"]'.format(username))))
    
def reupdate(driver, times):
    action(driver).click(driver.find_element_by_xpath('//div[contains(@class, "update_deploy")]')).perform()
    wait(driver,10).until(EC.alert_is_present())
    alert = driver.switch_to.alert
    logging.warning(alert.text)
    alert.accept()
    
    try:
        if(times == 0):
            wait(driver,5).until(EC.visibility_of_element_located((By.XPATH, '//span[text()="pages_deploying"]')))
            wait(driver,60).until_not(EC.visibility_of_element_located((By.XPATH, '//span[text()="pages_deploying"]')))
        else:
            wait(driver,5).until(EC.visibility_of_element_located((By.ID, 'max_1_minute')))
            # time.sleep(60)
            times = 0
    except Exception as e:
        etype = repr(e).split('(')[0]
        logging.error(etype)
        if(etype == 'TimeoutException'):
            times += 1
    return times
    
def update(driver, username):
    driver.get("https://gitee.com/{}/{}/pages".format(username, username, username))
    wait(driver, 10).until(EC.presence_of_element_located((By.XPATH,'//div[contains(@class, "update_deploy")]')))
    times = 0
    while(times < 3):
        times = reupdate(driver, times)
        if(times == 0):
            break
if __name__ == "__main__":
    driver = initDriver()
    try:
        login(driver, your_username, your_passwd)
        update(driver, your_repo_name) # 此处一般都是以username作为仓库名
    finally:
        close(driver)

  结合之前Docker环境下运行Selenium的方法,将脚本加入对应的run.sh中即可。运行结果如下:

********************************************************
Waiting for the Chrome server to start on port 4444
********************************************************
WARNING:root:Are you sure to redeploy Gitee Pages?
ERROR:root:TimeoutException
WARNING:root:Are you sure to redeploy Gitee Pages?

一键部署+更新

  《Docker + Git 部署Hexo发布》中提供了一键将Hexo部署到Gitee中的方法,我们在此基础上增加一键更新功能。

  一共需要用到3个docker,并且需要依序调用,最开始设想通过在Hexo的Git仓库中增加Hook回调,来触发一键更新。但后来发现可以有更简单的方式完成,即用Shell脚本,这样更简单,且非侵入,dockr相互之间无耦合关系。脚本如下:

#!/bin/sh
cd /home/core/blog/my-blog/
git pull
cd /home/core/blog/themes/next
git pull mygitee master
cd /home/core/blog/themes/ayer
git pull mygitee master 
cd /home/core/docker/hexo
docker-compose up
cd /home/core/docker/selenium
docker-compose up

  脚本一开始会从远端仓库中更新日志文件、Hexo主配置文件以及主题文件,然后依次启动Hexo-Docker和Selenium-Docker,完成一键部署和一键更新。

  注意:由于需要docker按顺序依次启动,因此在脚本中docker-compose并未使用-d参数。

其他

  在准备填这个坑的时候,才发现之前发布的文章日期都写成了2020。唉,2021已过一半,为啥潜意识里还在留恋2020呢,真是奇怪。算了,也懒得改了,就这样吧。