Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara Menyediakan Selenium sebagai Daemon Linux dengan systemd

Cara Menyediakan Selenium sebagai Daemon Linux dengan systemd

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-18 18:17:29428semak imbas

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

Muat turun pakej Google Chrome yang stabil.

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb

Pasang Google Chrome.

sudo apt install -y ./google-chrome-stable_current_amd64.deb

Semak versi Google Chrome yang dipasang.

google-chrome --version

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

Aktifkan persekitaran maya.

source venv/bin/activate

Memasang pakej yang diperlukan

Sekarang, pasang selenium dan webdriver-manager.

pip install selenium
pip install webdriver-manager

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()

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

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

sudo apt update

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

Ubah suai skrip Python untuk menggunakan pembolehubah persekitaran.

sudo apt install -y ./google-chrome-stable_current_amd64.deb

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

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

[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

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

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb

Mulakan/Mulakan semula perkhidmatan anda.

sudo apt install -y ./google-chrome-stable_current_amd64.deb

Hentikan perkhidmatan anda.

google-chrome --version

Semak status perkhidmatan anda.

python3 -m venv venv

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

source venv/bin/activate

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

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

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

Mengakses log menggunakan journalctl

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

google-chrome --version

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

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!

Kenyataan:
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