Jdi na navigaci předmětu

Scrapování webu

DOM (Document Object Model)

CSS Selektory

  • Pravidla a vzory pomocí kterých lze vybírat elementy v DOM
  • Používají se ke specifikování elementů, na které se mají aplikovat CSS pravidla
  • Lze je využít při scrapování pro vybírání elementů, ze kterých potřebujeme získat obsah

Type selector

  • Vybere všechny elementy daného typu
input
<form>
    <p>
        <label>Name</label>
        <input type="text" name="name">
    </p>
    <p>
        <label>E-mail</label>
        <input type="email" name="email">
    </p>
</form>

Class selector

  • Vybere všechny elementy s danou třídou
.text
<div>
    <p class="text">Lorem ipsum</p>
    <span>dolor</span>
    <div class="text">amet.</div>
</div>

ID selector

  • Vybere element podle id atributu
  • V dokumentu by neměl být víc než jeden element se stejným ID
#container
<div class="page">
    <div id="container">
        ...
    </div>
</div>

Universal selector

  • Vybere všechny elementy
  • Hodí se při kombinování selektorů
*
<p>
    <a href="#">Link</a>
    <ul>
        <li>...</li>
    </ul>
</p>

Attribute selector

  • Vybere všechny elementy s daným atributem
[required]
<form>
    <p>
        <label>Name</label>
        <input type="text" name="name" required>
    </p>
    <p>
        <label>Comment</label>
        <textarea name="comment" required></textarea>
    </p>
</form>

Attribute selector - varianty

  • Atribut má danou hodnotu

    [attribute="value"]
  • Hodnota atributu obsahuje dané slovo

    [attribute~="value"]
  • Hodnota atributu začíná danou hodnotou (celá slova)

    [attribute|="value"]
  • Hodnota atributu začíná danou hodntou

    [attribute^="value"]
  • Hodnota atributu končí danou hodnotou

    [attribute$="value"]
  • Hodnota atributu obsahuje danou hodnotu

    [attribute*="value"]

Descendant combinator

  • Vybere všechny potomky odpovídající druhému selektoru, kteří jsou potomky prvního
.content p
<body>
    <p>...</p>
    <div class="content">
        <p>...</p>
        <div>
            <p>...</p>
        </div>
        <p>...</p>
    </div>
</body>

Child combinator

  • Vybere všechny přímé potomky
.content > p
<body>
    <p>...</p>
    <div class="content">
        <p>...</p>
        <div>
            <p>...</p>
        </div>
        <p>...</p>
    </div>
</body>

Adjacent sibling combinator

  • Vybere následujícího sourozence odpovídajícího druhému selektoru, který následuje bezprostředně po prvním
h2 + p
<body>
    <h2>Heading</h2>
    <p>First paragraph</p>
    <p>Second paragraph</p>
    <p>Third paragraph</p>
</body>

General sibling combinator

  • Vybere všechny sourozence odpovídajícího druhému selektoru, které následují po prvním
h2 ~ p
<body>
    <h2>Heading</h2>
    <p>First paragraph</p>
    <p>Second paragraph</p>
    <p>Third paragraph</p>
</body>

First, last, nth child

  • Výběr prvního (:first-child), posledního (:last-child) nebo n-tého (:nth-child(n)) elementu
div p:nth-child(2)
<div>
    <p>First paragraph</p>
    <p>Second paragraph</p>
    <p>Third paragraph</p>
</div>

XPath

Symfony BrowserKit

Vytvoření klienta a otevření stránky

use Symfony\Component\BrowserKit\HttpBrowser;

$client = new HttpBrowser();
$crawler = $client->request('GET', 'https://www.symfony.com/blog/');

Získávání dat

use Symfony\Component\DomCrawler\Crawler;

$crawler->filter('h2 > a')->each(function (Crawler $node) {
    print $node->text()."\n";
});

Příklad

  • Získání jmen a telefonních čísel zaměstnanců FIT
<?php

use Symfony\Component\BrowserKit\HttpBrowser;
use Symfony\Component\DomCrawler\Crawler;

require_once __DIR__ . '/vendor/autoload.php';

$client = new HttpBrowser();

$crawler = $client->request('GET', 'https://fit.cvut.cz/cs/studium/informacni-servis/studijni-oddeleni');

$crawler->filter('.contact')->each(function (Crawler $profile) {
    $name = $profile->filter('.contact-name')->text();
    $phone = $profile->filter('ul.contact-list li:nth-child(1)')->text();

    echo "$name - $phone\n";
});

DomCrawler