помогите разобратся с парсингом

вопросы и ответы по использованию PHP
Ответить
Аватара пользователя
ттбрть
Сообщения: 36
Зарегистрирован: 19 дек 2019, 08:08
Откуда: хохляндия

помогите разобратся с парсингом

Сообщение ттбрть » 11 фев 2020, 02:09

вот огрызок кода со страницы

<div class="nick">
<a class="bx-def-font-large" href="http://www.ляляляля/id1561256 ">Sev1234</a>

и таких много
мне нужно собрать айди которое часть ссылки выделеная зеленым перейти на некст страницу и повторить чтоб в итоге получилась база с которой можно работать для дальнейшей россылки

Аватара пользователя
bigfozzy
Site Admin
Сообщения: 3047
Зарегистрирован: 28 июл 2008, 17:24
Контактная информация:

Re: помогите разобратся с парсингом

Сообщение bigfozzy » 11 фев 2020, 03:04

Например так:
// navigate
$browser->navigate("file://D:/1.html");

// получить DIV
$elDIV = $div->get_by_attribute("class","nick", false);
// получить вложенный в него A
$elA=$elDIV->get_child_by_number(0);
// получить href
echo $href=$elA->get_href();

echo "\n";

// получим id
$index1=strpos($href,"/id");
echo $id=substr($href,$index1+3);
D:\1.html:
<div class="nick">
<a class="bx-def-font-large" href="http://www.ляляляля/id1561256 ">Sev1234</a>

Аватара пользователя
ттбрть
Сообщения: 36
Зарегистрирован: 19 дек 2019, 08:08
Откуда: хохляндия

Re: помогите разобратся с парсингом

Сообщение ттбрть » 12 фев 2020, 03:40

работает но собирает айди только первого пользывателя на странице а нужно всех 10
D:\1.html:

Код: Выделить всё

<div class="nick">
<a class="bx-def-font-large" href="http://www.ляляляля/id1561256 ">Sev1236</a>
<div class="nick">
<a class="bx-def-font-large" href="http://www.ляляляля/id1561257 ">Sev1237</a>
<div class="nick">
<a class="bx-def-font-large" href="http://www.ляляляля/id1561258 ">Sev1238</a>
<div class="nick">
<a class="bx-def-font-large" href="http://www.ляляляля/id1561259 ">Sev1239</a>
<div class="nick">
<a class="bx-def-font-large" href="http://www.ляляляля/id1561260 ">Sev1240</a>
и так 10 раз...
а с вашим примером на выходе получаем только id1561256
собственно вопрос как собрать все id на странице:?:

ushak
Сообщения: 82
Зарегистрирован: 18 янв 2015, 10:45

Re: помогите разобратся с парсингом

Сообщение ushak » 12 фев 2020, 07:58

А может быть попробовать так:
$text = $webpage->get_body_inter_prefix_all('<div class="nick">','</a>',$as_html=false,$shift1=56,$shift2=-10,$separator="<br>");
//с переменными shift1 и shift2 надо поиграть
$arr[0] = explode("<br>", $text);
//при переходе на следующую страницу создать массив $arr[1], затем $arr[2] и т.д. А потом массивы объединить.

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

Re: помогите разобратся с парсингом

Сообщение XwebDeveloper » 12 фев 2020, 13:53

Можно сделать следующим образом.

HTML адаптировал для отладки кода:

Код: Выделить всё

<div class="nick">
<a class="bx-def-font-large" href="http://www.site.com/id1561256 ">Sev1236</a>
<div class="nick">
<a class="bx-def-font-large" href="http://www.site.com/id1561257 ">Sev1237</a>
<div class="nick">
<a class="bx-def-font-large" href="http://www.site.com/id1561258 ">Sev1238</a>
<div class="nick">
<a class="bx-def-font-large" href="http://www.site.com/id1561259 ">Sev1239</a>
<div class="nick">
<a class="bx-def-font-large" href="http://www.site.com/id1561260 ">Sev1240</a>
Сам код:
// массив для id
$arr_id = array();

// получить все ссылки по части href
$arr_href=$anchor->get_all_by_href("/id");
// покажем массив в панели отладки
print_r($arr_href->get_href());

// пройдёмся по массиву и заменим лишнее
foreach($arr_href->get_href() as $href)
{
  
   $href = str_replace("http://www.site.com/","",$href);
   echo $href."<br>";
   // добавляем id в массив
   $arr_id[]=$href;
}
// вывод в панель отладки
print_r($arr_id);
Результат работы в окне отладки:
Array
(
[0] => http://www.site.com/id1561256
[1] => http://www.site.com/id1561257
[2] => http://www.site.com/id1561258
[3] => http://www.site.com/id1561259
[4] => http://www.site.com/id1561260
)
id1561256
id1561257
id1561258
id1561259
id1561260
Array
(
[0] => id1561256
[1] => id1561257
[2] => id1561258
[3] => id1561259
[4] => id1561260
)
Запрос на создание скриптов viewforum.php?f=61

Аватара пользователя
ттбрть
Сообщения: 36
Зарегистрирован: 19 дек 2019, 08:08
Откуда: хохляндия

Re: помогите разобратся с парсингом

Сообщение ттбрть » 12 фев 2020, 17:08

вот это работает как нужно
только теперь проблема с самим строением сайта
на 1 странице не 10 пользывателей как я думал а 20-30
потому что на странице вверху есть что то типо топа пользывателей и их айди тоже собирает и ещё где то берет часть я так и не смог пока понять где
и не имею не малейшей догадки как их отсеять ведь с точки зрения кода это такие же айди

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

ну саму суть как работает парсинг я понял спасибо :D

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

Re: помогите разобратся с парсингом

Сообщение XwebDeveloper » 12 фев 2020, 17:20

Не добавлять дубликаты в массив с id:
// массив для id
$arr_id = array();

// получить все ссылки по части href
$arr_href=$anchor->get_all_by_href("/id");
// покажем массив в панели отладки
print_r($arr_href->get_href());

// пройдёмся по массиву и заменим лишнее
foreach($arr_href->get_href() as $href)
{
  
   $href = str_replace("http://www.site.com/","",$href);
   echo $href."<br>";
   
   // добавляем id в массив если такого нет
   if (!in_array($href, $arr_id)) 
      { $arr_id[]=$href; } 
   
}

print_r($arr_id);
Или можно собирать ссылки не по href а скажем по классу
// массив для id
$arr_id = array();

// получить все ссылки по атрибуту class
$arr_href=$anchor->get_all_by_attribute("class","bx-def-font-large");

// покажем массив в панели отладки
print_r($arr_href->get_href());

// пройдёмся по массиву и заменим лишнее
foreach($arr_href->get_href() as $href)
{
  
   $href = str_replace("http://www.site.com/","",$href);
   echo $href."<br>";
   
   // добавляем id в массив если такого нет
   if (!in_array($href, $arr_id)) 
      { $arr_id[]=$href; } 
   
}

print_r($arr_id);
Запрос на создание скриптов viewforum.php?f=61

Аватара пользователя
ттбрть
Сообщения: 36
Зарегистрирован: 19 дек 2019, 08:08
Откуда: хохляндия

Re: помогите разобратся с парсингом

Сообщение ттбрть » 12 фев 2020, 18:00

теперь работает вопросов ещё очень много но на сегодня хватит ибо если ты за меня всё напишешь будет круто но так мало чему научусь сам :lol: :lol:
попробую сделать сам после вернусь со списком того что не получилось :)

Аватара пользователя
ттбрть
Сообщения: 36
Зарегистрирован: 19 дек 2019, 08:08
Откуда: хохляндия

Re: помогите разобратся с парсингом

Сообщение ттбрть » 16 фев 2020, 07:43

проблема раз
[21] => id1563531
[22] => m/photos/albums/browse/owner/id1563531
[23] => id1563528
[24] => id1563527
[25] => m/photos/albums/browse/owner/id1563527
[26] => id1173615
[27] => m/photos/albums/browse/owner/id1563402
[28] => id1563363
[29] => id1563354
это лишнее в масиве с айди можно убрать как то?
вопрос двас
насколько убого это выглядит по шкале от 1 до пиз**ц

Код: Выделить всё

$browser->enable_popup(false)." ";
$browser->is_enable_popup()."\n";
// массив для id
$arr_id = array();
// получить все ссылки по части href
$arr_href=$anchor->get_all_by_href("/id");
// пройдёмся по массиву и заменим лишнее
foreach($arr_href->get_href() as $href)
{ 
   $href = str_replace("http://www.site.com/","",$href);
 //  echo $href."<br>";
   // добавляем id в массив если такого нет
   if (!in_array($href, $arr_id)) 
      { $arr_id[]=$href; } 
   
}
$anchor->click_by_href("page=2", false);
$arr_href=$anchor->get_all_by_href("/id");
foreach($arr_href->get_href() as $href)
{
   $href = str_replace("http://www.site.com/","",$href);
  // echo $href."<br>";
   if (!in_array($href, $arr_id)) 
      { $arr_id[]=$href; } 
   
}
$anchor->click_by_href("page=3", false);
$arr_href=$anchor->get_all_by_href("/id");
foreach($arr_href->get_href() as $href)
{
   $href = str_replace("http://www.site.com/","",$href);
  // echo $href."<br>";
   if (!in_array($href, $arr_id)) 
      { $arr_id[]=$href; } 
   
}
ну и так 15 раз повторется
я вроде как где то видел что можно сделать всё проще но забыл как ну впринцыпе уже и так работает но на будущее хотелось бы знать как избегать таких Ctrl+c Ctrl+v

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

Re: помогите разобратся с парсингом

Сообщение XwebDeveloper » 16 фев 2020, 12:50

Для того что бы не добавлять лишнее можно добавить следующий код перед заполнением массива:
 // не добавлять  в массив строки m/photos/albums/browse/owner/id1563402
	   if(strpos($href,'albums')!==false)
		  continue;
Теперь про оптимизацию кода.
Первый вариант оптимизируем повторяющиеся переходы по страницам не трогая первый переход. Это делается с помощью цикла и у нас получится следующий код:
// пройдёмся по массиву и заменим лишнее
foreach($arr_href->get_href() as $href)
{ 
   $href = str_replace("http://www.site.com/","",$href);
   //  echo $href."<br>";
   // не добавлять  в массив строки m/photos/albums/browse/owner/id1563402
   if(strpos($href,'albums')!==false)
      continue;

   // добавляем id в массив если такого нет
   if (!in_array($href, $arr_id)) 
      { $arr_id[]=$href; } 
   
}

// цикл прохода по страницам
for($ii=2; $ii<15; $ii++)
{
	$anchor->click_by_href("page=".$ii, false);
	$arr_href=$anchor->get_all_by_href("/id");
	foreach($arr_href->get_href() as $href)
	{
      // не добавлять  в массив строки m/photos/albums/browse/owner/id1563402
      if(strpos($href,'albums')!==false)
        continue;

	   $href = str_replace("http://www.site.com/","",$href);
	  // echo $href."<br>";
	   if (!in_array($href, $arr_id)) 
		  { $arr_id[]=$href; } 
	   
	}

}

Второй вариант переделаем весь код в один цикл, который будет работать пока у нас есть страницы с href=page№:

$browser->enable_popup(false)." ";
$browser->is_enable_popup()."\n";
// массив для id
$arr_id = array();
// получить все ссылки по части href
$arr_href=$anchor->get_all_by_href("/id");

// счётчик для страниц
$ii=2;

while(true)
{
	// пройдёмся по массиву и заменим лишнее
	foreach($arr_href->get_href() as $href)
	{ 
	   $href = str_replace("http://www.site.com/","",$href);
	   //  echo $href."<br>";
	   // не добавлять  в массив строки m/photos/albums/browse/owner/id1563402
	   if(strpos($href,'albums')!==false)
		  continue;

	   // добавляем id в массив если такого нет
	   if (!in_array($href, $arr_id)) 
		  { $arr_id[]=$href; }   
	}

    // переходим на следующую страницу если есть такая
    if($anchor->is_exist_by_href("page=".$ii, false))
    {
      $anchor->click_by_href("page=".$ii, false);
      sleep(1);
      // получаем массив
      $arr_href=$anchor->get_all_by_href("/id");
      $ii++;
    }
    else // страницы нет прекращаем работу
      break;
}
Запрос на создание скриптов viewforum.php?f=61

Аватара пользователя
ттбрть
Сообщения: 36
Зарегистрирован: 19 дек 2019, 08:08
Откуда: хохляндия

Re: помогите разобратся с парсингом

Сообщение ттбрть » 19 фев 2020, 02:34

последний вопрос по этой теме ..ну надеюсь)
мой косяк я сразу не глянул что для спама нужны айди без приписки id
нужно оставить только цыфры
[13] => id1564618
[14] => id1564617
[15] => id1564614

Код: Выделить всё

for($ID=1;$ID<999; $ID++)
{
$browser->navigate("http://www.site.com/chat/$arr_id[$ID]");
$textarea->set_value_by_attribute("id", "aqb_simple_chat_message_text", false, "привет");
$btn->click_by_inner_text("Отправить (Enter)", false);
}
👆👆👆 единственные 3 строчки написаные мной в этом скрипте :lol: :lol:
ещё хотелось бы ускорить работу скрипта ибо от настроения сайта сбор может занять как 20 секунд так и несколько минут хотя сомневаюсь что можно как то ускорить загрузку сайта)

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

Re: помогите разобратся с парсингом

Сообщение XwebDeveloper » 19 фев 2020, 13:30

Перед тем как использовать просто добавьте замену id.

for($ID=1;$ID<999; $ID++)
{
// убрать id
$id_new = str_replace("id","",$arr_id[$ID]);

$browser->navigate("http://www.site.com/chat/$id_new");
$textarea->set_value_by_attribute("id", "aqb_simple_chat_message_text", false, "привет");
$btn->click_by_inner_text("Отправить (Enter)", false);
}
Запрос на создание скриптов viewforum.php?f=61

Ответить