python selenium ile yazdığım, flask ile apiye açtığım (tek endpointlik) bot localde sorunsuz çalışmasına rağmen, ubuntu server kurulumda hata veriyor, centos a kurduğumda ise selenium düzgün çalışmıyor.
dediğim gibi kod localde sorunsuz çalışıyor, sadece deploymentde destek alabileceğim birisi varsa ulaşabilir mi ?
Python Selenium Deployment İşi
4
●176
- 07-09-2022, 11:39:26Selenium'da bu tarz sorunlar çıkabiliyor. Onun yerine requests kullanın derim veya selenium ile çalışacak kısım localde bulunur ve websitesi ile api bağlantısı kurar , websitesinde gerekli koşullar sağlanınca selenium localde çalışır ve api aracılığıyla iletişimde kalırlar.
- 07-09-2022, 12:26:13VDS'e selenium'u kurup flask ile trigger'layabilirsiniz, Flask Request Timeout'a da düşecektir.
Şöyle bir akış düşündüm:
Flask ve Selenium projelerini ayırın.
Selenium uygulamasının olduğu yer exe'de olabilir script'de. Şimdilik my_selenium_app.py diyeceğim.
127.0.0.1:5500/task => Bu route'ta istek gelince my_selenium_app.py'ı OS modülü ile çalıştırırsın, argüman göndereceksen args kullanabilirsin. Mesela "python my_selenium_app.py -username=vimevim" tarzında olması lazım. Route bu komutu çalıştırınca dönütünü beklemek zorunda değil diye biliyorum, direkt "success" return edebilirsin. Burada task'e bir ID verebilirsin, iyi olur. Bu ID'yi ise bir yerde tut mesela.
127.0.0.1:5500/result => my_selenium_app.py flask uygulamasında dönderdiği return dönütünü bu route'a GET yada POST ile göndersin. Task id'si de birlikte olacak tabi.
ID'leri eşle sonucunu gör. Request Timeout issue'sü de ortadan kalkar. Bu şekilde ikiye ayırınca socket'te kullanabilirsin.
Daha iyi bir yol: Bir veritabanına bir tablo oluştur, adı tasks olsun. Sütunlar ise ID:RESULT, ID ile my_selenium_app.py'ın çıktılarını eşler ve oraya kayıt edersin, rutin bir iş olacaksa geçmişe dönüp bakman kolaylaşır.
Umarım yardımcı olmuştur, arkadaşımızın da dediği gibi Requests kullanmak daha iyi ancak bulk işlemlerde yine timeout'a düşebiliyor. Başarılar, iyi çalışmalar. - 07-09-2022, 13:47:12hocam proje flask ile istek alıp seleniumu tetikliyor normalde. sorunsuz localde ama ubuntu tarafında selenium hata veriyor. çalışsa da timeout düşüyor yani sayfayı açmıyor sanırım.
vimevim adlı üyeden alıntı: mesajı görüntüle - 07-09-2022, 14:14:36Selenium'u flask runtime'ından çıkartmayı önermiştim bende. PM atarsanız daha iyi yardımcı olabilirim diye düşünüyorum.stuart adlı üyeden alıntı: mesajı görüntüle
Edit: Bende böyle bir problemle karşılaşmıştım ancak bu çözüm aklıma gelmemişti, şimdi eski kodları açma vakti... Bende oturdum denedim...
script.py
import time import os import datetime time.sleep(5) path = os.getcwd() + f"\\output.txt" with open(path, "a", encoding="utf-8") as f: f.write(f"[{datetime.datetime.now()}] I am triggered from a flask server and even though that script is done, I am still running!\n")app.py
import os import subprocess import sys from flask import * app = Flask(__name__) @app.route("/") def task(): script = os.getcwd() + "\\script.py" subprocess.Popen([sys.executable, script], stdin=subprocess.PIPE) message = "I am triggered from another script and even though that script is done, I am still running!" print(message) return jsonify({"message": message}) if __name__ == "__main__": app.run(debug=True)app.py'î çalıştırın ve "/" route'unu açın ve iş akışını takip edin. Bir sunucuya yükleyip denemedim, selenium kodunu ayırmakla uğraşmak yerine önce bunu bir sunucuda çalıştırmayı bi dene, bekleme süresini de selenium sciptinin tahmini çalışma süresiyle eşitle. Eğer çalışırsa teorik olarak senin işinide görmesi lazım, bu şekilde bir yol izleyebilirsin,
Bu bir workarround'dır, en iyi çözüm olmayabilir, büyük bir ihtimal değilde. Hızlı bir çözümdü, olumlu veya olumsuz gerçekleşebilecek herhangi bir şekilde sorumlu değilim, kodu kullanmak senin kararın. Başarılar.
Edit: Dayanamadım detaylıca kodlamaya çalıştım, umarım iş görür.
Edit: Yolları centos'a göre düzenlemen gerekiyor sanırım.
Edit: Banada böyle bir çözüm lazımmış, VDS olmayan python destekli bir sunucuya kurup denedim, venv aktifleştirmeye gerek kalmadan aynı kod ile çalıştırmayı başardım.