PERL. Поиск коротких доменов – 2 решения

Бывают ситуации, когда нужно найти свободный и короткий домен, к примеру, трёх-символьный.
Для себя я выбрал доменную зону .net

Способ первый:
В интернете можно найти не актуальные на сегодняшний день базы, к примеру:
https://www.domainresearchtool.com/lists/net.zone.gz
Но проблема в том, что эта база за 2014 год и она уже устарела. Но на случай, если у вас есть бюджет около 30 $, вы можете купить этот файл, актуальный на сегодняшний день.
Скрипты, которые помогут получить из файла все трёх-символьные домены, были написаны на PERL’е.

open(my $fh, "<", "zone.txt") or die "Can't open file: $!";
open(my $wh, '>', "custom.txt") or die "Can't open file: $!";
$cou=0;
while (<$fh>) {
  my @array = split /\s+/, $_;
  if ((@array[1] eq "NS")&&(@array[0] ne $tmp)&&(length @array[0] == 3)){
    print $wh @array[0]."\n";
  }
  [email protected][0];
  $cou++;
  if ($cou%100000==0){
    print "$cou\n";
  }
}
close $fh;
close $wh;
open(my $fh, "<", "custom.txt")
or die "Can't open file: $!";
chomp(my @lines = <$fh>);
close $fh;
@list=sort @lines;
open(my $fh, ">", "sorted.txt")
or die "Can't open file: $!";
foreach (@list) {
  print $fh "$_\n";
}
close $fh;

 
Этот скрипт, берёт из файла zone.txt все трёх-буквенные домены и сохраняет их в файл custom.txt, после чего сортирует найденные домены по алфавиту и сохраняет сортированный список в файл sorted.txt.

Второй скрипт:

open(my $fh, "<", "sorted.txt")
or die "Can't open file: $!";
chomp(@lines = <$fh>);
close $fh;
open(my $wh, '>', "free.txt") or die "Can't open file: $!";
my $cou=0;
@letters=('-','0'..'9','A'..'Z');
for(my $i=1; $i < scalar @letters; $i++){
  for(my $j=0; $j < scalar @letters; $j++){
    for(my $k=1; $k < scalar @letters; $k++){
      [email protected][$i][email protected][$j][email protected][$k];
      if(isPresent($dmn)<1){
        $cou++;
        print $wh $dmn."\n";
        if($cou %100 == 0){
          print $cou.", ";
        }
      }
    }
  }
}
close $wh;
print "ok";
sub isPresent(){
  my ($dmn)[email protected]_;
  foreach(@lines){
    if ($_ eq $dmn){
      return 1;
    }
  }
  return 0;
}

 
Загружает файл sorted.txt и генерирует все возможные комбинации трех-символьных доменов от 0-0 до ZZZ, далее проверяет существуют ли эти домены в файле sorted.txt и если их нет, то создаётся файл free.txt.
Как раз эти имена вы сможете использовать для выбора и регистрации уже своего домена.

Второй способ:
Если у вас нет доступа к актуальным файлам доменных зон, можно написать бота, который переберёт все возможные комбинации имени домена, и воспользовавшись командой nslookup найдёт все незарегистрированные. Проблема в том, что, если домен приобретен, но в него не внесены записи, то он тоже будет считаться свободным – “Non-existent domain”, в итоге, мы получаем около 1000 ложных срабатываний.

Листинг бота:

print "Generating all domains names... \n";
my @domains;
@letters=('-','0'..'9','A'..'Z');
for(my $i=1; $i < scalar @letters; $i++){
  for(my $j=0; $j < scalar @letters; $j++){
    for(my $k=1; $k < scalar @letters; $k++){
      push @domains, @letters[$i][email protected][$j][email protected][$k].'.net';
    }
  } 
}
print "Scaning... \n"; unless(open FILE, '>free-domains.txt') {
  die "\nUnable to create $file\n";
}
close FILE;
my $cou=0;
foreach my $domain (@domains)
{
  chomp($domain);
  my $output = qx(nslookup -type=ns $domain 2>&1);
  my $r_c=$?;
  print "|";
  if((index $output, "Non-existent domain") > -1){
    print "\n".$domain."\n";
    open(my $wh, '>>', "free-domains.txt");
    print $wh $domain."\n";
    close($wh);
  }
  if($cou%1000==0){
  print "\nLast checked($cou): ".$domain."\n";
  }
  $cou++;
}

 
Бот сохраняет все, как он считает, свободные домены в файл free-domains.txt
Полученный список можно прогнать через любой сервис массовой проверки доменов, я использовал https://www.reg.ru/domain/new/bulk
Посылая на проверку по 200-300 доменов, через этот сервис, можно достаточно быстро, перебрать весь список, а свободные домены поместятся в корзину.
Вот результат поиска на сегодняшний день:

Selenium webdriver + Java + xpath поиск элемента по части url в href

При написании бота для 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 на много быстрее, чем прогоняя варианты через бота.