2017-01-19 44 views
9

Używam usługi Django, która uruchamia chromowane sterowniki dla selenu i zeskrobuje stronę z danymi. Usługa Django jest wywoływana przez inną usługę Java za pośrednictwem protokołu HTTP.Wiele procesów chromowania po chromedriver.quit()

Oto kod:

views.py

path_to_chromedriver = '/path/to/chromedriver' 
browser = webdriver.Chrome(executable_path = path_to_chromedriver) 
try: 
    response = get_data(browser) 
except Exception as e: 
    print str(e) 
finally: 
    browser.close() 
    browser.quit() 

scraper.py

get_data(browser) 
    try: 
     . 
     . 
     . 
     for i in range(1,6): 
      try: 
       . 
       . 
       . 
      return "success data" 
      except NoSuchElementException: 
       browser.back() 
     raise Exception("No results found") 
    except Exception as e: 
     print str(e) 
     raise 

Problem polega na tym, że po zakończeniu obsługi Java czyni wszystko połączenia i cały proces jest zakończony, jest od 25 do 50 chromowanych procesów osieroconych n RAM zajmujący ponad 1 GB. Czy coś tu jest nie tak?

+0

Co to jest wersja "sterownika"? Wiem, że stare wersje miały ten problem. – Guy

+0

Witam, używam ChromeDriver 2.27, więc nie sądzę, że to jest problem. Masz pojęcie o stop_client()? – Anirudh

Odpowiedz

0

Nie zamykaj przed zamknięciem kodu przestrzennego przy pomocy try/except.

try: 
    browser.quit() 
except WebDriverException: 
    pass 
+0

nie, wydaje się, że ma jakiś wpływ – Anirudh

0

Chcesz poszerzyć odpowiedź udzieloną przez @Serge B.

To rzeczywiście lepiej użyć browser.quit() nad browser.close(), ponieważ ten ostatni może zamknąć tylko bieżące okno, gdy pierwszy zamknie wszystkie okna (i wszystkie procesy).

Nadal nie sądzę, że rozwiążesz problem, robiąc to.

Miałem ten sam problem - sterownik nie jest zamknięty, gdy jest uruchamiany przez proces Java. Napotkałem go podczas testów z TeamCity. Spróbuj uruchomić swój kod bez korzystania z usługi Java i upewnij się, że to jest problem.

Jeśli to jest problem, sugeruję zabicie wszystkich procesów metodami Pythona. To rozwiązanie, którego użyłem i zadziałało. Niestety użyłem C# w tym punkcie i następny kod pomógł mi https://stackoverflow.com/a/35692319/4019586, ale nie jest to, czego możesz teraz użyć.

Nie wiem, jak to zrobić w Pythonie, ale może to być rozwiązanie dla Ciebie. Myślę, że z Pythonem to zadziała https://stackoverflow.com/a/6278951/4019586.

Pozytywną stroną jest to, że robisz wszystko poprawnie!) To tylko błąd w Selenie.

+0

usługa java wykonuje po prostu wywołanie http do usługi django i wygasa za 30 sekund. Nie sądzę, że przyczyną problemu jest usługa Java. Spróbuję zadzwonić tylko porzuć, ale NAPRAWDĘ wątpię, że to jest problem. – Anirudh

+0

Spróbuj zadzwonić, aby zakończyć testy bez usługi java. –

+0

nie, wciąż ten sam numer – Anirudh

5

To stary problem. To, co działa dla mnie, chociaż jest brudne, to dodać sen przed opuszczeniem:

+0

pozwól mi dać to zastrzelenie – Anirudh

+0

@Airirh nie ma szczęścia? –

+0

to nie działa. – Anirudh