之前在《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呢,真是奇怪。算了,也懒得改了,就这样吧。