发现个自动化运维爬虫 的好东西seleniumbase

神仙玩意儿,基于selenium,方便管理使用。

https://seleniumbase.io/

pip install seleniumbase 安装好了第一次执行会从GoogleAPI自动下载对应的chrome driver ,特别适合部署再VPS上执行(启动无头模式 headless=True)

看代码:

from seleniumbase import SB

with SB(test=True, uc=True) as sb:
    sb.open("https://google.com/ncr")
    sb.type('[title="Search"]', "SeleniumBase GitHub page\n")
    sb.click('[href*="github.com/seleniumbase/"]')
    sb.save_screenshot_to_logs()  # ./latest_logs/
    print(sb.get_page_title())

卧槽 !你看到了吗:

sb.open()打开网页 ,

sb.click中使用js的选择器,

sb.type 就改变input标签的里面的信息。

牛的来了 还可以过cloudflare

from seleniumbase import SB

with SB(uc=True, test=True, locale="en") as sb:
    url = "https://gitlab.com/users/sign_in"
    sb.activate_cdp_mode(url)
    sb.uc_gui_click_captcha()

    sb.sleep(2)

看看这个行云流水的操作:

from seleniumbase import BaseCase
BaseCase.main(__name__, __file__)  # Call pytest

class MyTestClass(BaseCase):
    def test_swag_labs(self):
        self.open("https://www.saucedemo.com")
        self.type("#user-name", "standard_user")
        self.type("#password", "secret_sauce\n")
        self.assert_element("div.inventory_list")
        self.click('button[name*="backpack"]')
        self.click("#shopping_cart_container a")
        self.assert_text("Backpack", "div.cart_item")
        self.click("button#checkout")
        self.type("input#first-name", "SeleniumBase")
        self.type("input#last-name", "Automation")
        self.type("input#postal-code", "77123")
        self.click("input#continue")
        self.click("button#finish")
        self.assert_text("Thank you for your order!")
  • assert_element
  • assert_exact_text
  • assert_text
  • type
  • click
  • click_link
  • open
  • js_click
  • go_back
from seleniumbase import sb

with SB(test=True, uc=True) as sb:
    sb.open("https://el.psy.congroo.com")
    quotes = sb.find_elements("h1")
    for quote in quotes:
        print(quote.text)

无头浏览器:

from seleniumbase import SB

with SB(headless=True) as sb:
    sb.open("https://el.psy.congroo.com")
    quotes = sb.find_elements("h1")
    for quote in quotes:
        print(quote.text)
    sb.save_screenshot("webpage_screenshot.png")
    print("截图已保存为 webpage_screenshot.png")    

好东西Eel 模块【需要安装chrome】

python下的eel。可以结合HTML JS CSS创建UI

1.可以从外界引入css 和JS (CDN),目前bootstrap 和Jquery完全没问题

2.在头部引入 <script type="text/javascript" src="/eel.js"></script> 即可,在JS里面可以调用Python的函数方法,即

eel.say_hello(name)(function(result) {
                document.getElementById("greeting").innerHTML = result;
            });

使用ell.函数名称(传递参数)(function(result) {

document.getElementById(“greeting”).innerHTML = result;

});

(对于python函数返回的结果result处理)

也就是说,该应用的所有网络请求可以在python里面完成,不需要使用AJAX,JS只需要页面交互,其实这样搞个FFMPEG的UI倒是非常简单 233333333333。

其中python 中定义函数需要使用装饰器来暴露这个函数

@eel.expose
def say_hello(name):
    return f"Hello, {name}!"

3.最关键是可以打包成EXE格式

打包当前目录所有文件,且以main.py为运行文件,且不显示命令行

pyinstaller --onefile -w --add-data=".:." main.py

坑点

需要运行端安装Chrome浏览器才能使用,如果使用chrome便携版 则可能无法使用。

解决方法 Chromium Embedded Framework (CEF) 

pip install cefpython3

他仅支持3.9 pass


代码示例

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Eel应用</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script>
    <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous">
    <!-- eel.js必须引入,这点其实很像wasm模式 -->
    <script type="text/javascript" src="/eel.js"></script>
</head>
<body class="container">
   <h1>欢迎</h1>
   <div class="row">
        <div class="col-md-6"><button class="btn btn-info" id="abc">ABC</button></div>
        <div class="col-md-6">
            <input type="text" id="name" placeholder="请输入你的名字" class="form-control"/>
            <button onclick="sayHello()" class="btn btn-success" id="hello">打招呼</button>
        </div>
   </div>
    
    <div class="row">
        <div id="greeting"></div>
            <button onclick="getJoke()">讲个笑话</button>
            <div id="joke"></div>
    </div>
    

    <script type="text/javascript">
        function sayHello() {
            var name = document.getElementById("name").value;
            eel.say_hello(name)(function(result) {
                document.getElementById("greeting").innerHTML = result;
            });
        }

        function getJoke() {
            eel.get_joke()(function(joke) {
                document.getElementById("joke").innerHTML = joke;
            });
        }
        $("#abc").click(function(){
            var name=prompt("your name?")
            $("#name").val(name)
            $("#hello").click()
        })
    </script>
</body>
</html>

main.py

import eel
import random

# 笑话列表
jokes = [
    "为什么电脑经常生病?因为窗户(Windows)总是开着!",
    "为什么数学书看起来总是很悲伤?因为它里面有太多的问题(problems)",
    "为什么海洋里没有电脑?因为它们总是遇到短路(seals)",
    "为什么冰块感觉很高冷?因为它的幽默感都冻结了。"
]

@eel.expose
def get_joke():
    return random.choice(jokes)

@eel.expose
def say_hello(name):
    return f"Hello, {name}!"

if __name__ == "__main__":
    eel.init(".") #如果是文件夹,就写文件夹名字,我这里html跟python同级
    eel.start("index.html", size=(400, 500))

好好好 现在esp32 可以AI了

首先感谢大佬 cnadler86 的努力,下面是地址:

https://github.com/cnadler86/micropython-camera-API

https://github.com/cnadler86/mp_esp_dl_models

两个 一个是esp32 使用摄像头, 一个用了esp-dl,将两个文件保存到你的esp32编译环境,引入这两个库即可

功能:照片拍摄、JPG图片转RGB、人员追踪、人脸识别(注册)

貌似demo就这么多

好好 大佬都喂饭了,连编译步骤都给你了

git clone https://github.com/cnadler86/mp_esp_dl_models.git
git clone https://github.com/cnadler86/micropython-camera-API.git
git clone https://github.com/cnadler86/mp_jpeg.git


cd boards/
idf.py -D MICROPY_DIR=<micropython-dir> -D MICROPY_BOARD=<BOARD_NAME> -D MICROPY_BOARD_VARIANT=<BOARD_VARIANT> -B build-<your-build-name> build
cd build-<your-build-name>
python ~/micropython/ports/esp32/makeimg.py sdkconfig bootloader/bootloader.bin partition_table/partition-table.bin micropython.bin firmware.bin micropython.uf2

混乱的五月即将告以段路

RT
LUATOS貌似看上去很顺眼,虽然他们家模块有点贵,但是ESP32C3 都可以用
AIR系列的就算了 ,可用用WIFI 显示屏 GB2132,输入输出 我这里就够了,Micropython在LCD上刷汉字还是慢了点。。。。。。。。。。

OK

ML307R 通信无敌 ,UART
股票 炒股大师 233333333

JS用户脚本(油猴脚本)引入外部JS库

因为无法使用script标签,在用户脚本处,引入脚本使用@require

// @require https://cdn.jsdelivr.net/npm/jsbarcode@3.11.5/dist/JsBarcode.all.min.js 在脚本运行前将先引入脚本,再执行,如果是创建js标签来引入脚本会再代码执行后才引入,不会对本次执行有影响

// ==UserScript==
// @name         引入外部库示例
// @namespace    http://your-namespace/
// @version      0.1
// @description  示例:在油猴脚本中引入外部 JS 库
// @author       You
// @match        *://*/*
// @require      https://cdn.jsdelivr.net/npm/jsbarcode@3.11.5/dist/JsBarcode.all.min.js
// @grant        GM_addStyle
// ==/UserScript==

(function() {
    'use strict';

    // 在这里可以直接使用外部库的功能
    JsBarcode("#barcode", "1234567890123", {
        format: "CODE128",
        fontSize: 12,
        margin: 0,
        height: 20,
        width: 1.5,
        displayValue: true
    });
})();