Newsgroup: it.comp.www.php
Titolo: scrape google

 da internet ho scaricato uno script che promette di prelevare i 
risultati di Google e di salvarli in un file.  solo che lanciando lo 
sembra non prelevare alcun risultato qualcuno mi può dire il motivo 
allego lo script:
 
<?php
include('simple_html_dom.php');
error_reporting(0);
function strip_tags_content($text, $tags = '', $invert = FALSE) {
	$text = str_ireplace('<br>', '', $text);
	preg_match_all('/<(.+?)[\s]*\/?[\s]*>/si', trim($tags), $tags);
	$tags = array_unique($tags[1]);
	if(is_array($tags) AND count($tags) > 0) {
		if($invert == FALSE) {
			return preg_replace('@<(?!(?:'. implode('|', 
$tags) .')\b)(\w+)\b.*?>.*?</\1>@si', '', $text);
		} else {
			return preg_replace('@<('. implode('|', 
$tags) .')\b.*?>.*?</\1>@si', '', $text);
		}
	} elseif($invert == FALSE) {
		return preg_replace('@<(\w+)\b.*?>.*?</\1>@si', '', 
$text);
	}
	return $text;
}
 
// inizio configurazione
global $keyword; global $num; global $lingua;
// $keyword può essere una variabile singola o un array in base alle 
esigenze
// $num è il numero di risultati prelevati per ogni keyword
// $lingua è la lingua in cui Google deve cercare
$keyword = array("italia","spagna","marocco");
$num = 20;
$lingua = 'it';
// fine configurazione
function estrapolazione($key) {
	$q = urlencode(str_replace(' ', '+', $key));
	$r = '';
	global $keyword; global $num; global $lingua;
	if($num > 10) {
		$r = "&num=$num";
	}
	$data = file_get_html('
http://www.google.com/search
?
hl=' .$lingua . '&q='.$q.$r);
	$html = str_get_html($data);
 
	$ris = array();
 
 
	foreach($html->find('li.g') as $g) {
		$h3 = $g->find('h3.r', 0);
		$s = $g->find('div.s', 0);
		if($h3 != ""){
			$a = $h3->find('a', 0);
		}
		$ris[] = array('title' => strip_tags($a->innertext), 
			'link' => $a->href, 
			'description' => strip_tags($s->innertext));
 
 
	}
	return $ris;
}
if($keyword) {
	if(is_array($keyword)) {
		$risultati = array();
		foreach($keyword as $k) {
			$test = estrapolazione($k);
			$risultati = array_merge($risultati,$test);
		}
	}
	else {
		$risultati = estrapolazione($keyword);
	}
}
// inizio output
foreach($risultati as $r) {
	$riga = '"' . $r["title"] . '","' . $r["description"] . "\"\n"; 
	file_put_contents( "risultati.csv",$riga,FILE_APPEND);
print $riga;
}
// fine output
$html->clear(); exit();
?>
 

sembra non prelevare alcun risultato qualcuno mi può dire il motivo
 
Posso fare una ipotesi.
 
Se io fossi una grande azienda che non solo ha un enorme motore di ricerca, ma
fornisce anche (per grossi volumi, pagando) i risultati del medesimo motore, e
impiegassi decinaia e decinaia di sviluppatori e statistici per tener dietro a
ogni singolo accesso a quelle API...
 
a) L'esistenza di uno script automatico che di fatto bypassa i miei sistemi di
   accounting, __A ME__, darebbe fastidio. Forse a Google non ne dà.
 
b) Parecchi dei miei sviluppatori sarebbero "incoraggiati" a "trovare de' modi
   ben scaltri" (cit.) perché script di quel genere "malfunzionino". E a dirti
   la verità, fare malfunzionare lo script è l'opzione da galantuomini; io, la
   tentazione di restituire risultati "very very custom", ce l'avrei.
 
TL;DR: è probabile che quello script faccia affidamento su una struttura dati,
nel codice di Google, che nel frattempo è cambiata. Potresti provare a fare le
necessarie modifiche allo script, ma c'è il rischio che Google ti cambi più in
fretta di quanto tu non riesca a stargli dietro.
 
Leonardo
-- 
 
A terrible beauty is born.
                                     - W. B. Yeats, Easter 1916

 ha scritto:

 avevo pensato una cosa del genere ma sembra che non preleva nessuno dei 
tre campi e cioè nel link né titolo né descrizione,  secondo te sono 
queste le righe di codice da modificare osservando i nuovi risultati di 
ricerca che restituisce Google​


 
 
Fare scraping va contro i loro terms of service.
Dopo poco bloccano il tuo IP, e se insisti possono bure metterci un ban.
 
Ciao!

foreach($html->find('li.g') as $g) {
 
e poi l'unica è sperimentare, e ricontrollare ogni giorno tenendosi pronti
per quando smetterà di funzionare di nuovo.


>foreach($html->find('li.g') as $g) {
 
 
Io comincerei dal fatto che un dowload liscio con curl/file_get_contents/
eccetera non restituisce neanche una riga  di html. È tutto javascript, 
che solo in un secondo momento genera i risultati.
Evidentemente a google del seo e di essere indicizzato frega il giusto :O
 
A parte gli scherzi, anni fa (non mille, una cosa tipo 5 o 6 ) feci un 
robottino che funzionava perfettamente, bastava richiedere  le pagine dopo 
la prima ad intervalli di tempo irregolari e non troppo piccoli.
Giusto un mesetto fa mi serviva una stupidaggine, ma su un insieme 
abbastanza vasto di siti (circa 200), stupidaggine che non era 
disponibile tramite chiamate alle API. Ho quindi riesumato, anzi tentato 
di riesumare il robottino: niente da fare. 
Ho provato a fare un robottino più furbo che interpreta (o almeno dice di 
farlo) il javascript con phantomjs, ma anche lì c'erano problemi. Il 
tempo era poco ed ho quindi lasciato perdere in favore del sempre ottimo 
olio di gomito.
 
 
 
 
 
 
 

Evidentemente a google del seo e di essere indicizzato frega il giusto :O
 
Eh be'. Li capisco, pure.
