files

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

10 posts in this topic

Вопрос к знатокам парсеров: у кого есть рабочий парсер выдачи 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); //выводим результат
 ?>

Share this post


Link to post
Share on other sites

интересно было бы увидеть print_r($data); хотя сам гляну..

Share this post


Link to post
Share on other sites

А не проще использовать 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);
}
?>

Share this post


Link to post
Share on other sites
<?
	$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/

Share this post


Link to post
Share on other sites

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

files likes this

Share this post


Link to post
Share on other sites

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

pinchoalex likes this

Share this post


Link to post
Share on other sites

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

Согласен  ;)

Share this post


Link to post
Share on other sites

#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 likes this

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

#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 likes this

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.