首页 > 解决方案 > Selenium Flask 在本地运行良好时无法在 Heroku 上运行

问题描述

我正在尝试设计一个需要抓取电子商务网站以获取产品信息的应用程序。该应用程序在本地运行良好,但一旦我尝试在 Heroku 上托管它(使用 Python、Chromedriver、Google Chrome 构建包),Selenium 无法正确抓取元素,导致没有此类元素异常。

类似的问题表明它可能与“无头”选项有关,因此我尝试向 chrome 选项添加参数无济于事。我还考虑了元素在 Heroku 上加载速度不快的可能性,因此我合并了隐式等待,但这不起作用,有时会导致“带有 pid 的 Worker:7 由于信号 15 而被终止”错误。

我尝试过的事情:

chrome_options = webdriver.ChromeOptions() 
chrome_options.binary_location = os.environ.get("GOOGLE_CHROME_BIN") 
chrome_options.add_argument("--window-size=1920,1080"); 
chrome_options.add_argument("--disable-extensions"); 
chrome_options.add_argument("--proxy-server='direct://'"); 
chrome_options.add_argument("--proxy-bypass-list=*"); 
chrome_options.add_argument("--start-maximized"); 
chrome_options.add_argument("--headless"); 
chrome_options.add_argument("--disable-gpu"); 
chrome_options.add_argument("--disable-dev-shm-usage"); 
chrome_options.add_argument("--no-sandbox"); 
chrome_options.add_argument("--ignore-certificate-errors"); 
chrome_options.add_argument("--no-first-run"); 
chrome_options.add_argument("--no-default-browser-check"); 
chrome_options.add_argument('--allow-running-insecure-content')

driver = webdriver.Chrome('chromedriver') 
    wait = WebDriverWait(driver,1) 
    driver.get('https://shopee.sg/') 
    search = driver.find_element_by_class_name('shopee-searchbar-input__input') 
    search.send_keys(search_item) 
 
    search.send_keys(Keys.RETURN) 
    products = [] 
 
    try: 
        driver.implicitly_wait(10) 
        for _ in range(30): 
            try: 
                all_items = driver.find_elements_by_xpath('//div[@data-sqe="name"]') 
                all_links = driver.find_elements_by_xpath('//a[@data-sqe="link"]') 
                all_locations = driver.find_elements_by_xpath('//div[@class="_2CWevj"]') 
                all_images = driver.find_elements_by_xpath('//img[@class="mxM4vG _2GchKS"]') 
                all_prices =driver.find_elements_by_xpath('//div[@class="WTFwws _1k2Ulw_5W0f35"]') 
                driver.execute_script("return arguments[0].scrollIntoView(true);",all_items[_]) 
              wait.until(EC.presence_of_element_located(By.XPATH,'//img[@class="mxM4vG_2GchKS"]')) 
            except: 
                time.sleep(0.5)

Selenium 和 Heroku 仍然相对较新,因此任何有关如何进行操作的提示都会很有用!非常感谢您阅读本文:)

标签: seleniumflaskherokuselenium-chromedriver

解决方案


推荐阅读