Web crawlerek 2.

Ahogy azt már egy Facebook bejegyzésemben írtam, rátaláltam a Selenium WebDriverre, ami egy nagyon jó eszköz az adatok levadászását végző crawlerek elkészítésére is. Alapvetően nem erre készül, hanem a tesztelési feladatok automatizálására és feldolgozására, de ahogy azt a Quora-n feltett kérdésemre válaszolták, kiváló az én céljaimra is.

Mi az a Selenium?

A Selenium egy nyílt forráskódú, ingyenes automatizált tesztkörnyezet, mellyel webes alkalmazásokat lehet tesztelni a különféle böngészők és platformok alatt. A Selenium scriptek sokféle programnyelven elkészíthetők, én a Java-t használom, de nagyon sok script található a neten Python vagy C# nyelven írva is.

A Selenium Software nem csak egy eszközt jelent, hanem egy teljes csomagot, melyek a tesztfolyamatok különféle fázisait támogatják.

A Selenium RC-ből és a Selenium WebDriver egyesítéséből született meg a Selenium 2 framework.

A Seleniumot egy Jason Huggins nevű programozó készítette el 2004-ben, aki webes alkalmazások fejlesztésén dolgozott, és ezeket folyamatosan tesztelni kellett. Ezek folyamatos elvégzése nem volt elég hatékony, ezért lekódolta a JavaScriptTestRunner nevű programot a böngészőfolyamatok vezérlésére. Mivel ez jól működött, ezért nyílt forráskódúvá tette, és később átnevezték Seleniumra. A nevét programozói humorként kapta, mivel a kifejlesztésekor már volt egy versenytárs tesztelőkörnyezet a piacon, amit a Mercury Interactive készített (mercury = higany). Mivel a szelén (szelén = selenium) a higanymérgezés kezelésére is használatos, így a fejlesztőcsoport felvette ezt a nevet a projekthez.

Selenium IDE

A Selenium IDE a Selenium framework legegyszerűbb tagja, Firefox bővítményként érhető el. Teszt prototípusok felállítására szolgál, nem támogatja a feltételeket vagy az iterációt. A teszt lefuttatása lassabb a csomag többi tagjához képest, de nagyon könnyű telepíteni a Firefox segítségével, és nem szükséges hozzá programozói tapasztalat.

Selenium RC (Selenium Remote Control)

A Selenium RC volt a Selenium framework legfontosabb tagja, mivel lehetővé tette a programozóknak, hogy olyan nyelven írják meg a teszteket, amelyet szeretnek. A már említett Java, Python és C# mellett használható a PHP, a Perl és a Ruby is.

Hátránya, hogy nehezebb telepíteni, mint az IDE-t, programozói tudás kell hozzá, Selenium RC Server szükséges a futtatásához, és lassabb, mint a WebDriver. Előnye a böngésző- és platformfüggetlenség, hogy használhatók feltételek és ciklusok, támogatja az adatvezérelt tesztelést, teljeskörű API-val rendelkezik és gyorsabb az IDE-nél.

Selenium WebDriver

A Selenium WebDriver számos nézőpont alapján jobb választás, mint az IDE vagy az RC. Modern megközelítést használ a böngészőműveletek automatizálására. Nem a JavaScript automatizálásra támaszkodik, hanem közvetlenül a böngészőt vezérli, és így kommunikál vele.

Ugyanazokat a programozási nyelveket támogatja, mint a Selenium RC: Java, C#, PHP, Python, Perl, Ruby. Hátránya, hogy ehhez is szükséges programozói készség, és nem rendelkezik beépített eszközzel a futtatás közbeni válaszok naplózására vagy a teszteredmények legenerálására. A legnagyobb előnye a fentieken kívül, hogy nem kell hozzá külön összetevő, mint az RC Server, és ez a leggyorsabb a három termék közül.

Selenium Grid

A Selenium Grid a Selenium RC-hez készült párhuzamos tesztek elvégzésére, melyek egyszerre futhatnak le különböző gépeken és böngészőkön. Ezzel idő spórolható meg, és szimultán tesztek készíthetők sokféle eszközre. Mindig van egy hub-ja, mely kiadja a Selenium parancsokat, és ehhez kapcsolódnak a teszt node-jai.

Selenium a web crawlerek elkészítéséhez

Én a Selenium WebDriver-t használom a crwalerek elkészítéséhez, a fentiekből már világos, hogy miért. Gyors, nem kell hozzá külön komponens, és közvetlenül kommunikál a böngészővel. Mostanában Maven projekteket hozok létre, melynél a függőségek közé beteszem a Selenium összetevőket, és a projekt futtatásakor azok automatikusan letöltődnek a Maven repository-ból.

Az első, saját kis crawleremet már el is készítettem vele, ezt meg is mutatom:

package com.viktorjava.seleniumcrawler;

import java.util.List;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class Crawler {
   public static void main(String[] args) {
   String url = "ide jon az url";
        
   WebDriver driver = new ChromeDriver();
   SaveToDatabase toDatabase = new SaveToDatabase();
        
   driver.get(url);
        
   WebElement table = driver.findElement(By.tagName("table"));
        
   List<WebElement> lines = table.findElements(By.tagName("tr"));
   int i = 0;
   int j = 0;
   String[] elemek = new String[16];
        
   for (WebElement line : lines) {
      if (j != 0) {
         List<WebElement> tags = line.findElements(By.tagName("td"));
         i = 0;
         for (WebElement tag : tags) {
            elemek[i] = tag.getText();
            i++;
         }
         toDatabase.insert(elemek);
      }
      j++;
   }
        
   toDatabase.closeConnection();
   driver.quit();
        
   }
}

Az egyik weboldal számokat tartalmazó oldalát dolgoztam fel a crawler segítségével. Chrome böngésző segítségével töltöttem le az adatokat, ezért egy ChromeDriver-t használtam fel.

A Selenium használata jól nyomon követhető, egy table WebElement-be mentette az adatokat, ahol a forráskódban megtalálta a table HTML tag-et.

Ezután egy WebElement-eket tartalmazó lines listába tette a táblázatból azokat az elemeket, melyeket a tr HTML tag-gel azonosított, azaz a táblázat sorait.

Ezután végig mentem a listán, és megkerestem a td HTML tag-eket, ezek a táblázat cellái. Mivel tudtam, hogy 16 cella van egy sorban, ezért azokat elmentettem egy 16 elemű tömbbe.

A tömböt átadtam a toDatabase objemktumnak, amely gondoskodik a megkapott tömb feldolgozásáról és adatbázisba mentéséről. Ezt már nem mutatom meg, mert nem jelent újdonságot.

Még a Maven projekt pom.xml-jét beillesztem ide, hogy milyen jó dolog a Maven is.

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.viktorjava</groupId>
    <artifactId>Hostessen</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <dependencies>
		<dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.141.59</version>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-chrome-driver</artifactId>
            <version>3.141.59</version>
        </dependency>
		<dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava-io</artifactId>
            <version>r03</version>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.20</version>
        </dependency>
    </dependencies>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
</project>

A selenium-java és a selenium-chrome-driver az gondolom érthető, a guava-io a Google Guava fájlkezeléssel foglalkozó könyvtára, ezzel könnyebbek a fájlműveletek, a mysql-connector-java pedig a mysql adatbázis kezeléséhez szükséges.

A Maven-t a StudiCore Maven tanfolyamán ismertem meg, a Google Guava-ról meg volt már korábban szó a StudiCore Java SE képzésén (41 fejezet).

Frissítés: A jogi szabályozás pontatlanságai miatt eltávolítottam a projekt URL címét, így most egy általánosságban elképzelt weboldal felhasználásáról volt szó.