files

Помогите: PHP парсер выдачи Google

10 сообщений в этой теме

Вопрос к знатокам парсеров: у кого есть рабочий парсер выдачи Google или кто сможет дополнить существующий?

Парсер на PHP должен выдернуть из выдачи: Название (Титле), Урл и снипет (описание).

 

Рабочий пример, выдергивающий лишь урлы (регулярки к Титле и снипету не получается подобрать).

В примере - выдергиваются 10 проиндексированных урлов страниц сайта yandex.ru

<?
 $url = "https://www.google.ru/search?num=10&q=site:yandex.ru";
 $ch = curl_init();
 curl_setopt($ch, CURLOPT_URL,$url);
 curl_setopt($ch, CURLOPT_USERAGENT, "");
 curl_setopt($ch, CURLOPT_FAILONERROR, 1);
 curl_setopt($ch, CURLOPT_HEADER, 0);
 curl_setopt($ch, CURLOPT_REFERER, "http://www.google.ru/"); 
 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
 curl_setopt($ch, CURLOPT_TIMEOUT, 30);

 curl_setopt($ch, CURLOPT_POST, 0);

$data = curl_exec($ch);
preg_match_all("/<cite>(.+?)<\/cite>/is",$data,$matches); //получаем 10 ссылок в массиве, а нужно получить и Заголовок и Сниппет
$result = $matches[1];
print_r($result); //выводим результат
 ?>

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

А не проще использовать API?

<?
$url = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=site:yandex.ru';
$body = file_get_contents($url);
$json = json_decode($body);

foreach ($json->responseData->results as $resultjson) {
$result_google['urls']= $resultjson->url;
$result_google['titles']= $resultjson->title;
$result_google['contents'] = $resultjson->content;

print_r ($result_google);
}
?>

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
<?
	$url = "https://www.google.ru/search?num=10&q=site:www.nato.int";
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL,$url);
	curl_setopt($ch, CURLOPT_USERAGENT, "");
	curl_setopt($ch, CURLOPT_FAILONERROR, 1);
	curl_setopt($ch, CURLOPT_HEADER, 0);
	curl_setopt($ch, CURLOPT_REFERER, "http://www.google.ru/"); 
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
	curl_setopt($ch, CURLOPT_TIMEOUT, 30);

	curl_setopt($ch, CURLOPT_POST, 0);

	$data_url = $data_title = $data_description = curl_exec($ch);
	preg_match_all("/<cite>(.+?)<\/cite>/is",$data_url,$matches_url); 
	preg_match_all('/<h3 class="r">(.+?)<\/h3>/is',$data_title,$matches_title);
	preg_match_all('/<span class="st">(.+?)<\/span>/is',$data_description,$matches_description);
	
	$text_title = implode("[space]", $matches_title[0]);
	$text_title = strip_tags($text_title);
	$text_title_array = explode("[space]", $text_title);
	
	
	$description = implode("[space]",$matches_description[0]);
	$description = strip_tags($description);
	$description_array = explode("[space]", $description);
	
	$url_array = $matches_url[1];
	
	$final_array['titles'] = $text_title_array;
	$final_array['urls'] = $url_array;
	$final_array['descriptions'] = $description_array;
 
?>
 
<pre>
	<?php print_r($final_array); ?>
</pre> 

Результаты - http://pinkevych.ru/googleparser/

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

На самом деле есть много способов (адекватных) как парсить это дело. Один из них API. Но если по каким либо причинам нужно именно так как начиналась тема - код выше)

files понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@pinchoalex, если я не ошибаюсь, то при использовании API на IP сервера не "ставятся" ограничения, а при вашем коде таковые имеются. Вообщем это два рабочих варианта и что будет использоваться тс ему решать  :)

pinchoalex понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@pinchoalex, если я не ошибаюсь, то при использовании API на IP сервера не "ставятся" ограничения, а при вашем коде таковые имеются. Вообщем это два рабочих варианта и что будет использоваться тс ему решать  :)

Согласен  ;)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

#4 pinchoalex Ваш код норм, но можно было поставить PREG_SET_ORDER,

а потом сделать foreach($matches as $match) {
list(, $url, $title, $text) = $match;

...
}
Да, И что
это за бред?     $data_url = $data_title = $data_description = curl_exec($ch);
3 раза выделяется память под одни и те же данные, бред

 

pinchoalex понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@pinchoalex, работает отлично! По поводу ограничений: как таковых не должно возникать, число обращений предполагается ничтожное.

API тоже вариант, но я почему-то не смог его прикрутить к своему запросу.

Повторюсь: парсятся проиндексированные страницы отдельно взятого сайта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

#4 pinchoalex Ваш код норм, но можно было поставить PREG_SET_ORDER,

а потом сделать foreach($matches as $match) {

list(, $url, $title, $text) = $match;

...

}

Да, И что это за бред?     $data_url = $data_title = $data_description = curl_exec($ch);

3 раза выделяется память под одни и те же данные, бред

 

это реально по запаре за 2 минуты написано (с планшета). Кстати реально тупняк очень жесткий - пристрелите меня пожалуйста, очень стыдно))) А про форич - нужно было) если бы думал сделал бы норм)

shift196 понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Гость
Эта тема закрыта для публикации сообщений.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу