Страница 1 из 1
помогите разобратся с парсингом
Добавлено: 11 фев 2020, 02:09
ттбрть
вот огрызок кода со страницы
<div class="nick">
<a class="bx-def-font-large" href="
http://www.ляляляля/id1561256 ">Sev1234</a>
и таких много
мне нужно собрать айди которое часть ссылки выделеная зеленым перейти на некст страницу и повторить чтоб в итоге получилась база с которой можно работать для дальнейшей россылки
Re: помогите разобратся с парсингом
Добавлено: 11 фев 2020, 03:04
bigfozzy
Например так:
// 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>
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 на странице:?:
Re: помогите разобратся с парсингом
Добавлено: 12 фев 2020, 07:58
ushak
А может быть попробовать так:
$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] и т.д. А потом массивы объединить.
Re: помогите разобратся с парсингом
Добавлено: 12 фев 2020, 13:53
XwebDeveloper
Можно сделать следующим образом.
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
)
Re: помогите разобратся с парсингом
Добавлено: 12 фев 2020, 17:08
ттбрть
вот это работает как нужно
только теперь проблема с самим строением сайта
на 1 странице не 10 пользывателей как я думал а 20-30
потому что на странице вверху есть что то типо топа пользывателей и их айди тоже собирает и ещё где то берет часть я так и не смог пока понять где
и не имею не малейшей догадки как их отсеять ведь с точки зрения кода это такие же айди
разве что как то сделать сбор без повторений чтоб в списке не было двух одинаковых айди такое возможно
или же когда перейду ко второй часте тобишь спаму сделать как то спам был без повторений
ну саму суть как работает парсинг я понял спасибо
Re: помогите разобратся с парсингом
Добавлено: 12 фев 2020, 17:20
XwebDeveloper
Не добавлять дубликаты в массив с 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);
Re: помогите разобратся с парсингом
Добавлено: 12 фев 2020, 18:00
ттбрть
теперь работает вопросов ещё очень много но на сегодня хватит ибо если ты за меня всё напишешь будет круто но так мало чему научусь сам
попробую сделать сам после вернусь со списком того что не получилось
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
Re: помогите разобратся с парсингом
Добавлено: 16 фев 2020, 12:50
XwebDeveloper
Для того что бы не добавлять лишнее можно добавить следующий код перед заполнением массива:
// не добавлять в массив строки 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;
}
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 строчки написаные мной в этом скрипте
ещё хотелось бы ускорить работу скрипта ибо от настроения сайта сбор может занять как 20 секунд так и несколько минут хотя сомневаюсь что можно как то ускорить загрузку сайта)
Re: помогите разобратся с парсингом
Добавлено: 19 фев 2020, 13:30
XwebDeveloper
Перед тем как использовать просто добавьте замену 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);
}