Rumah >pembangunan bahagian belakang >Tutorial Python >Cara Menyediakan Selenium sebagai Daemon Linux dengan 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.
Memasang Google Chrome
Menyediakan persekitaran maya
Memasang pakej yang diperlukan
Membuat skrip Python
Menyediakan perkhidmatan systemd
Membetulkan isu penimbalan blok
Mengakses log menggunakan journalctl
Rujukan
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
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
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.
## 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) :
options.add_argument(f"--window-size={window_width},{window_height}") :
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") :
options.add_argument("--disable-renderer-backgrounding") :
options.page_load_strategy = 'biasa' :
options.add_argument('--no-sandbox') :
options.add_argument('--disable-dev-shm-usage') :
options.add_argument("--headless=new") :
Sekiranya program selenium anda perlu menggunakan pembolehubah persekitaran, terdapat dua cara anda boleh mencapai ini:
Menggunakan fail .env dengan perpustakaan seperti python-dotenv (kaedah yang lebih biasa/popular).
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
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
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 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
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
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
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.
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
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
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
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!