cnblogs和其他的部落格平臺相比會比較複雜,需要設定的專案也比較多一些,弄懂了cnblogs的實現方式,那麼你應該對selenium的整個框架使用已經爛熟於心了。
除了正常的標題,內容,摘要之外,cnblogs還需要設定個人分類,合集,投稿選項,投稿至網站分類,tags標籤等內容。
要填的東西比較多,比較複雜。接下來我們會一項項的介紹cnblogs的具體實現方式。
前提條件
前提條件當然是先下載 blog-auto-publishing-tools這個部落格自動釋出工具,地址如下:https://github.com/ddean2009/blog-auto-publishing-tools
cnblogs的實現
因為需要設定個人分類,合集,投稿選項,投稿至網站分類,tags標籤等內容,所以我們需要在配置檔案中提供這些內容。
配置檔案在config/cnblogs.yaml中。
首先是個人分類和合集部分:
# 個人分類 工具技巧 AIGC
categories:
- 工具技巧
# 新增到合集: 工具技巧 AIGC
collections:
- 工具技巧
這兩個部分都是需要你自己提前在cnblogs中建立好的。否則你會找不到這些內容,對應的介面地址如下:
接下來是投顧至網站分類:
cnblogs的這些網站分類是直接用文字來說明的,所以我們需要在配置檔案中再定義一個網站分類:
topic: 開源研究
最後就是tag標籤了,我們直接設定即可:
tags:
- 人工智慧
- aigc
- openai
- ai開發
- 程式那些事
文章標題
不得不說cnblogs的實現就是正規,cnblogs幾乎每個輸入的標籤都是帶有ID的,所以我們實現起來特別的簡單,這裡要給cnblogs點個贊。
# 文章標題
title = driver.find_element(By.ID, 'post-title')
title.clear()
if 'title' in front_matter['title'] and front_matter['title']:
title.send_keys(front_matter['title'])
else:
title.send_keys(common_config['title'])
time.sleep(2) # 等待2秒
我們找到ID,直接呼叫send_keys方法即可。
文章內容
cnblogs的文章內容是一個textarea,也是帶有ID的,所以我們直接根據ID獲取即可:
# 文章內容
file_content = read_file_with_footer(common_config['content'])
content = driver.find_element(By.ID, 'md-editor')
content.send_keys(file_content)
time.sleep(5) # 等待5秒
頁面滾動
如果你觀察cnblogs的頁面,可以看到文章內容之後已經佔滿了整個螢幕,如果我們還需要繼續處理後面的內容的話,就需要對頁面進行一個滾動操作。
這裡我們借用了ActionChains的scroll to element方法。
首先我們找到最下面的釋出按鈕,然後直接滾動到這個釋出按鈕即可。
# 滾輪滾到最下面的位置
submit_button = driver.find_element(By.XPATH, '//button[@data-el-locator="publishBtn"]')
ActionChains(driver) \
.scroll_to_element(submit_button) \
.perform()
time.sleep(1)
個人分類
個人分類是一個下拉框。
他有一個比較特別的tag name叫做cnb-post-category-select。
所以我們可以透過這個tag name找到這個元素,然後點選他。
因為所有的要選擇的元素都是在cnb-post-category-select這個tag內部的,所以我們呼叫post_category_select.find_element來查詢它內部的input元素。
找到之後,我們輸入個人分類,然後從下拉框中選擇對應的個人分類tag,然後點選回車。
所有的個人分類都選擇完畢之後,我們再次點選post_category_select,以關閉下拉框。
對應的程式碼如下:
# 個人分類
categories = cnblogs_config['categories']
if categories:
post_category_select = driver.find_element(By.TAG_NAME, 'cnb-post-category-select')
post_category_select.click()
for category in categories:
category_search = post_category_select.find_element(By.XPATH, '//nz-select-search/input')
category_search.send_keys(category)
time.sleep(1)
category_select = post_category_select.find_element(By.XPATH, f'//nz-tree-node-title[contains(@title, "{category}")]/div')
category_select.click()
time.sleep(0.5)
post_category_select.click()
time.sleep(2)
新增到合集
新增到合集的實現方式跟個人分類有些類似。
預設情況下,新增到合集這個選項中的內容是隱藏的,所以我們需要首先點選這個選項頭,讓對應的選項露出來。
這裡可以透過name來獲取到這個元素。然後點選。
接下來就是透過text屬性來查詢collection_select中要選擇的合集元素,然後點選他們。
注意,這裡如果選擇的是包含合集文字的span,如下所示。這個span是不可被點選的。
所以我們的解決辦法就是找到它的父元素。
透過: collection_item.find_element(By.XPATH, '..') 來實現。
然後點選他的父元素即可。
最終的實現程式碼如下:
# 新增到合集
collections = cnblogs_config['collections']
if collections:
collection_select = driver.find_element(By.NAME, '新增到合集')
collection_select.click()
# print(collection_select.get_attribute('innerHTML'))
for collection in collections:
collection_item = collection_select.find_element(By.XPATH, f'//span[contains(@class,"item__text") and contains(text(), "{collection}")]')
parent_element = collection_item.find_element(By.XPATH, '..')
# print(parent_element.tag_name)
parent_element.click()
time.sleep(0.5)
time.sleep(2)
投稿選項
投稿選項比較簡單,直接透過ID選擇即可:
# 投稿選項
post_type = driver.find_element(By.ID, 'site-publish-site-home')
post_type.click()
time.sleep(2)
投顧至網站分類
網站分類的ID就是分類的名字,所以,我們可以下面程式碼來實現:
# 投顧至網站分類
topic = cnblogs_config['topic']
if topic:
post_type_detail = driver.find_element(By.NAME, '投稿至網站分類')
post_type_detail.click()
topic_item = driver.find_element(By.ID, topic)
topic_item.click()
time.sleep(2)
摘要
摘要也是透過ID來獲取的,程式碼如下:
# 摘要
summary = common_config['summary']
summary_item = driver.find_element(By.ID, 'summary')
summary_item.send_keys(summary)
time.sleep(2)
tag標籤
tag標籤是一個輸入框。所以我們先定位到這個輸入框,然後輸入tag,等待網站的tag列表出來之後,直接回車即可。
實現程式碼如下:
# tag標籤
tags = cnblogs_config['tags']
if tags:
tag_item = driver.find_element(By.ID, 'tags')
tag_item.click()
for tag in tags:
tag_input = tag_item.find_element(By.TAG_NAME, 'input')
tag_input.send_keys(tag)
time.sleep(1)
tag_input.send_keys(Keys.ENTER)
time.sleep(2)
提交文章
最後就是提交文章啦,這個提交按鈕需要根據xpath來獲取:
# 提交文章
if auto_publish:
submit_button = driver.find_element(By.XPATH, '//button[@data-el-locator="publishBtn"]')
submit_button.click()
總結
cnblogs的實現還是比較規範的,主要就是各項內容會比較多一些,需要耗費一些時間來實現。
點我檢視更多精彩內容:www.flydean.com