我有一个python脚本,可以用硒抓取网页并将数据发布到Firebase实时数据库。该脚本使用计划库每X小时运行一次。
在不使用Firebase的情况下部署脚本,我没有遇到任何错误。使用Firebase代码部署脚本时,运行heroku logs --tail
时收到以下消息:
2020-09-23T18:48:35.044206 + 00:00 heroku [web.1]:进程退出 状态137 2020-09-23T18:48:35.091567 + 00:00 heroku [web.1]:状态 从开始变为崩溃2020-09-24T00:26:53.135632 + 00:00 heroku [web.1]:状态从崩溃更改为开始 2020-09-24T00:27:07.260119 + 00:00 heroku [web.1]:启动过程 命令
python scraper.py
2020-09-24T00:28:07.677644 + 00:00 heroku [web.1]:错误R10(引导超时)-> Web进程绑定失败 在启动后60秒内达到$ PORT
在本地,该应用程序可与Firebase正常运行!
脚本:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait as wait
import schedule
import time
import os
import firebase_admin
from firebase_admin import credentials
from firebase_admin import db
cred = credentials.Certificate('secret-file.json')
firebase_admin.initialize_app(cred, {
'databaseURL' : 'https://a-database-url.com/'
})
# Use Chrome in silent mode
op = webdriver.ChromeOptions()
op.binary_location = os.environ.get("GOOGLE_CHROME_BIN")
op.add_argument("--headless")
op.add_argument("--no-sandbox")
op.add_argument("--disable-dev-sh-usage")
def job():
PATH = "C:\Program Files (x86)\chromedriver.exe"
# Heroku driver
driver = webdriver.Chrome(executable_path= os.environ.get("CHROMEDRIVER_PATH"), chrome_options=op)
driver.get("https://a-website.com")
print("Opening the browser")
try:
# Magic..
time.sleep(1)
# Magic..
time.sleep(3)
# More Magic..
driver.quit()
except:
driver.quit()
schedule.every(5).minutes.do(job)
while True:
schedule.run_pending()
time.sleep(1) # wait one minute
答案 0 :(得分:0)
您遇到以下错误:
Web进程在60秒内未能绑定到$ PORT
但是听起来您不打算运行一个Web进程(一个监听HTTP请求的Web进程)。
Heroku上的进程在名为Procfile
的文件中定义,该文件位于项目的顶级目录中。您可能只需要一个worker
而不是一个web
进程,例如
worker: python scraper.py
如果您已经拥有Procfile
,则将其从web:
更改为worker:
,如上所示。如果您没有一个文件,请使用前面的内容创建文件。