2013-07-02 9 views
18

Skrobię zawartość ze strony internetowej za pomocą Pythona. Najpierw użyłem BeautifulSoup i Mechanize na Pythonie, ale zobaczyłem, że na stronie znajduje się przycisk, który tworzył treść za pomocą JavaScript, więc postanowiłem użyć Selenium.Selen kontra BeautifulSoup dla skrobania WWW

Biorąc pod uwagę, że mogę znaleźć elementy i uzyskać ich zawartość za pomocą Selenium z metodami takimi jak driver.find_element_by_xpath, z jakiego powodu używam BeautifulSoup, kiedy mogłem po prostu użyć Selenium do wszystkiego?

W tym konkretnym przypadku muszę użyć Selenium, aby kliknąć przycisk JavaScript, więc czy lepiej jest używać Selenium do parsowania, czy też powinienem używać zarówno Selenu, jak i Pięknej Zupy?

+0

Nigdy wcześniej nie używałam Selenium do parsowania HTML, ale BeautifulSoup jest dość solidny. To powiedziawszy, skoro już używasz Selenium do czegoś, czemu nie użyć go dla obu, dopóki nie wiesz, dlaczego potrzebujesz czegoś innego? – crowder

+0

@crowder tak, na razie robię wszystko z Selenium, ale użyłem BS wcześniej, więc chciałbym wiedzieć, który jest naprawdę najlepszy. Jeśli chodzi o parsowanie, myślę, że jest to trochę to samo, na przykład, z Selenium mamy driver.find_elements_by_class_name ("...") i z BS mamy soup.findAll ("...", {'class' : "...."}). Widziałem, że BS jest trochę wolna, co o tym myślisz? – elie

+0

@elie: Naprawdę chodzi o to, co próbujesz osiągnąć. Selenium jest zaprojektowane jako narzędzie do automatyzacji internetowej, jest to przesada, jeśli chcesz tylko parsować HTML. Jeśli potrzebujesz jakiejś interakcji ze stroną, użyj Selenium. –

Odpowiedz

32

Zanim odpowiemy na pytanie bezpośrednio, warto mówiąc jako punkt wyjścia: jeśli wszystko, co musisz zrobić, to wyciągnąć zawartość z statycznych stron HTML, powinieneś korzystać z biblioteki HTTP (np Requests lub wbudowanego urllib.request) z lxml lub BeautifulSoup, a nie Selen (choć Selenium będzie prawdopodobnie również odpowiednie). Zalety niepotrzebnego używania Selenu:

  • Przepustowość. Używanie Selenium oznacza pobieranie wszystkich zasobów, które normalnie byłyby pobierane podczas odwiedzania strony w przeglądarce - arkusze stylów, skrypty, obrazy i tak dalej. Jest to prawdopodobnie niepotrzebne.
  • Stabilność i łatwość odzyskiwania po błędzie. Selen może być trochę kruchy, z mojego doświadczenia - nawet z PhantomJS - i tworzenia architektury, która zabija zawieszoną instancję Selenium i tworzenia nowej, jest trochę bardziej irytujący niż ustawienie prostej logiki ponownej próby na wyjściu, gdy używasz requests.
  • Potencjalnie, użycie procesora i pamięci - w zależności od przeszukiwanej witryny i liczby wątków pajęczych, które próbujesz uruchomić równolegle, można sobie wyobrazić, że zarówno logika układu DOM, jak i wykonywanie skryptów JavaScript może być dość kosztowne.

Zauważ, że strona wymagające cookies do funkcji nie jest powodem, aby wyrwać się Selen - można łatwo utworzyć funkcję URL otwierającą że magicznie zbiorów i wysyła pliki cookie z żądań HTTP z wykorzystaniem cookielib/cookiejar.

OK, więc dlaczego mógłbyś rozważyć użycie Selenu? W dużym stopniu dotyczy to przypadku, w którym zawartość, którą chcesz zaindeksować, jest dodawana do strony za pomocą JavaScript, a nie upieczona w kodzie HTML. Nawet wtedy możesz uzyskać pożądane dane bez wyładowywania ciężkich maszyn. Zwykle ma zastosowanie jeden z następujących scenariuszy:

  • JavaScript obsługiwany wraz ze stroną zawiera już w niej treść. JavaScript jest właśnie po to, aby wykonywać szablony lub inne manipulacje DOM, które umieszczają treść na stronie. W takim przypadku możesz chcieć sprawdzić, czy istnieje prosty sposób na wyciągnięcie interesującej Cię treści bezpośrednio z JavaScript za pomocą wyrażeń regularnych.
  • JavaScript uruchamia web API, aby załadować zawartość. W takim przypadku rozważ, czy potrafisz zidentyfikować odpowiednie adresy URL interfejsu API i po prostu je samodzielnie; może to być znacznie prostsze i bardziej bezpośrednie niż faktyczne uruchamianie skryptu JavaScript i skracanie zawartości strony internetowej.

Jeśli zrobić zdecydować swoje zalety sytuacja użyciu selen, używać go z PhantomJS kierowcy, a nie, powiedzmy, sterownik domyślny Firefox.Spidering w sieci nie wymaga właściwie graficznego renderowania strony lub korzystania z jakichkolwiek specyficznych dla przeglądarki funkcji lub funkcji, dlatego przeglądarka bez głowy - z niższym kosztem procesora i pamięci oraz mniejszą ilością ruchomych części do zawieszenia lub zawieszenia - jest idealna.