看到有不少问爬虫 Playwright,Selenium 的问题。 给大家介绍一个新的 Python 自动化框架 Clicknium 。Clicknium[https://www.clicknium.com/documents]的优势在于使用特别简单,同时支持自动化桌面 app 和 Web 。 目前刚起步,欢迎大家多提意见和需求。
我用一个自动下载 Youtube 视频的 Sample 介绍一下使用方法。
pip install clicknium
pip install pytube
在 VS Code 中安装 Clicknium 插件并登录(是的,只支持 VS Code )
安装 Chrome 插件
安装 VS Code 插件
安装 chrome 插件
安装 VS Code 后再拓展商店搜索 Clicknium ,安装以后注册登录,然后 VS Code 左侧会出现一个奇怪的 logo 。 安装好 Chrome 插件后记得启用, 找不到的在浏览器地址栏输入 chrome://extensions/。
用 VS Code 创建一个 Python 文件,比如 youtube.py
from clicknium import clicknium as cc, locator
def main():
tab = cc.chrome.open("https://www.youtube.com")
if __name__ == "__main__":
main()
可以通过 F5 运行。 这行代码 Clicknium 会自动打开 Chrome 浏览器,并且进入油管的首页。
这个时候,我们要下载霉霉的视频, 那就得先打开霉霉视频页,类似把大象塞进冰箱:
步骤:
这里一个涉及到四个元素:搜索框, 搜索按钮,搜索结果中的艺人名字,视频页切换按钮
Clicknium 中使用 Locator 来定位 UI 元素, 并且提供了 Recorder 来生成 Locator 。
我们使用上面的代码打开油管页面然后打开 VS Code 调用 Recorder 。
调用 Recorder
点击上图 VS Code 中 Locator tab 上这个小小的 capture 按钮启用 Recorder 。这个按钮比较隐蔽( Good job !)如果没看到 LOCATORS 这个 tab ,点击右上角的三个点勾选 Locator 。 将鼠标移动到搜索栏上,会自动高亮显示 input 。按住 Ctrl+Click(鼠标右键单击)即可抓取 搜索框。 同样的方法 抓取搜索按钮,和下图右上角Taylor Swift 的链接。
Youtube 页
Recorder
每次抓取都会在 Recorder 中生成一个 UI 元素对应的 locator ,可以对其进行重命名。完成后点击 Complete 。
然后回到 VS Code
from clicknium import clicknium as cc, locator
from clicknium.common.enums import *
def main():
urlArrary = []
tab = cc.chrome.open("https://www.youtube.com")
tab.find_element(locator.chrome.youtube.searchBar).set_text(
"Taylor Swift", by='sendkey-after-click')
tab.find_element(locator.chrome.youtube.button_search_icon_legacy).click()
tab.find_element(locator.chrome.youtube.TS).click()
if __name__ == "__main__":
main()
通过 find_element 函数传入对应 locator 定位到某个 UI 元素然后利用 set_text 方法将“Taylor Swift”写入搜索框。
下一行是相同的方法定位到搜索按钮,然后用 click 函数表示鼠标点击。TS 表示搜索结果中 taylor Swift 的连接。
运行上面的 code ,进入霉霉的主页,我们采用相同的方法进入视频列表。
视频列表
在上图的列表中我们需要拿到每个视频的地址。 这个地址可以通过 locator 取得。 我们不可能给每个视频都抓取一个 Locator ,这里使用 Clicknium Recorder 一个非常强大的功能 Similar elements 。点击下图的按钮后, 同样采用 Ctrl+Click 的方式,Clicknium 就能自动识别的到类型的元素,生成一个 locator 。
tab = cc.chrome.open("https://www.youtube.com")
tab.find_element(locator.chrome.youtube.searchBar).set_text(
"Taylor Swift", by='sendkey-after-click')
tab.find_element(locator.chrome.youtube.button_search_icon_legacy).click()
tab.find_element(locator.chrome.youtube.TS).click()
tab.find_element(locator.chrome.youtube.div_video).click()
tab.wait_appear(locator.chrome.youtube.a_video_title)#等待视频列表加载完毕
vidioTitles = tab.find_elements(locator.chrome.youtube.a_video_title)
因为视频列表是异步加载的, 我们需要使用 wait_appear 等待 locator 出现。因为使用 similar elements 抓取了多个视频,这个 locator 指向了多个视频所以使用 find_elements 方法。这个方法会返回一个 UiElement 的 List 。我们可以 href 从中获取到视频的相对路径,拼接上油管的地址就能得到完整的 URL 。
有了完整 url ,就可以使用 Pytube 下载视频了。Pytube 可以根据指定的参数下载不同分辨率的视频,需要注意高画质是 video codec 和 audio codec 分开的。 具体可以参考Working with Streams and StreamQuery。 这里我们下载 1080p 的版本,下载路径可以修改 SAVE_PATH 。可是使用相同的方法实现视频上传。 反响好我就再写一篇。
下面是完整的代码:
from pytube import YouTube
from clicknium import clicknium as cc, locator
from clicknium.common.enums import *
def downloadVideo(url):
SAVE_PATH = "C:\\Users\\zhaoritian\\Downloads\\Youtube"
try:
yt = YouTube(url)
yt.streams.filter(res="1080p").first().download(output_path=SAVE_PATH)
except:
print("Connection Error") # to handle exception
# filters out all the files with "mp4" extension
print('Task Completed!')
def main():
urlArrary = []
tab = cc.chrome.open("https://www.youtube.com")
tab.find_element(locator.chrome.youtube.searchBar).set_text(
"Taylor Swift", by='sendkey-after-click')
tab.find_element(locator.chrome.youtube.button_search_icon_legacy).click()
tab.find_element(locator.chrome.youtube.TS).click()
tab.find_element(locator.chrome.youtube.div_video).click()
tab.wait_appear(locator.chrome.youtube.a_video_title)
videoTitles = tab.find_elements(locator.chrome.youtube.a_video_title)
for locat in videoTitles:
url = "https://www.youtube.com" + locat.get_property("href")
urlArrary.append(url)
tab.close()
for v in urlArrary:
downloadVideo(v)
if __name__ == "__main__":
main()
参考:
1
czwstc 2022-08-03 12:04:43 +08:00
安装依赖 pythonnet 的时候报错了:
Installing collected packages: pythonnet, clicknium Running setup.py install for pythonnet ... error error: subprocess-exited-with-error × Running setup.py install for pythonnet did not run successfully. │ exit code: 1 ╰─> [6 lines of output] usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...] or: setup.py --help [cmd1 cmd2 ...] or: setup.py --help-commands or: setup.py cmd --help error: option --single-version-externally-managed not recognized [end of output] note: This error originates from a subprocess, and is likely not a problem with pip. error: legacy-install-failure × Encountered error while trying to install package. ╰─> pythonnet note: This is an issue with the package mentioned above, not pip. hint: See above for output from the failure. |
2
czwstc 2022-08-03 12:15:37 +08:00
换了 3.8 可以,3.9 不行
|
3
heartlocker OP @czwstc 3.9 需要 pythonnet 依赖。
# Python version is 3.8 or below pip install clicknium # Python version is 3.9 or above pip install --pre pythonnet pip install clicknium |
4
heartlocker OP @czwstc 我更新了一版 现在 3.9+的版本也不需要安装前置依赖了。
|