СКРИПТ: Парсер ключевых слов с сайтов из выдачи Google

Сбор и анализ всего что можно собрать из сети.
Ответить
Аватара пользователя
XwebDeveloper
Сообщения: 37
Зарегистрирован: 13 ноя 2017, 12:53

СКРИПТ: Парсер ключевых слов с сайтов из выдачи Google

Сообщение XwebDeveloper » 18 май 2020, 23:25

Версия программы: 7.0.49

Сборщик ключевых слов с сайтов из выдачи Google.

Браузер: Chromium.
Для быстродействия лучше использовать Chromium(Offscrean).

Логика: Есть файл с ключевыми запросами. Вбиваем запросы из файла в поисковик Google, получаем из выдачи все ссылки на сайты и делам проход по всем сайтам, загружаем страницы, которые попали в выдачу по заданным ключевым запросам и не открывая их в браузере, если там есть разбираем мета тэги meta name="keywords".

Скрипт состоит:
Запускаем parser_google.php.
В папке data лежит файл keys.txt, в котором записаны ключевые запросы для поиска сайтов.
В процессе работы скрипта в папке res создаются TXT файлы с результатами сбора для каждого заброса отдельно.

Скачать скрипт:
parser_kw.zip
(13.95 КБ) 1 скачивание
Скрипт:
<?php
$xhe_host ="127.0.0.1:7011";

// The following code is required to properly run XWeb Human Emulator
require("../../Templates/xweb_human_emulator.php");

// //////////////////////// настройки скрипта /////////////////////////
// путь к  с файлу ключевых слов
$path_to_data = "data/keywords.txt";
// папка с результатами
$path_to_res = "res/";

// глубина прохода в поисковые результаты
$cnt_pages = 10;
// текущая страница
$crnt_page = 1; 
// массив ключевых слов
$arr_of_kwds = array();

// индекс текущей папки
$inds_path = "data/inds.txt";
// стартовый индекс
$str_index=0;

// скрипт работает в режим отладки
$dbg = true;
$bUTF8Ver=true;
// //////////////////////// дополнительные модули ///////////////
// функции 
require_once("tools/functions.php");
require_once("tools/a.charset.php");

// /////////////////////// скрипт ///////////////////////////////////////////
debug_mess(date("\[ d.m.y H:i:s\] ")." скрипт запустили");

// получаем массив с ключевыми словами
$arr_of_kwds = file($path_to_data);

// проверям есть ли уже обработанные запросы из файла
if ($file_os->is_exist($inds_path))
{
   $str_index=trim($textfile->get_line_from_file($inds_path,false,0)); 
}

// пробежимся по всем ключевым словам
for($ii=$str_index;$ii<count($arr_of_kwds);$ii++)
{
	$kwd = trim($arr_of_kwds[$ii]);
	if($kwd == "")
	{
		continue;
	}
   // перейти на гугль	
   $browser->navigate("google.com");
   sleep(2);
	
	// задаём слово в поиск
   $input->send_keyboard_input_by_name("q",$kwd."\n", "20:40");
   sleep(3);
 
   // обнулим перед следующим проходом
   $crnt_page = 1;

   // работаем с ключевым словом на заданную длинну
   while (true)
   {
		// получим все ссылки на сайты заключённые в префиксах
		$sites = $webpage->get_body_inter_prefix_all('<div class="r">', '</div>');
		$sites = explode("<br>", $sites);
		
        // удалить дубликаты
		$sites = array_unique($sites);	
		// пройдёмся по всем полученным ссылкам
		for($i = 0; $i < count($sites); $i++)
		 {        
			// получить ссылку на сайт
			$pr1 = 'href="';
			$pr2 = '"';
			$site = get_string($sites[$i], $pr1, $pr2);
			if ($site == "")
				continue;

			// вывод в панель отладки
			debug_mess("ссылка на сайт : ".$site);
  
         // записать найденные ключи в файл			
         get_meta_kw($site,$kwd);

			sleep(2);
		}
		
		 // организация перехода на следующую страницу
		if(!next_page($crnt_page))
		{
			// убираем строки-дубликаты из файла
			$textfile->dedupe($path_to_res.$kwd.".txt", $path_to_res.$kwd.".txt", 60);	
			sleep(3);
			break;
		}
	}

    // вывод в панель отладки
	debug_mess("<b>".date("\[ d.m.y H:i:s\] ")."отработали запрос ".$kwd."</b>");

    // запоминаем на всяк случай индекс для следующего запуска
    $str_index++;
    $textfile->write_file($inds_path,$str_index); 
	
}
debug_mess(date("\[ d.m.y H:i:s\] ")." скрипт закончил работу<br>");

// удалить файл с индексом
$file_os->delete($inds_path);

// Quit
$app->quit();
?>

Код парсинга выдачи Google:

// получим все ссылки на сайты заключённые в префиксах
$sites = $webpage->get_body_inter_prefix_all('<div class="r">', '</div>');
$sites = explode("<br>", $sites);

Если скрипт не работает, то скорее всего изменилась выдача поисковика. Для того что бы это починить надо в функции get_body_inter_prefix_all поменять префиксы для разбора на новые. Определить префиксы для разбора довольно просто.

1. Выбираем в программе кусок выдачи и нажимаем на правую кнопку мыши в контекстном меню выбираем пункт Показать выбранный HTML
parse_google1.jpg
parse_google1.jpg (147.83 КБ) 34 просмотра

2. Открывается код выбранной части страницы в блокноте в текстовом виде. Находим в нём ссылку, которую надо получить и берём префиксы для разбора перед этой ссылкой и после.
parse_google2.jpg
parse_google2.jpg (186.39 КБ) 34 просмотра
Таким образом мы получаем кусок выдачи с интересующей нас ссылкой.


Для загрузки страниц сайта, используется функция объекта webpage load_web_page
// получаем контент по данному url
$content = $webpage->load_web_page($site);

Аватара пользователя
XwebDeveloper
Сообщения: 37
Зарегистрирован: 13 ноя 2017, 12:53

Re: СКРИПТ: Парсер ключевых слов с сайтов из выдачи Google

Сообщение XwebDeveloper » 19 май 2020, 20:47

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

Скрипт :
<?php
/*  производитель: x-scripts                                     
**  тип продукта: скрипт под Xweb Human Emulator  
**  сайт программы: humanemulator.info                  
**  наш сайт: x-scripts.com                                     
**  по всем вопросам обращайтесь:                       
**  email: order@x-scripts.com                                
**  icq: 625657402                               
**  skype: igor_sev2                             
*/

$xhe_host ="127.0.0.1:7012";

// The following code is required to properly run XWeb Human Emulator
require("../../Templates/xweb_human_emulator.php");

// //////////////////////// настройки скрипта /////////////////////////
// путь к  с файлу ключевых слов
$path_to_data = "data/keywords.txt";
// папка с результатами
$path_to_res = "res/";

// глубина прохода в поисковые результаты
$cnt_pages = 10;
// текущая страница
$crnt_page = 1; 
// массив ключевых слов
$arr_of_kwds = array();

// индекс текущей папки
$inds_path = "data/inds.txt";
// стартовый индекс
$str_index=0;

// скрипт работает в режим отладки
$dbg = true;
$bUTF8Ver=true;

// ключ от сервиса антикапча
$api_key = "ваш ключ антигейт";
// //////////////////////// дополнительные модули ///////////////
// функции 
require_once("tools/functions.php");
require_once("tools/a.charset.php");

// /////////////////////// скрипт ///////////////////////////////////////////
debug_mess(date("\[ d.m.y H:i:s\] ")." скрипт запустили");

// получаем массив с ключевыми словами
$arr_of_kwds = file($path_to_data);

// проверям есть ли уже обработанные запросы из файла
if ($file_os->is_exist($inds_path))
{
   $str_index=trim($textfile->get_line_from_file($inds_path,false,0)); 
}

// пробежимся по всем ключевым словам
for($ii=$str_index;$ii<count($arr_of_kwds);$ii++)
{
	$kwd = trim($arr_of_kwds[$ii]);
	if($kwd == "")
	{
		continue;
	}
   // перейти на гугль	
   $browser->navigate("google.com");
   sleep(2);
	
	// задаём слово в поиск
   $input->send_keyboard_input_by_name("q",$kwd."\n", "20:40");
   sleep(3);
 
   // проверить капчу 
   check_captcha($api_key);
   // обнулим перед следующим проходом
   $crnt_page = 1;

   // работаем с ключевым словом на заданную длинну
   while (true)
   {
		// получим все ссылки на сайты заключённые в префиксах
		$sites = $webpage->get_body_inter_prefix_all('<div class="r">', '</div>');
		$sites = explode("<br>", $sites);
		
        // удалить дубликаты
		$sites = array_unique($sites);	
		// пройдёмся по всем полученным ссылкам
		for($i = 0; $i < count($sites); $i++)
		 {        
			// получить ссылку на сайт
			$pr1 = 'href="';
			$pr2 = '"';
			$site = get_string($sites[$i], $pr1, $pr2);
			if ($site == "")
				continue;

			// вывод в панель отладки
			debug_mess("ссылка на сайт : ".$site);
  
         // записать найденные ключи в файл			
         get_meta_kw($site,$kwd);

			sleep(2);
		}
		
		 // организация перехода на следующую страницу
		if(!next_page($crnt_page))
		{
			// убираем строки-дубликаты из файла
			$textfile->dedupe($path_to_res.$kwd.".txt", $path_to_res.$kwd.".txt", 60);	
			sleep(3);
			break;
		}
	}

    // вывод в панель отладки
	debug_mess("<b>".date("\[ d.m.y H:i:s\] ")."отработали запрос ".$kwd."</b>");

    // запоминаме на всяк случай индекс для следующего запуска
    $str_index++;
    $textfile->write_file($inds_path,$str_index); 
	
}
debug_mess(date("\[ d.m.y H:i:s\] ")." скрипт закончил работу<br>");

// удалить файл с индексом
$file_os->delete($inds_path);

// Quit
$app->quit();
?>

тут указать ваш ключ антигейта
// ключ от сервиса антикапча
$api_key = "ваш ключ антигейт";

Функция распознавания :
// проверить есть ли капча после выдачи
function check_captcha($api_key)
{
	global $hiddeninput, $textarea, $browser, $span,$label;

	if($label->is_exist_by_inner_text("Я не робот", false, "0"))
	{
		
		$api = new NoCaptchaProxyless();
		$api->setVerboseMode(true);
				
		//your anti-captcha.com account key
		$api->setKey($api_key);
		 
		//recaptcha key from target website
		$api->setWebsiteURL("https://www.google.com");
		$api->setWebsiteKey("6LfwuyUTAAAAAOAmoS0fdqijC2PbbdH4kjq62Y1b");

		if (!$api->createTask()) {
			$api->debout("API v2 send failed - ".$api->getErrorMessage(), "red");
			return false;
		}

		$taskId = $api->getTaskId();

		if (!$api->waitForResult()) 
        {
			$api->debout("could not solve captcha", "red");
			$api->debout($api->getErrorMessage());
		} 
        else 
        {
			$result = $api->getTaskSolution();
			echo "\nhash result: ".$result."\n\n";;
		}

		$hiddeninput->set_value_by_attribute("id", "recaptcha-token", true,$result,2);
		// установим токен в скрытое поле g-recaptcha-response
		$textarea->set_inner_html_by_name("g-recaptcha-response", $result);
		// вызов коллбек-функции
		$browser->run_java_script('submitCallback();');

		sleep(1);

		$span->get_by_id("recaptcha-anchor", true, "0")->send_mouse_click(5,5);
	}

    return true;
}

Ответить