Caută în DOM divurile care au o anumită clasă folosind PHP

Vreau să scriu o funcție care numără de câte ori un articol a fost shareuit pe Google Plus (nu +1) . Pentru a scrie funcția mă folosesc doar de PHP, fără alte dependințe deoarece aceasta va fi inclusă într-un script care este rulat cu un cronjob, zilnic, pe un site de Wordpress.

function gs($url) {
	$saveHTML = file_get_contents("https://plus.google.com/s/" . urlencode($url));
	$dom = new DOMDocument();
	libxml_use_internal_errors(true);
	$dom->loadHTML($saveHTML);
	libxml_clear_errors();
	$xpath = new DOMXpath($dom);
	$class = 'ELUvyf';
	$elements = $xpath->query("//*[contains(@class, '{$class}')]");

	return $elements->length;
}

echo '<pre>';
var_dump(gs('https://dexonline.ro/'));

Rezultatul ar trebui să fie >=1 deoarece am shareuit linkul și la mine pe profil. Nu-mi dau seama ce fac greșit. Am incercat și cu curl dar fără succes.

E mult mai complicat sa accesezi o pagina web si sa o scrape-uiesti decat un simplu GET, mai ales una atat de dinamica cum este cea de Google Plus.

In principiu o sa primesti inapoi o pagina web initiala, dar care trebuie executata pentru a obtine exact ce vrei. Sunt multe scripturi care ruleaza pe pagina, multe date care mai trebuiesc fetch-uite etc. Chiar daca pagina e randata de catre Google intr-o oarecare masura, pentru performanta, nu o sa fie “gata” doar dupa un GET.

Apoi, un simplu request n-o sa contina toate datele necesare. De exemplu un “http get https://plus.google.com” din linia de comanda intoarce 302 Not Found. Requestul nu arata ca unul normal dintr-un browser, asa ca Google il respinge. Nu stiu cum merge file_get_contents, dar presupun ca nu e facut pentru scraping dásta.

O prima solutie e sa incarci pagina intr-un headless browser, si sa scrape-uiesti prin el. Sunt framework-uri pentru testare de apllcatii web precum selenium care ajuta cu treaba asta, oferindu-ti un API de interactiune cu pagina. Dar e o dependinta destul de mare, avand in vedere constrangerile pe care le-ai dat mai sus.

O a doua solutie e sa vezi de vre-un API al Google pentru a afla informatia asta. Sigur trebuie sa fie ceva pe partea de analytics. Un API general exista. Dar e un dans mai complicat.

2 Likes