Cara Menyediakan Selenium sebagai Daemon Linux dengan systemd

Mary-Kate Olsen
Lepaskan: 2024-10-18 18:17:29
asal
426 orang telah melayarinya

How to Set Up Selenium as a Linux Daemon with systemd

Menyediakan dan menjalankan Chrome dan Selenium pada ubuntu atau debian. Panduan ini berdasarkan ubuntu 22.04

Selenium bagus untuk mengautomasikan tugasan web, tetapi memastikan bot berjalan 24/7 pada pelayan boleh menjadi rumit. Dengan menggunakan systemd, anda boleh menjalankan bot Selenium anda sebagai perkhidmatan latar belakang (daemon), memastikan ia berjalan dengan pasti dan dimulakan semula apabila gagal. Panduan ini akan membimbing anda melalui langkah-langkah untuk menyediakannya, dengan tumpuan pada mengkonfigurasinya untuk VPS Linux.

Jadual Kandungan

  1. Memasang Google Chrome

  2. Menyediakan persekitaran maya

  3. Memasang pakej yang diperlukan

  4. Membuat skrip Python

  5. Menyediakan perkhidmatan systemd

    • Menambah pembolehubah ENV (pilihan)
    • Fail perkhidmatan
    • Menjalankan perkhidmatan
  6. Membetulkan isu penimbalan blok

    • Menggunakan bendera -u
    • Menggunakan hujah Print flush
  7. Mengakses log menggunakan journalctl

  8. Rujukan


Memasang Google Chrome

Pertama, kemas kini semua pakej.

sudo apt update
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Muat turun pakej Google Chrome yang stabil.

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Pasang Google Chrome.

sudo apt install -y ./google-chrome-stable_current_amd64.deb
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Semak versi Google Chrome yang dipasang.

google-chrome --version
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Menyediakan persekitaran maya

Langkah ini tidak wajib jika anda hanya menjalankan bot Selenium pada mesin anda. Walau bagaimanapun, adalah disyorkan jika anda sedang mengerjakan projek lain atau memerlukan persekitaran terpencil.

Mari cipta persekitaran maya kita.

python3 -m venv venv
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Aktifkan persekitaran maya.

source venv/bin/activate
Salin selepas log masuk
Salin selepas log masuk

Memasang pakej yang diperlukan

Sekarang, pasang selenium dan webdriver-manager.

pip install selenium
pip install webdriver-manager
Salin selepas log masuk

Tujuan webdriver-manger adalah untuk memudahkan pengurusan pemacu binari untuk pelayar yang berbeza. Anda boleh mengetahui lebih lanjut mengenainya dalam dokumentasinya.


Mencipta skrip Python

## main.py

from selenium import webdriver
## ---- Use for type hint ---- ##
from selenium.webdriver.chrome.webdriver import WebDriver
## --------------------------- ##
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager


def create_chrome_web_driver_connection(headless: bool,
                                       detach:bool,
                                       use_sandbox: bool,
                                       use_dev_shm: bool,
                                       window_width: int = 1052,
                                       window_height: int = 825
                                       ) -> WebDriver:

    service = Service(ChromeDriverManager().install())
    options = Options()
    options.add_experimental_option("detach", detach)
    options.add_argument(f"--window-size={window_width},{window_height}")
    options.add_argument("--disable-extensions")
    options.add_argument("--disable-renderer-backgrounding")
    options.page_load_strategy = 'normal'

    if not use_sandbox:
        options.add_argument('--no-sandbox')
    if not use_dev_shm:
        options.add_argument('--disable-dev-shm-usage')
    if headless:
        options.add_argument("--headless=new")

    driver = webdriver.Chrome(service= service, options=options)

    return driver



if "__main__" == __name__:
    driver =  create_chrome_web_driver_connection(headless= True,
                                                 detach= False,
                                                 use_sandbox= False,
                                                 use_dev_shm= False)

    driver.get('https://python.org')
    print(driver.title)

    driver.close()

Salin selepas log masuk

options.add_experimental_option("tanggalkan", tanggalkan) :

  • Ini membolehkan anda mengkonfigurasi sama ada penyemak imbas Chrome kekal terbuka selepas skrip selesai dilaksanakan.
  • Jika detach adalah Benar, tetingkap penyemak imbas akan kekal terbuka walaupun selepas sesi WebDriver tamat.

options.add_argument(f"--window-size={window_width},{window_height}") :

  • Ini menetapkan saiz tetingkap untuk penyemak imbas dari segi lebar dan ketinggian.

Anda boleh mengalih keluar baris ini jika anda mahu.
Jika anda bercadang untuk menjalankan Selenium dalam mod tanpa kepala, pastikan anda menetapkan saiz tetingkap dengan cara ini; jika tidak, dalam pengalaman saya, saiz tetingkap lalai mungkin terlalu kecil.

Anda boleh menyemak saiz tetingkap anda dengan arahan ini driver.get_window_size()

options.add_argument("--disable-extensions") :

  • Sambungan boleh mengganggu interaksi penyemak imbas automatik, jadi melumpuhkannya boleh meningkatkan kestabilan.

options.add_argument("--disable-renderer-backgrounding") :

  • Ini menghalang Chrome daripada mengurangkan keutamaan atau menggantung tab latar belakang.
  • Ini boleh berguna apabila melakukan tindakan merentas berbilang tab.

options.page_load_strategy = 'biasa' :

  • Ini menetapkan strategi pemuatan halaman kepada normal, bermakna Selenium akan menunggu halaman dimuatkan sepenuhnya sebelum meneruskan dengan arahan selanjutnya.
  • Pilihan lain termasuk bersemangat (tunggu sehingga acara DOMContentLoaded) dan tiada (tidak menunggu halaman dimuatkan), anda boleh mengetahui lebih lanjut mengenainya di sini.

options.add_argument('--no-sandbox') :

  • Kotak pasir ialah ciri keselamatan Chrome yang mengasingkan proses penyemak imbas.
  • Melumpuhkannya (--no-sandbox) boleh berguna dalam sesetengah persekitaran ujian (cth., dalam bekas Docker atau semasa melaksanakan skrip sebagai pengguna root) di mana kotak pasir menyebabkan masalah kebenaran atau ranap sistem.

options.add_argument('--disable-dev-shm-usage') :

  • /dev/shm ialah ruang memori kongsi yang sering digunakan dalam persekitaran Linux. Secara lalai, Chrome cuba menggunakannya untuk meningkatkan prestasi.
  • Melumpuhkan ini (--disable-dev-shm-usage) boleh menghalang ranap sistem dalam persekitaran yang memori kongsi terhad.

options.add_argument("--headless=new") :

  • Ini mendayakan mod tanpa kepala, yang menjalankan Chrome tanpa GUI.
  • Mod tanpa kepala berguna untuk berjalan dalam persekitaran tanpa paparan, seperti saluran paip CI/CD atau pelayan jauh.

Menyediakan perkhidmatan systemd

Menambah pembolehubah ENV (pilihan)

Sekiranya program selenium anda perlu menggunakan pembolehubah persekitaran, terdapat dua cara anda boleh mencapai ini:

  1. Menggunakan fail .env dengan perpustakaan seperti python-dotenv (kaedah yang lebih biasa/popular).

  2. Menggunakan pilihan terbina dalam systemd untuk menyediakan Fail Persekitaran.

Untuk contoh ini, kami akan menggunakan pilihan kedua.

Mula-mula, mari kita cipta direktori conf.d di dalam direktori /etc.

sudo apt update
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Seterusnya, buat fail teks biasa (ini akan menjadi fail persekitaran kita).

sudo apt update
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Kini anda boleh menambah pembolehubah persekitaran anda pada fail yang baru kami buat.

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Ubah suai skrip Python untuk menggunakan pembolehubah persekitaran.

sudo apt install -y ./google-chrome-stable_current_amd64.deb
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Fail perkhidmatan

Anda perlu mencipta fail perkhidmatan di dalam direktori /etc/systemd/system/ ini; di sinilah unit systemd yang dipasang oleh pentadbir sistem harus diletakkan.

google-chrome --version
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Untuk contoh ini, saya akan menganggap bahawa anda berada dalam VPS dan anda mahu menjalankan perkhidmatan sebagai pengguna root.

[!AMARAN]
Perkhidmatan ini akan berjalan dengan keistimewaan root (pentadbir). Ini memberikannya akses penuh kepada sistem, tetapi berjalan sebagai root biasanya dielakkan melainkan perlu atas sebab keselamatan.

Tambahkan ini pada fail perkhidmatan.

python3 -m venv venv
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

[Unit] Bahagian

Bahagian ini mentakrifkan metadata dan kebergantungan untuk perkhidmatan.

Description=Selenium Bot Service : Menyediakan penerangan ringkas tentang perkara yang dilakukan oleh perkhidmatan. Dalam kes ini, ia menggambarkannya sebagai "Perkhidmatan Bot Selenium." Penerangan ini digunakan dalam log sistem dan oleh systemctl untuk mengenal pasti perkhidmatan.

After=network.target: Ini memastikan perkhidmatan bermula hanya selepas rangkaian tersedia. Network.target ialah sasaran sistem yang menunjukkan kefungsian rangkaian asas sudah selesai.

Bahagian [Perkhidmatan].

Bahagian ini menentukan konfigurasi perkhidmatan itu sendiri, termasuk cara ia berjalan, pengguna yang menjalankannya dan perkara yang perlu dilakukan jika ia gagal.

Pengguna : Menentukan pengguna di mana perkhidmatan akan dijalankan. Di sini, ia ditetapkan kepada akar.

EnvironmentFile : Menentukan fail yang mengandungi pembolehubah persekitaran yang digunakan oleh perkhidmatan.

WorkingDirectory: Menentukan direktori dari mana perkhidmatan akan dijalankan. Ini ialah direktori kerja untuk proses perkhidmatan. Di sini, fail bot disimpan dalam /root/selenium_bot/

ExecStart : Mentakrifkan arahan untuk memulakan perkhidmatan. Di sini, ia menjalankan fail main.py dalam /root/selenium_bot/

Restart=on-failure : Mengkonfigurasi perkhidmatan untuk dimulakan semula secara automatik jika ia keluar dengan kegagalan (iaitu, status keluar bukan sifar). Ini berguna untuk memastikan perkhidmatan bot terus berjalan, walaupun terdapat kegagalan sekali-sekala.

RestartSec=5s : Menentukan kelewatan antara permulaan semula sekiranya berlaku kegagalan. Dalam kes ini, perkhidmatan akan menunggu 5 saat sebelum cuba memulakan semula selepas kegagalan.

StandardOutput=journal : Mengubah hala output standard (stdout) perkhidmatan ke jurnal systemd, yang boleh dilihat menggunakan journalctl. Ini berguna untuk tujuan pengelogan dan nyahpepijat.

StandardError=journal : Mengubah hala keluaran ralat standard (stderr) ke jurnal systemd. Sebarang ralat yang dihadapi oleh perkhidmatan akan dilog dan juga boleh dilihat menggunakan journalctl

[Pasang] Bahagian

Bahagian ini mentakrifkan bagaimana dan bila perkhidmatan harus didayakan atau dimulakan.

WantedBy=multi-user.target : Menentukan sasaran di mana perkhidmatan harus didayakan. Dalam kes ini, multi-user.target ialah sasaran sistem yang dicapai apabila sistem berada dalam mod berbilang pengguna bukan grafik (biasa dalam pelayan). Ini bermakna perkhidmatan akan dimulakan apabila sistem mencapai sasaran ini, biasanya apabila sistem telah but kepada persekitaran berbilang pengguna.

Untuk mengetahui lebih lanjut tentang semua tetapan yang mungkin untuk perkhidmatan systemd semak rujukan

Menjalankan perkhidmatan

Mari periksa sama ada fail perkhidmatan kami sah; jika semuanya okay, tiada apa yang perlu dipaparkan.

sudo apt update
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Muat semula konfigurasi sistem, cari unit(perkhidmatan) baharu atau diubah suai.

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Mulakan/Mulakan semula perkhidmatan anda.

sudo apt install -y ./google-chrome-stable_current_amd64.deb
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Hentikan perkhidmatan anda.

google-chrome --version
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Semak status perkhidmatan anda.

python3 -m venv venv
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Lakukan ini jika anda mahu perkhidmatan anda bermula secara automatik semasa but.

source venv/bin/activate
Salin selepas log masuk
Salin selepas log masuk

Membetulkan isu penimbalan blok

Dalam python apabila anda menjalankan skrip anda dalam persekitaran interaktif( cth., apabila anda menjalankan nama fail python3.py secara manual dalam terminal) Python menggunakan penimbalan baris. Ini bermakna output, seperti keluaran daripada pernyataan print(), ditunjukkan serta-merta.

Walau bagaimanapun, apabila program Python dijalankan dalam persekitaran bukan interaktif (ini adalah kes kami), output akan menggunakan penimbalan blok. Ini bermakna program akan mengekalkan outputnya dalam penimbal sehingga penimbal penuh atau program tamat, melambatkan apabila anda dapat melihat log/output.

Anda boleh mengetahui lebih lanjut tentang cara penimbalan output python berfungsi di sini.

Memandangkan kami ingin melihat log dan output dalam masa nyata, kami boleh menangani isu ini dalam dua cara.

Menggunakan bendera -u

Dokumen python3 memberitahu kami perkara ini.

-u Paksa strim stdout dan stderr untuk dinyahbuffer. Pilihan ini tidak mempunyai kesan pada strim stdin

Dengan menggunakan bendera -u, Python beroperasi dalam mod tanpa buffer sepenuhnya untuk stdout dan stderr. Ini bermakna setiap bait dihantar terus ke terminal (atau mana-mana aliran keluaran seperti fail log) sebaik sahaja ia dihasilkan. Tiada penimbalan berlaku sama sekali.

Setiap aksara yang biasanya pergi ke stdout (seperti dari pernyataan print() atau ralat) ditulis serta-merta, bait demi bait, tanpa menunggu baris penuh atau penimbal terkumpul.

Untuk menggunakan pilihan ini jalankan skrip anda seperti ini:

sudo apt update
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Jika anda menggunakan pilihan ini pastikan anda mengubah suai ExecStart di dalam fail perkhidmatan.

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Menggunakan hujah Print flush

Dalam Python, fungsi print() menampan outputnya secara lalai, bermakna ia menyimpan output dalam ingatan dan hanya menulisnya apabila penimbal penuh atau program tamat. Dengan menggunakan flush=True, anda boleh memaksa Python untuk mengepam keluaran serta-merta selepas panggilan print(), memastikan bahawa output muncul serta-merta.

sudo apt install -y ./google-chrome-stable_current_amd64.deb
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Mengakses log menggunakan journalctl

Untuk melihat sejarah log penuh unit sistem anda (perkhidmatan), gunakan arahan berikut.

google-chrome --version
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Untuk memantau log dalam masa nyata, gunakan bendera -f. Ini akan menunjukkan hanya entri jurnal terbaharu dan terus mencetak entri baharu semasa ia dilampirkan pada jurnal.

python3 -m venv venv
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Rujukan

  • https://github.com/password123456/setup-selenium-with-chrome-driver-on-ubuntu_debian
  • https://www.selenium.dev/documentation/webdriver/drivers/options/
  • https://www.lambdatest.com/blog/selenium-page-load-strategy/
  • https://pypi.org/project/webdriver-manager/
  • https://pypi.org/project/python-dotenv/
  • https://wiki.archlinux.org/title/Systemd
  • https://man.archlinux.org/man/systemctl.1
  • https://man.archlinux.org/man/systemd.service.5.en#CONTOH
  • https://man.archlinux.org/man/systemd-analyze.1
  • https://docs.python.org/3/using/cmdline.html#cmdoption-u
  • https://realpython.com/python-flush-print-output/
  • https://man.archlinux.org/man/journalctl.1

Atas ialah kandungan terperinci Cara Menyediakan Selenium sebagai Daemon Linux dengan systemd. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!