При написании бота для Instagram, с использованием стека технологий selenium webdriver, java, xpath, столкнулся с проблемой.
Инстаграм сейчас всеми силами пытается защититься от ботов, поэтому разбирать его наиболее интересно.
Возникла задача, получить количество Posts, Followers, Following на открытом профиле пользователя.
Так выглядит html код блока, где содержатся эти данные в Instagram:
<ul class=" _3dEHb">
<li class=" LH36I">
<span class=" _81NM2">
<span class="g47SY lOXF2">
3
</span>
публикаций
</span>
</li>
<li class=" LH36I">
<a class=" _81NM2" href="/username/followers/">
<span class="g47SY lOXF2" title="153">
153
</span>
подписчиков
</a>
</li>
<li class=" LH36I">
<a class=" _81NM2" href="/username/following/">
Подписки:
<span class="g47SY lOXF2">
8
</span>
</a>
</li>
</ul>
Итого, у нас три цифры, которые представлены разными способами, для получения данных используем этот код:
String posts=driver.findElement(By.xpath("//ul/li/span/span")).getText();
String followers=driver.findElement(By.xpath("//a[contains(@href,'followers')][1]//span")).getAttribute("title");
String following=driver.findElement(By.xpath("//a[contains(@href,'following')][1]//span")).getText();
System.out.println("Posts: "+posts);
System.out.println("Followers: "+followers);
System.out.println("Following: "+following);
Для того, чтобы получить кол-во постов:
<ul class=" _3dEHb">
<li class=" LH36I">
<span class=" _81NM2">
<span class="g47SY lOXF2">
3
.........
Используем конструкцию xpath: //ul/li/span/span
Мы просто перечисляем последние вложенности дерева и в результате получаем содержимое – “3”
Далее узнаем количество подписчиков:
.........
<a class=" _81NM2" href="/username/followers/">
<span class="g47SY lOXF2" title="153">
153
</span>
подписчиков
.........
//a[contains(@href,’followers’)][1]//span тут мы находим первый встречающийся тег A, в href ссылке которого, встречается подстрока followers, и берем из него атрибуты тега span. В атрибуте title содержится число подписчиков. В примере это число 153.
В заключении, получаем число подписок:
.........
<a class=" _81NM2" href="/username/following/">
Подписки:
<span class="g47SY lOXF2">
8
.........
//a[contains(@href,’following’)][1]//span то же самое, что и во второй команде, только в ссылке ищется вхождение following, а нас интересует не атрибут, а текст, в данном случае 8.
Задачка была интересная, в подборе правильной комбинации xpath мне помогли онлайн редакторы xpath, ни один из них не оказался достаточно удобным, поэтому не могу рекомендовать какой-то один, но с ними можно поиграться с xpath на много быстрее, чем прогоняя варианты через бота.