Подвисание процессов Селениума

D
На сайте с 28.06.2008
Offline
1101
665

У меня практически нет опыта с селениумом и питоном, но тем не менее я написал  парочку парсеров. Они не сложные, но собирают очень много инфы и работают по крону днями, а то и неделями.

Запускаются раз в минуту. Каракас примерно такой

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import os
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument('--disable-dev-shm-usage')

from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
import pymysql
import time
import math

driver = webdriver.Chrome("/root/chromedriver",chrome_options=chrome_options)
try:
    file = open('/root/chek.txt')
except IOError as e:
    #Создаю файл которым контролирую закончил ли скрипт работу
    f = open("chek.txt", "x")
    f.close()

  ....... далее выбираю нужные элементы с нужного сайта и пишу в базу

   driver.quit()

    mydb.commit()
    mydb.close()
    #Удаляю лок файл
    os.remove('/root/chek.txt')
    #Принудительно убиваю процессы селениума если они не закрылись
    os.system("pkill chromedriver")
    os.system("pkill chromium")
else:
    with file:
        print('скрипт еще работает')

Скрипт может нормально проработать несколько часов или даже пару дней, но как правило всегда зависает.

Захожу на сервер и вижу кучу процессов chromium, пробую вручную pkill chromedriver и pkill chromium - они уже не помогают. Приходится убивать процесс по PID или ребутнуть сервак.

В чем может быть проблема?

Sly32
На сайте с 29.03.2012
Offline
302
#1
Если уж полез в питон, начни с азов. Судя по твоему примеру, у тебя вообще работать не должно, ты скорее всего криво вставил пример. Импорты дублируются непонятно зачем…
Для работы с файлами используй контекст-менеджер,  разберись с трай-ексепт. И так далее итп
lutskboy
На сайте с 22.11.2013
Offline
170
#2

мой тебе совет. я такое проходил уже, так как наткнулся на такие же грабли. не знаю как в питоне но я писал на nodejs.

вот ооочень простой мой пример

async function startParser(url) {

        const browser = await phantom.create(['--ignore-ssl-errors=yes', '--load-images=no']);
        const page = await browser.createPage();


        page.setting('userAgent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.2062 Safari/537.36');

        page.setting('resourceTimeout', '20000');

        await page.property('viewportSize', { width: 1366, height: 700 });


        try {
                const status = await page.open(url);
                await browser.exit();
        } catch(e) {
                await browser.exit();
                console.log(e);
        }


}      

смотри суть в чем. мы оборачиваем все ето дело в 

try {

} catch(e) {

}

и теперь в любом случае процесс удаляется даже в случае ошибки. так как есть 

await browser.exit();

в catch

Sly32
На сайте с 29.03.2012
Offline
302
#3
Кстати , если ты зочешь понять что происходит, добавь нормальное логгирование

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий