Please enable Javascript to view the contents

Python 自动化神器 Clicknium 爬虫实战

 ·  ☕ 3 分钟  ·  🐵 码中人

Python 自动化神器 Clicknium 爬虫实战

Python 自动化神器 Clicknium 爬虫实战_哔哩哔哩_bilibili

Clicknium是一个Python界面自动化库,可以非常简单直观地使用它操作浏览器和Windows平台APP。

clicknium与其它类库比较

Python有很多自动化的库,比如Selenium,Pyautogu,Playwright。有的只能操作网页,有的只能操作App,并且使用起来都算不上简单:Selenium需要安装Driver,需要学习XPath;Pyautogui使用简单,代码可读性强,完全模拟鼠标单击,双击拖动;但是它采用xy轴的方式定位桌面元素。分辨率变化,位置变化都会影响运行。要想用好这些工具,学习成本实在不低。

Clicknium的出现,让Python界面自动化变得简单直观。Clicknium提供了简洁直观的API来操作UI元素,如set_text, get_text, click 等等。查看代码时,逻辑非常清晰,贴近自然语言和实际操作。那怎么解决元素定位的问题。我们为此设计了Clicknium Recorder。打开Recorder,Clicknium会自动识别鼠标所指的元素。 按住Ctrl+鼠标单击,Recorder会自动抓取元素,生成Locator。直接使用 Locator就能直接获取UI元素并对其进行操作。

安装

Clicknium支持Python 3.7+,安装过程非常简单,主要有三个步骤:

  1. 安装Clicknium库 pip install clicknium
  2. 安装 VSCode 插件 Clicknium extension
  3. 安装浏览器插件(在第2步安装vscode插件时,会提示安装第1步及第3步)

第一个自动化项目

First Automation Project | Clicknium

实际案例

我最近发现一个必应壁纸的非官方网站 今日必应,每天都会更新一张图片,我们可以使用Clicknium来爬取这些图片。爬取思路就是找到起始页的所有图片链接,然后打开每个链接,下载图片。

1 初始化项目

VSCode 安装Clicknium 插件之后,同时也会安装Clicknium CLI。我们可以使用CLI来初始化项目。

  • ctrl + shift + p 打开 VSCode 命令窗口
  • Clicknium:Create Project 创建项目

Clicknium:Create Project

2 捕获Locator元素

打开今日必应的网站,我们可以看到有很多图片,我们想要抓取这些图片,首先我们需要抓取图片的链接。我们可以使用Clicknium Recorder来抓取元素。

在VSCode中Locators面板中,点击右上角捕获按钮,选择打开的Chrome浏览器,打开相应网站,按ctrl点击元素,即可抓取元素。

Clicknium Recorder

link示例

3 编写代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# app.py
from clicknium import clicknium as cc, locator, ui
import requests

def main():
    tab = cc.edge.open("https://www.todaybing.com")
    links = tab.find_elements(locator.chrome.todaybing.link)
    for link in links:
        new_tab = tab.browser.new_tab(link.get_property("href"))
        img = new_tab.find_element(locator.chrome.todaybing.img_mbg)
        img_src = img.get_property("src")
        download_img(img_src)
        new_tab.close()

def download_img(url):
    img = requests.get(url)
    filepath = './' +  url.split("/")[-1] + '.jpg' 
    with open(filepath, 'wb') as f:
        f.write(img.content)

if __name__ == '__main__':
    main()

4 运行

1
python app.py

下一步工作

因为网站是滚动分布,以上简单代码只能爬取网站少许显示的图片。接下来可以通过 Clicknium 向下滑动网页,点击加载更多按钮,从而获得更多的图片链接,达到爬取所有图片的效果。

另也给大家推荐一个爬取妹子图的脚本:
40 行代码搞定 v2ph 爬虫 - V2EX

ReaganScott/v2ph: python爬虫集合

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import os
from time import sleep
from clicknium import clicknium as cc, locator, ui
import requests
import random
from tkinter import messagebox


tab = cc.chrome.open("https://www.v2ph.com/")

#messagebox.askokcancel('Confirm', 'please do Human check')
elems = tab.find_elements(locator.chrome.v2ph.img_list)
for elem in elems:
    url = "https://www.v2ph.com{}".format(elem.get_property("href"))
    new_tab = tab.browser.new_tab(url)
    
    
    has_next_page = True
    while has_next_page:
        for _ in range(20):
            new_tab.scroll(0, 2000)
            sleep(0.5)
        new_tab.wait_appear(locator.chrome.v2ph.img_sublist)
        imgs = new_tab.find_elements(locator.chrome.v2ph.img_sublist)
        headers = {
            'referer': 'https://www.v2ph.com/',
            'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36',
            'Content-Type': 'application/json'
        }
        for img in imgs:
            url = img.get_property("src")
            file_name = url.split("/")[-1]
            img_file = requests.get(url, headers=headers)
            temp_file = os.path.join(os.getcwd(), "picture", "{}".format(file_name))
            open(temp_file, 'wb').write(img_file.content)
            sleep(random.randint(1,5))
        next = new_tab.wait_appear(locator.chrome.v2ph.a_next)
        if next != None:
            next.click()
        else:
            has_next_page = False
            break
    new_tab.close()
    sleep(random.randint(1,5))
new_tab.close()

免责声明

以上代码仅用于案例学习,与学习无关的事,也与我无关。

分享

码中人
作者
码中人
Web Developer