Scrapování webu
DOM (Document Object Model)
- API pro práci s HTML a XML dokumenty
- Slouží k
- vytváření dokumentů
- navigaci v jejich struktuře
- přidávání, upravování a mazání elementů a obsahu
- https://www.w3.org/TR/WD-DOM/introduction.html
- MDN o DOM:
- XPATH:
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
- Dotazovací jazyk pro vybírání nodů v XML (a také HTML) dokumentech
- Lze použít místo CSS selektorů
- Xpath cheatsheet
- Xpather
Symfony BrowserKit
- PHP knihovna na scrapování webu
- https://symfony.com/doc/current/components/browser_kit.html
Instalace pomocí composeru
$ composer require symfony/browser-kit symfony/http-client symfony/css-selector
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
- Symfony BrowserKit používá DomCrawler pro navigaci v DOM