Headless Selenium oraz PhantomJS w Python

Selenium to narzędzie przeznaczone do testów automatycznych stron WWW, można z niego korzystać w wielu językach przy pomocy dedykowanych bibliotek. W tym mini poradniku pokażę jak zainstalować i korzystać z Selenium z silnikiem PhantomJS  w trybie headless (bez otwierania gui przeglądarki) w pythonie.

0x01 - Instalacja

Instalacja na systemie Debian/Ubuntu jest prosta i sprowadza się do kilku komend:

#!/bin/bash

# Aktualizujemy listę pakietów
sudo apt-get update

# Instalujemy python i pip
sudo apt-get install python3 python3-pip

# Instalujemy bibliotekę Selenium dla pythona
sudo pip install selenium

# Instalujemy wymagane pakiety dla PhantomJS 
sudo apt-get install build-essential chrpath libssl-dev libxft-dev

sudo apt-get install libfreetype6 libfreetype6-dev
sudo apt-get install libfontconfig1 libfontconfig1-dev

# Pobieramy i rozpakowujemy PhantomJS
cd ~
export PHANTOM_JS="phantomjs-2.1.1-linux-x86_64"
wget https://bitbucket.org/ariya/phantomjs/downloads/$PHANTOM_JS.tar.bz2
sudo tar xvjf $PHANTOM_JS.tar.bz2

# Kopiujemy binarke do właściwego katalogu
sudo mv $PHANTOM_JS /usr/local/share
sudo ln -sf /usr/local/share/$PHANTOM_JS/bin/phantomjs /usr/local/bin

# Sprawdzamy czy jest OK
phantomjs --version

Skrypt instalacyjny i przykłady zamieszczę na moim github'ie.

0x02 - Zabawa

Kiedy mamy już wszystko gotowe możemy rozpocząć zabawę, mamy bardzo wiele możliwości możemy min. obsługiwać formularze, klikać w linki etc.

Poniżej przykładowy skrypt, mi służył do pobierania pliku video ze strony:

from selenium import webdriver
import time
import urllib.request

def get_url(url):
	# Inicjalizujmey selenium z silnikiem PhantomJS
	driver = webdriver.PhantomJS()

	# Ustawiamy rozdzielczość - opcjonlanie potrzebne do screenshotów
	driver.set_window_size(1024, 768)

	# Wczytujemy podany adres URL
	driver.get(url)

	# Czekamy kilka sekund na załadowanie strony
	time.sleep(5)

	try:
		# Znajdujemy element na stronie przez XPATH i klikamy
		driver.find_element_by_xpath("//*[@id='player']/div[5]/div").click()
		
		# Znów czekamy na załadowanie np. AJAX
		time.sleep(5)

		# Wyszukujemy elemnt, kopiujemy atrybut etc.
		src = driver.find_element_by_xpath("//*[@id='player']/video[1]").get_attribute("src")
	
		return src

	except Exception:
		debug(driver)
		driver.close()
		return False

	# Zamykamy połącznie
	driver.close()

	return src

def debug(driver):
	# Zapisujemy screenschot
	driver.save_screenshot('screenshot.png');

	# Zapisujemy HTML do pliku
	page = driver.page_source
	file_ = open('page.html', 'w')
	file_.write(page)
	file_.close()


# Wykonujemy
url = get_url("http://...")
if url != False:
	print(url)
else:
	print("Błąd!")

0x03 - Podsumowanie

Selenium może przydać się nie tylko do testów ale też do automatyzacji częstych czynności w sieci czy scrapowania stron internetowych korzystających z AJAX czy zabezpieczanych przed takimi praktykami. Warto się pobawić tym narzędziem jeśli znajdziecie trochę czasu 🙂

Jedyny problem jaki znalazłem to obsługa websockets w PhantomJS, jeśli ktoś zna rozwiązanie tego problemu będę wdzięczny za komentarz.

Makulatura

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *