运行 Python 使用 PM2 的带有 Selenium 和 Chromedriver 的应用经常崩溃并重新启动
Running a Python app with Selenium and Chromedriver using PM2 constantly crashes and restarts
我的应用在 PM2 中进入 运行 时遇到了问题。这是一个简单的 Python 3 应用程序,它使用 Selenium 和 Chrome/chromedriver 来抓取我们的网站。我认为问题要么是 Chrome 本身位于应用程序文件夹之外的另一个文件夹中,要么是它一旦启动就失去了与 Chrome/chromedriver 进程的连接,我只是不知道如何分辨PM2 以包含这些进程。
脚本 运行 在没有 PM2 的情况下可以正常工作,所以我不确定问题出在哪里或如何解决。这是它在每次重启后生成的输出(它基本上启动、崩溃并不断重启,从未连接到网站):
0|Scraper | [2018-04-11 10:07:32.222861] STARTING SCRAPER
0|Scraper | Traceback (most recent call last):
0|Scraper | File "/home/myapp/Scraper.py", line 1617, in <module>
0|Scraper | process()
0|Scraper | File "/home/myapp/Scraper.py", line 164, in process
0|Scraper | browser = webdriver.Chrome(chrome_options = options, executable_path = path_to_chromedriver)
0|Scraper | File "/usr/local/lib/python3.5/dist-packages/selenium/webdriver/chrome/webdriver.py", line 62, in __init__
0|Scraper | self.service.start()
0|Scraper | File "/usr/local/lib/python3.5/dist-packages/selenium/webdriver/common/service.py", line 100, in start
0|Scraper | time.sleep(1)
0|Scraper | KeyboardInterrupt <--- I'm guessing this is PM2 killing the app after an error?
0|Scraper | Progress is Empty <--- 'Empty' because it never did anything
0|Scraper | Progress SAVED
这些是我的 chrome 选项:
options = webdriver.ChromeOptions()
options.binary_location = '/usr/bin/google-chrome'
options.add_argument('headless')
options.add_argument('--log-level=3')
options.add_argument('window-size=1920x1080')
options.add_argument('--mute-audio')
options.add_argument('no-sandbox')
并且 chrome 驱动程序本身直接位于应用程序的父目录中。
这是我的 PM2 进程 json 文件:
{
"apps" :
[
{
"name" : "Scraper",
"script" : "Scraper.py",
"interpreter" : "python3",
"watch" : true
}
]
}
我所做的只是 PM2 start Scraper-process.json
然后 PM2 logs Scraper
查看输出。
编辑:
这是 chrome 驱动程序
的初始化
try:
path_to_chromedriver = "chromedriver"
browser = webdriver.Chrome(chrome_options = options, executable_path = path_to_chromedriver)
except Exception as e:
print("[ERROR] Chromedriver: " + str(e))
然后我开始将它发送到我们的页面:
browser.get(ourURL)
问题似乎出在我的 PM2 进程文件中。我错误地将"watch"设置为true,忘记了应用程序经常更改文件,导致pm2每次都重新启动应用程序。
我的应用在 PM2 中进入 运行 时遇到了问题。这是一个简单的 Python 3 应用程序,它使用 Selenium 和 Chrome/chromedriver 来抓取我们的网站。我认为问题要么是 Chrome 本身位于应用程序文件夹之外的另一个文件夹中,要么是它一旦启动就失去了与 Chrome/chromedriver 进程的连接,我只是不知道如何分辨PM2 以包含这些进程。
脚本 运行 在没有 PM2 的情况下可以正常工作,所以我不确定问题出在哪里或如何解决。这是它在每次重启后生成的输出(它基本上启动、崩溃并不断重启,从未连接到网站):
0|Scraper | [2018-04-11 10:07:32.222861] STARTING SCRAPER
0|Scraper | Traceback (most recent call last):
0|Scraper | File "/home/myapp/Scraper.py", line 1617, in <module>
0|Scraper | process()
0|Scraper | File "/home/myapp/Scraper.py", line 164, in process
0|Scraper | browser = webdriver.Chrome(chrome_options = options, executable_path = path_to_chromedriver)
0|Scraper | File "/usr/local/lib/python3.5/dist-packages/selenium/webdriver/chrome/webdriver.py", line 62, in __init__
0|Scraper | self.service.start()
0|Scraper | File "/usr/local/lib/python3.5/dist-packages/selenium/webdriver/common/service.py", line 100, in start
0|Scraper | time.sleep(1)
0|Scraper | KeyboardInterrupt <--- I'm guessing this is PM2 killing the app after an error?
0|Scraper | Progress is Empty <--- 'Empty' because it never did anything
0|Scraper | Progress SAVED
这些是我的 chrome 选项:
options = webdriver.ChromeOptions()
options.binary_location = '/usr/bin/google-chrome'
options.add_argument('headless')
options.add_argument('--log-level=3')
options.add_argument('window-size=1920x1080')
options.add_argument('--mute-audio')
options.add_argument('no-sandbox')
并且 chrome 驱动程序本身直接位于应用程序的父目录中。
这是我的 PM2 进程 json 文件:
{
"apps" :
[
{
"name" : "Scraper",
"script" : "Scraper.py",
"interpreter" : "python3",
"watch" : true
}
]
}
我所做的只是 PM2 start Scraper-process.json
然后 PM2 logs Scraper
查看输出。
编辑: 这是 chrome 驱动程序
的初始化try:
path_to_chromedriver = "chromedriver"
browser = webdriver.Chrome(chrome_options = options, executable_path = path_to_chromedriver)
except Exception as e:
print("[ERROR] Chromedriver: " + str(e))
然后我开始将它发送到我们的页面:
browser.get(ourURL)
问题似乎出在我的 PM2 进程文件中。我错误地将"watch"设置为true,忘记了应用程序经常更改文件,导致pm2每次都重新启动应用程序。