Crearea de șabloane HTML folosind PHP. Analiza HTML și scraping folosind o bibliotecă HTML DOM simplă

În acest articol nu vă voi spune de ce sunt necesare site-uri web și ce fel de bani puteți câștiga cu ele. Aici am vrut doar să vorbesc despre diferențele dintre site-urile create folosind diferite instrumente.

Luați în considerare un site web HTML obișnuit

Pe de o parte, vom lua un site HTML obișnuit, care este în esență static. Mai simplu spus, există un anumit număr de pagini cu informații care sunt interconectate prin link-uri. De obicei nu sunt foarte multe pagini pe un astfel de site, deși există și excepții.


Și sunt puține pagini pe astfel de site-uri pentru că atunci când un astfel de site începe să crească, devine foarte incomod de administrat. Din acest motiv, o persoană fie încetează complet monitorizarea site-ului, fie încearcă să folosească un fel de sistem de management al conținutului (CMS). Există și oameni care încearcă să învețe limbaje de programare pentru WEB pentru a-și automatiza site-ul web și, prin urmare, mai ușor de administrat.

Dar, după cum arată experiența, doar câțiva fac față acestei sarcini, iar site-urile lor continuă să crească și să se dezvolte.

Dar toți ceilalți?

Unii navighează pe internet, alții încearcă să cumpere cărți de hârtie. Dar fără cunostinte de baza dispozitive ale unor astfel de limbaje de programare, fără a înțelege elementele de bază ale construirii site-ului web, astfel de încercări se termină de obicei cu nimic.

Pe de altă parte, să ne uităm la un site realizat folosind o combinație de HTML obișnuit și limbaj simplu programare pentru web - PHP.

Cea mai importantă diferență între acest site și cel anterior este că un astfel de site poate fi creat ca constructor din blocuri. Am făcut un antet de site - l-am plasat într-un fișier separat, am făcut un bloc din stânga cu navigare pe site - l-am plasat într-un fișier separat etc.

Ce ne oferă asta?

Îți oferă libertate. Acestea. Acum putem conecta aceste blocuri la framework-ul principal și chiar dacă în timp avem 10.000 de pagini pe site și trebuie brusc să schimbăm un element de navigare, atunci nu va fi nimic complicat. Deschis fișierul cu blocul necesar, editat si gata! În toate cele 10.000 de pagini, această schimbare s-a produs într-o clipă.

Pe lângă asta, toate Informatii utile(articole, descrieri de bunuri și servicii, lecții, note etc.) ale unui astfel de site pot fi stocate într-o bază de date, care oferă mai multe mai multe beneficii:

— Site-ul ocupă mai puțin spațiu;
— Simplificat backup date;
— Ușurează schimbarea oricăror date;
— Devine posibilă numărarea oricărei informații (de câte ori a fost vizualizată o pagină, a fost descărcat un fișier, au fost adăugate comentarii etc.);
— Puteți folosi multe scripturi PHP gata făcute pe site;
- etc.

HTML sau PHP

Dacă facem o analogie între site-urile HTML și PHP cu mașini, atunci cum mașini moderne au devenit mai confortabile, mai puternice, mai funcționale și în același timp au început să consume mai puțin combustibil decât omologii lor de acum 50 de ani, iar site-ul PHP a devenit mai ușor, mai funcțional, mai ușor de gestionat și mai mobil decât adversarul său HTML.

Din păcate, este imposibil să acoperiți pe deplin acest subiect în cadrul unui articol, dar cred că chiar și din punctele pe care le-am descris aici, veți putea trage o concluzie despre ce site este mai bine să creați pentru a ține pasul cu vremurile și obțineți un randament decent al investiției în eforturile de creare a site-ului.

Evgheni Popov– Autor al unui curs video de 22,5 ore „Toate momentele tehnice ale afacerii online în format video 2 sau PHP + MySQL pentru începători”, în care întregul proces este afișat direct pe ecranul computerului tău cu explicații vocale Crearea PHP site de la zero.

Veți învăța cum să obțineți o listă cu toate articolele publicate pe un site.

Pasul 1. Pregătire

În primul rând, trebuie să copiați biblioteca simpleHTMLdom, care este disponibil pe site

Arhiva de descărcare conține mai multe fișiere, dar aveți nevoie doar de unul simple_html_dom.php. Toate celelalte fișiere sunt exemple și documentație.

Pasul 2: Analizarea elementelor de bază

Această bibliotecă este foarte ușor de utilizat, dar există câteva lucruri de bază de învățat înainte de a o pune în funcțiune.

$html = new simple_html_dom();
// Încărcare din șir
$html->load("

Salut Lume!

");
// Incarca fisier
$html->load_file("http://net.tutsplus.com/");

Puteți crea un obiect sursă prin încărcare HTML fie dintr-un șir, fie dintr-un fișier. Încărcarea dintr-un fișier se poate face fie prin specificarea URL, sau din sistemul dvs. de fișiere local.

Note: Metoda load_file() delegații lucrează Funcții PHP file_get_contents. Dacă allow_url_fopen nesetat la valoare Adevăratîn dosarul dvs php.ini, atunci este posibil să nu puteți deschide fișiere șterse Prin urmare. În acest caz, puteți reveni la utilizarea bibliotecii CURL pentru a încărca pagini șterseși apoi citiți folosind metoda sarcină().

Accesul la informații

Odată ce aveți un obiect DOM, puteți începe să lucrați cu el folosind metoda găsi()și crearea colecțiilor. O colecție este un grup de obiecte găsite de un selector. Sintaxa este foarte asemănătoare cu jQuery.



Salut Lume!


Au fost aici.




ÎN în acest exemplu HTML vom afla cum să accesăm informațiile din al doilea paragraf, să le schimbăm și apoi să tipărim rezultatul acțiunilor.

1. # creați și încărcați HTML
2. include("simple_html_dom.php");
3. $html = new simple_html_dom();
4. $html->load(“

Salut Lume!

“);
5. # obține elementul care reprezintă al doilea paragraf
6. $element = $html->find(“p“);
7. # modifică-l
8. $element->innertext .= „ și noi”suntem aici pentru a rămâne.”;
9. # Ieșire!
10. echo $html->salvare();

Rândurile 2-4: Încărcați HTML dintr-un șir așa cum s-a explicat mai sus.

Linia 6: Găsiți toate etichetele

În HTML și returnați-le într-o matrice. Primul paragraf va avea indicele 0, iar paragrafele următoare vor fi indexate în mod corespunzător.

Linia 8: Accesăm al doilea element din colecția noastră de paragrafe (index 1), adăugând text la atributul său interior text. Atributul text interior reprezintă conținutul dintre etichete, iar atributul text exterior reprezintă conținutul, inclusiv etichetele. Putem înlocui complet eticheta folosind atributul exterior.

Acum să adăugăm o linie și să modificăm clasa de etichetă din al doilea paragraf.

$element->class = "nume_clasa";
echo $html->salvare();

HTML final după comanda de salvare va arăta astfel:



Salut Lume!


Suntem aici și suntem aici pentru a rămâne.



Alti selectori

Alte câteva exemple de selectoare. Dacă ați folosit jQuery, totul vă va părea familiar.

# obține primul element găsit cu id="foo"
$single = $html->find("#foo", 0);
# obțineți toate elementele cu clasa „foo”
$colecție = $html->find(".foo");
# obțineți toate etichetele de link de pe pagină
$colecție = $html->find("a");
# obțineți toate etichetele de link care se află în interiorul etichetei H1
$colecție = $html->find("h1 a");
# primiți totul etichete img cu title="himom"!}
$colecție = $html->find("img");

Primul exemplu necesită câteva explicații. Toate interogările returnează colecții în mod implicit, chiar și interogarea ID, care ar trebui să returneze doar un element. Cu toate acestea, prin specificarea celui de-al doilea parametru, spunem „întoarceți doar primul element din colecție”.

Înseamnă că $singur- un singur element, și nu o matrice de elemente cu un singur membru.

Exemplele rămase sunt destul de evidente.

Documentație

Documentația completă pentru bibliotecă este disponibilă la .

Pasul 3: Exemplu din lumea reală

Pentru a demonstra biblioteca în acțiune, vom scrie un script pentru a răzui conținutul site-ului net.tutsplus.com și a genera o listă de titluri și descrieri ale articolelor prezentate pe site....doar ca exemplu. Scrapingul este un truc web și nu trebuie folosit fără permisiunea proprietarului resursei.

Include("simple_html_dom.php");
$articole = array();
getArticles ("http://net.tutsplus.com/page/76/");

Să începem prin a conecta biblioteca și a apela funcția getArticles indicând pagina de la care dorim să începem analiza.

De asemenea, vom declara o matrice globală pentru a facilita colectarea tuturor informațiilor despre articole într-un singur loc. Înainte de a începe analiza, să aruncăm o privire la modul în care este descris articolul de pe site-ul web Nettuts+.



...


Titlu




Descriere



Acesta este formatul de bază al unei postări pe site, inclusiv comentariile. cod sursa. De ce sunt importante comentariile? Ele sunt numărate de parser ca noduri.

Pasul 4: Porniți funcția de analizare

funcția getArticles($page) (
$articole globale;
$html = new simple_html_dom();
$html->load_file($pagina);
// ... Mai departe...
}

Să începem cu anunțul matrice globală, creați un obiect nou simple_html_dom, apoi încărcați pagina pentru analizare. Această funcție va fi apelat recursiv, așa că îl setăm ca parametru URL pagini.

Pasul 5. Găsiți informațiile de care avem nevoie

1. $items = $html->find("div");
2. foreach($articole ca $post) (
3. # amintiți-vă să numărați comentariile ca noduri
4. $articole = array($post->children(3)->outertext,
5. $post->copii(6)->primul_copil()->text exterior);
6. }

Aceasta este esența funcției getArticles. Trebuie să analizăm mai în detaliu pentru a înțelege ce se întâmplă.

Linia 1: Creați o matrice de elemente - tag div cu clasa de previzualizare. Acum avem o colecție de articole salvate în $articole.

Linia 4: $post acum se referă la un singur div al clasei de previzualizare. Dacă ne uităm la HTML-ul original, putem vedea că al treilea element descendent este o etichetă H1, care conține titlul articolului. O luăm și ne însușim $articole.

Nu uitați să începeți de la 0 și să țineți cont de comentariile codului sursă atunci când determinați indexul de nod corect.

Linia 5: Al șaselea descendent $post- Acest

. Avem nevoie de textul descrierii din acesta, așa că folosim text exterior- eticheta de paragraf va fi inclusă în descriere. O singură intrare în matricea articole va arăta cam așa:

$articles = „Titlul articolului”;
$articles = „Aceasta este descrierea articolului meu“

Pasul 6, Lucrul cu Pagini

Primul pas este să determinați cum să găsiți pagina următoare. Pe site-ul Nettuts+ este foarte ușor să ghicim numărul paginii din URL, dar trebuie să obținem linkul în parsing.

Dacă te uiți la HTML, vei găsi următoarele:

»

Acesta este un link către pagina următoare și îl putem găsi cu ușurință după clasă „ nextpostslink’. Acum aceste informații pot fi folosite.

Dacă($next = $html->find("a", 0)) (
$URL = $next->href;
$html->clear();
unset($html);
getArticles($URL);
}

În prima linie verificăm dacă poate fi găsită o referință cu clasa nextpostslink. Observați utilizarea celui de-al doilea parametru în funcție găsi(). În acest fel indicăm că dorim să obținem primul element (index 0) din colecția returnată. $în continuare conține un singur element, nu o colecție.

Apoi atribuim Link HREF Variabila $URL. Acest lucru este important pentru că în continuare vom elimina obiectul HTML. Pentru a preveni scurgerea memoriei în php5, obiectul curent simple_html_dom trebuie să fie șters și dezactivat înainte de a putea fi creat un alt obiect. Dacă acest lucru nu se face, atunci toată memoria disponibilă poate fi consumată.

În cele din urmă, numim funcția getArticles cu adresa URL pagina următoare. Recursiunea se întrerupe atunci când nu mai sunt pagini de analizat.

Pasul 7. Produceți rezultatele

Mai întâi, vom instala câteva stiluri de bază. Totul este complet arbitrar - puteți instala ceea ce vă place.

#principal (
margine: 80px automat;
lățime: 500px;
}
h1 (
font:bold 40px/38px helvetica, verdana, sans-serif;
marja:0;
}
h1 a (
culoare:#600;
text-decor:niciuna;
}
p(
fundal: #ECECEC;
font:10px/14px verdana, sans-serif;
margine: 8px 0 15px;
chenar: 1px #CCC solid;
umplutură: 15px;
}
.articol(
umplutură: 10px;
}

Apoi scriem o mică funcție PHP pe pagină pentru a afișa informațiile salvate anterior.

foreach($articole ca $articol) (
ecou"

";
echo $item;
echo $item;
ecou"
";
}
?>

Rezultatul final este o singură pagină HTML care listează toate articolele din paginile Nettuts+, începând cu cea specificată în primul apel getArticles().

Pasul 8. Concluzie

Dacă începi să analizezi pentru cantitate mare pagini (să zicem, întregul site), atunci acest lucru poate dura mult timp. Pe un site precum Nettuts+, care are peste 86 de pagini, procesul de analizare poate dura mai mult de un minut.

Această lecție vă prezintă subiectul analizării HTML. Există și alte tehnici de manipulare DOM care vă permit să lucrați cu selectorul xpath pentru a găsi elemente. Biblioteca descrisă în acest tutorial este ușor de utilizat și excelentă pentru pornire rapidă. Nu uitați să cereți permisiunea înainte de a răzui un site.

În timp ce lucram la actualizările site-ului, am observat aspectul meu vechi când eram încă nou în PHP. Ținând cont de experiența acumulată, deficiențele vechii metode de layout sunt vizibile, atunci când HTML încadrează PHP și nu se află în interiorul acestuia.

Din păcate, încă nu am găsit nimic interesant pe acest subiect pentru a citi despre cum să-l aranjez cel mai bine. Cu toate acestea, uitându-mă la codul de aspect modern, am observat din ce în ce mai mult că html este aproape întotdeauna localizat în structurile php. Și există avantaje semnificative în acest sens.

Să ne uităm la avantajele de a avea HTML în PHP folosind exemplul de ieșire antet în WordPress.

Mai jos este designul din cod următorul tip: dacă există date într-un anumit câmp personalizat, atunci afișăm un antet cu aceste date. Am luat codul de aspect în forma sa originală, așa cum era înainte. Arăta așa:

< ! -- Title -- >

< h3 class = "archive-entry-title" itemprop = "name" > < a href = " " rel = "marcaj" title = " !}" > ID , "nume_rus" , adevărat ) ) : ?>ID, „nume_rus”, adevărat); ?> < / a > < / h3 >

< ! -- Title End -- >

Există mai multe dezavantaje la acest design de cod. În primul rând, nu este vizual - totul este scris într-o singură linie. Acest lucru a fost făcut intenționat, astfel încât să nu existe spații goale între etichetele H1, H2, H3. La urma urmei, nu este nimic bun în a avea spații în etichetele de titlu. Este imposibil de prezis cum în acest caz, printre motoarele de căutare, acest lucru va afecta site-ul. Va fi acolo spatii suplimentare reduce sau nu puterea titlului. Având în vedere că nu există răspunsuri la o astfel de întrebare, ar trebui să presupunem ce este mai rău. Și de aceea scrieți împreună.

În caz contrar, în continuarea celor spuse, dacă facem vizual codul de mai sus:

< ! -- Title -- >

< h3 class = "archive-entry-title" itemprop = "name" >

< a href = " " rel = "marcaj" title = " !}" >

ID , "nume_rus" , adevărat ) ) : ?>

ID, „nume_rus”, adevărat); ?>

< / a >

< / h3 >

< ! -- Title End -- >

Apoi, când vizionați în browser HTML din codul paginii din antetul etichetelor h3 vom vedea următoarele:

De asemenea, avem nevoie ca codul să fie ușor de citit atunci când edităm și apoi va fi afișat fără probleme la încărcarea site-ului. Și anume, astfel încât să arate așa:

Pentru a face acest lucru, ar trebui să utilizați PHP și să împachetați întregul cod htmlîn ea. Și obținem următoarele vizualizare php Cod antet WordPress:

< ! -- Title -- >

Unul dintre principalele avantaje PHP este modul în care funcționează cu formularele HTML. Principalul lucru aici este că fiecare element de formular devine automat disponibil pentru programele dumneavoastră PHP. Pentru informatii detaliate Pentru informații despre utilizarea formularelor în PHP, citiți secțiunea. Iată un exemplu de formular HTML:

Exemplul #1 Cel mai simplu formular HTML

Numele dumneavoastră:

Vârsta ta:

Nu este nimic special în această formă. Acest forma regulata HTML fără etichete speciale. Când utilizatorul completează formularul și face clic pe butonul de trimitere, pagina action.php va fi apelată. Acest fișier ar putea avea ceva de genul:

Exemplul #2 Afișarea datelor din formular

Buna ziua, .
Pentru tineani.

Exemplu de ieșire a acestui program:

Bună, Serghei. Ai 30 de ani.

Dacă nu iei în calcul bucățile de cod cu htmlspecialchars()Și (int), principiul de funcționare al acestui cod ar trebui să fie simplu și de înțeles. htmlspecialchars() prevede codificare corectă caractere HTML „speciale”, astfel încât HTML sau Javascript rău intenționat să nu fie inserat în pagina dvs. Câmpul de vârstă, despre care știm că ar trebui să fie un număr, pur și simplu îl putem converti întreg, care va scăpa automat de caracterele nedorite. PHP poate face acest lucru automat folosind extensia de filtru. Variabilele $_POST["nume"] și $_POST["vârstă"] sunt setate automat pentru dvs. de PHP. Anterior am folosit variabila superglobală $_SERVER, dar aici folosim și variabila superglobală $_POST, care conține toate datele POST. observa asta metoda de trimitere(metoda) din formularul nostru este POST. Dacă am folosi metoda OBȚINE, atunci informațiile din formular ar fi în variabila superglobală $_GET . Alternativ, puteți utiliza variabila $_REQUEST dacă sursa de date nu contează. Această variabilă conține un amestec de date GET, POST, COOKIE.

acum 15 ani

Conform specificației HTTP, ar trebui să utilizați metoda POST atunci când utilizați formularul pentru a schimba starea ceva la capătul serverului. De exemplu, dacă o pagină are un formular care să permită utilizatorilor să-și adauge propriile comentarii, ca acesta aici, formularul ar trebui să utilizeze POST. Dacă faceți clic pe „Reîncărcare” sau „Actualizați” pe o pagină la care ați accesat printr-un POST, este aproape întotdeauna o eroare -- nu ar trebui să postați același comentariu de două ori -- motiv pentru care aceste pagini nu sunt marcate sau stocate în cache.

Ar trebui să utilizați metoda GET atunci când formularul dvs. scoate ceva de pe server și nu schimbă nimic. De exemplu, formularul pentru un motor de căutare ar trebui să folosească GET, deoarece căutarea într-un site Web nu ar trebui să schimbe nimic care i-ar putea interesa clientului, iar marcarea sau stocarea în cache a rezultatelor unei interogări din motorul de căutare este la fel de utilă ca marcarea sau stocarea în cache. o pagină HTML statică.

1 an in urma

Merita clarificat:

POST nu este mai sigur decât GET.

Motivele pentru care alegeți GET vs POST implică diverși factori, cum ar fi intenția solicitării („trimiteți” informații?), dimensiunea cererii (există limite pentru cât de lungă poate fi o adresă URL și parametrii GET sunt trimiși în URL-ul) și cât de ușor doriți ca acțiunea să poată fi partajată -- De exemplu, Căutările Google sunt GET deoarece facilitează copierea și partajarea interogării de căutare cu altcineva, pur și simplu partajând adresa URL.

Securitatea este doar o considerație aici, datorită faptului că un GET este mai ușor de partajat decât un POST. Exemplu: nu doriți să fie trimisă o parolă de către GET, deoarece utilizatorul ar putea împărtăși adresa URL rezultată și își poate expune din neatenție parola.

Cu toate acestea, un GET și un POST sunt la fel de ușor de interceptat de către o persoană rău intenționată bine plasată dacă nu implementați TLS/SSL pentru a proteja conexiunea la rețea în sine.

Toate formularele trimise prin HTTP (de obicei portul 80) sunt nesigure, iar astăzi (2017), nu există multe motive întemeiate pentru ca un site web public să nu folosească HTTPS (care este în esență HTTP + Transport Layer Security).

Ca bonus, dacă utilizați TLS, minimizați riscul ca utilizatorii să primească cod (AD-uri) injectat în traficul dvs. care nu a fost introdus acolo de dvs.

  • Serghei Savenkov

    un fel de recenzie „scurtă”... de parcă s-ar grăbi undeva