在進行Python截取網絡報表并發送釘釘群過程中,碰到一些問題,也用到一些工具,在這裡做一下簡單總結。整個過程歸納如圖:
1 版本配置
windows 10
Google Chrome 74.0.3729.131(正式版本) (64 位)
python 3.7.1
selenium:3.141.0
2 打開浏覽器
2.1 打開浏覽器
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('log-level=3') # suppress selenium logging to stdout
options.add_argument('Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.131 Safari/537.36')
driver = webdriver.Chrome(options=options)
執行上面的代碼,會出現以下錯誤:
WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home
這是因為沒有找到 chromedriver.exe 可執行檔案,兩種解決方案如下:
1.找到 chromedriver.exe 的路徑,并将其作為參數添加(注意,不是 chrome.exe 的路徑)
2.安裝 webdriver_manager 子產品,并設定參數
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(ChromeDriverManager().install(), options=options)
3.浏覽器有時打不開,可能是由于 Google Chrome 版本自動更新之後,chromedriver.exe 版本不再對其支援,是以需要及時更新版本,或者停止 Google Chrome 自動更新。
2.2 浏覽器無界面模式最大化(headless)
options.add_argument('--headless')
driver = webdriver.Chrome(ChromeDriverManager().install(), options = options)
在浏覽器使用 headless 模式時,如果調整視窗大小,需要使用如下方法:
driver.set_window_position(0, 0)
driver.set_window_size(1366, 768) # 分辨率為 1366 X 768
如果浏覽器不使用 headless 模式, 則也可以用如下兩種方法,下面兩種方法在 headless 模式下不會執行(原因不确定):
options.add_argument('--start-maximized')
# 或者
driver.maximize_window()
3 查找節點
Selenium 提供了一系列查找節點的方法,還可以查找單個節點和多個節點。具體文法為 find_element_by_...(),如果有多個節點,用這種方法查找,隻能得到第一個節點,這時候可以使用 find_elements_by_...() 方法。
from selenium import webdriver
driver = webdriver.Chrome() # 假設可以正常打開浏覽器
driver.get('https://www.taobao.com')
# 根據 id 查找
driver.find_element_by_id('q')
# 根據 CSS 選擇器查找
driver.find_element_by_css_selector('#q')
# 根據 XPath 查找
driver.find_element_by_xpath('//*[@id="q"]')
# 兩個類 ng-star-inserted 和 caption
driver.find_elements_by_css_selector("div.ng-star-inserted.caption")
# 通過兩級類名查找
driver.find_elements_by_xpath("//div[contains(@class, 'chart-title-wrap')]/ancestor::div[contains(@class,'smartchart-box')]")
# 通過兩個類查找
driver.find_elements_by_xpath("//input[@name='login' and @type='submit']")
# 其它方法
find_element_by_name()
find_element_by_link_text()
find_element_by_partial_link_text()
find_element_by_tag_name()
find_element_by_class_name()
4 阿裡雲對象存儲(Object Storage Service,簡稱 OSS)
我在報表制作過程中,主要是進行網頁截圖和本地代碼作圖,并将它們儲存到本地,然後将這些圖像上傳到阿裡雲對象存儲空間擷取圖像外鍊,最後将外鍊嵌入到要發送釘釘的 Markdown 消息中。
注:直接将本地圖檔連結嵌入到 Markdown 消息中未取得成功,不知道有沒有解決方法。
使用 OSS 管理控制台來完成 OSS 基本操作步驟如下:
還可以通過使用圖形化管理工具 ossbrowser、指令行管理工具 ossutil,和 API/SDK 的方式來完成基本操作。
幾個概念
- 存儲空間(Bucket):存儲空間是您用于存儲對象(Object)的容器,所有的對象都必須隸屬于某個存儲空間
- 對象/檔案(Object):對象是 OSS 存儲資料的基本單元,也被稱為 OSS 的檔案。對象由元資訊(Object Meta)、使用者資料(Data)和檔案名(Key)組成。對象由存儲空間内部唯一的 Key 來辨別。
- 通路密鑰(AccessKey):AccessKey,簡稱 AK,指的是通路身份驗證中用到的 AccessKeyId 和 AccessKeySecret。
下面以 Python SDK 的方式來完成整個過程:
建立存儲空間
import oss2
# 阿裡雲主賬号AccessKey擁有所有API的通路權限,風險很高。強烈建議您建立并使用RAM賬号進行API通路或日常運維
auth = oss2.Auth('<yourAccessKeyId>', '<yourAccessKeySecret>')
# Endpoint以杭州為例,其它Region請按實際情況填寫。
bucket = oss2.Bucket(auth, 'http://oss-cn-hangzhou.aliyuncs.com', '<yourBucketName>')
# 設定存儲空間為私有讀寫權限。
bucket.create_bucket(oss2.models.BUCKET_ACL_PRIVATE)
上傳檔案
# <yourObjectName>為檔案上傳到bucket後的名稱
# <yourLocalFile>由本地檔案路徑加檔案名包括字尾組成,例如/users/local/myfile.txt
bucket.put_object_from_file('<yourObjectName>', '<yourLocalFile>')
下載下傳檔案
# <yourLocalFile>由本地檔案路徑加檔案名包括字尾組成,例如/users/local/myfile.txt
bucket.get_object_to_file('<yourObjectName>', '<yourLocalFile>')
列舉檔案
from itertools import islice
# oss2.ObjectIteratorr用于周遊檔案,制定存儲空間下的10個檔案
for b in islice(oss2.ObjectIterator(bucket), 10):
print(b.key)
删除檔案
# <yourObjectNmae> 為存儲空間上的制定檔案
bucket.delete_object('<yourObjectName>')
上傳本地圖像至存儲空間,并獲得其外鍊
5 釘釘群發送報表
首先在釘釘 “群設定“ 中點選 “群機器人”,然後點選 “添加機器人”,點選 “自定義”,出現如下頁面,其中 webhook 就是後面要用到推送報表至釘釘的連結。
下面以推送 markdown 類型消息為例,列出解決方法。
5.1 使用 Python 子產品 requests 發送
headers = {"Content-Type": "application/json"}
# 消息類型和資料格式參照釘釘開發文檔
data = {
"msgtype": "markdown",
"markdown": {
"title": "首屏會話透出的展示内容",
"text": "# 這是支援markdown的文本 \n## 标題2 \n* 清單1 \n ![alt 啊](https://gw.alipayobjects.com/zos/skylark-tools/public/files/b424a1af2f0766f39d4a7df52ebe0083.png)"
}
}
r = requests.post(webhook, data=json.dumps(data), headers=headers)
5.2 使用 Python 子產品 DingtalkChatbot 發送
import dingtalkchatbot.chatbot as cb
robot = cb.DingtalkChatbot(webhook)
robot.send_markdown(title='首屏會話透出的展示内容',
text="# 這是支援markdown的文本 \n## 标題2 \n* 清單1 \n ![alt 啊](https://gw.alipayobjects.com/zos/skylark-tools/public/files/b424a1af2f0766f39d4a7df52ebe0083.png)")
6 定時發送消息
windows 10 找到 任務計劃程式,然後選擇建立基本任務或者建立任務。
設定自己的選項,主要是紅色方框裡面的内容一定要填寫,這裡啟動的是 .bat 檔案。
下面是 .bat 檔案的内容,由于 timeReport.py 檔案路徑和 .bat 檔案路徑一緻,是以不需要再加上 timeReport.py 檔案路徑。
在運作上面的定時任務時,會自動跳出指令行視窗,這樣有可能會影響我們的工作,也有可能我們不小心影響到定時任務的運作。是以,如果能隐藏指令行視窗的話,那絕對是很妙的。設定如下:
後面我們在 任務計劃程式 中運作 timeReport.vbs 檔案就可以了,當然也要注意路徑的設定。
參考資料
- Error message: “'chromedriver' executable needs to be available in the path”
- How to Maximize window in chrome using webDriver (python)
- Not able to maximize Chrome Window in headless mode
- 阿裡雲對象存儲 OSS
- 阿裡雲圖檔處理
- 釘釘開發文檔:消息類型與資料格式
- Python 子產品 DingtalkChatbot
- 怎麼隐藏任務計劃運作bat批處理的黑框?
轉載于:https://www.cnblogs.com/shaocf/p/10898790.html