Загрузка...

Парсер ETH Кошельков по username

Тема в разделе C# создана пользователем kin4emir 1 дек 2022. 513 просмотров

  1. kin4emir
    kin4emir Автор темы 1 дек 2022 142 17 янв 2021
    Небольшой парсер для эфир кошельков при помощи zapper.fi

    Первый проект, шарп в целом учу ток 3 дня, решил попробовать себя.
    Сеньоры - прошу вас не кидаться палками, а лучше понять и простить меня за плохой код
    Лучше подскажите, что можно было сделать лучше.

    Как вариант брать строки - парсить username twitter аккаунтов, собсна как я и делал

    [IMG]




    Как пользоваться скомпилированным парсером?
    Сначала вводим путь до файла с юзернеймами
    Пример: C:\Users\кринжик\Desktop\file.txt

    Затем вводим путь к результатам
    Пример: C:\Users\кринжик\Desktop\result.txt




    Исходник проекта:


    C#
    using System;
    using System.IO;
    using OpenQA.Selenium;
    using OpenQA.Selenium.Chrome;
    using System.Text;

    namespace SeleniumParser
    {
    internal class Program
    {
    static void Main(string[] args)
    {

    var driver = new ChromeDriver(); // Создание и запуск веб-драйвера хром.

    System.Threading.Thread.Sleep(5000); // Ожидание перед вводом пути к файлу.
    Console.ForegroundColor = ConsoleColor.Red;
    Console.WriteLine("\n\nEnter file path"); // Вывод строки с запросом ввести путь к файлу с юзернеймами.
    string _path = Console.ReadLine(); // Ввод пути файла.

    System.Threading.Thread.Sleep(5000);
    Console.WriteLine("Enter path for checked accounts"); // Вывод строки с запросом ввести путь к файлу с готовыми аккаунтами.
    string _pathChecked = Console.ReadLine(); // Ввод пути файла.
    Console.ResetColor();


    string[] lines = File.ReadAllLines(_path); // Открытие и считывание файла с юзернеймами.
    int _howMuchLines = File.ReadAllLines(_path).Length; // Получение кол-ва строк в файле с юзернеймами.

    Console.WriteLine("Loaded " + _howMuchLines + " lines"); // Вывод кол-ва строк, загруженных в парсер.
    int set = 0;

    foreach (string line in lines) // Цикл тела парсера.
    {
    try
    {
    set++; // Подсчёт кол-ва обработанных строк.
    Console.WriteLine("Processed " + set + " of " + _howMuchLines + " lines.\n"); // Вывод кол-ва обработанных строк.
    string _username = line; // Преобразование строки в отдельную переменную _username.
    Console.WriteLine("Trying to read " + line); // Вывод в консоль текста "Пытаюсь прочитать + содержание строки"


    driver.Navigate().GoToUrl("https://zapper.fi/account/" + _username + ".eth"); // Открытие страницы с кошельком.
    System.Threading.Thread.Sleep(2000); // Ожидание загрузки страницы, можете поставить значение больше, если у вас прогружается быстрее.

    IWebElement _ethAdress = driver.FindElement(By.XPath("/html/body/div[1]/div[2]/div[3]/main/div/div/div[1]/div[2]/div/div[2]/div/div[2]/div")); // Поиск элемента, который содержит баланс по XPath
    Console.ForegroundColor = ConsoleColor.Green;
    Console.WriteLine(_ethAdress.Text); // Получение баланса(Если элемент найден)
    Console.ResetColor();


    StreamWriter sw = new StreamWriter(_pathChecked, true, Encoding.ASCII); // Открытие файла с результатами
    string _accWithBalance = _username + " " + _ethAdress.Text; // Установка переменной, в которой будет записан результат и баланс.
    sw.WriteLine(_accWithBalance); // Запись строки в файл.
    sw.Close(); // Закрытие и сохранение файла.

    }
    catch (Exception) // "Ловим" ошибку
    {
    Console.ForegroundColor = ConsoleColor.Red;
    Console.WriteLine("Аккаунт не существует / Не удалось спарсить баланс\n"); // Маскируем ошибку из 5 строк в одну и сразу понятную.
    Console.ResetColor();

    }
    }
    Console.ForegroundColor = ConsoleColor.Red;
    Console.WriteLine("Парсинг закончен."); // Сообщение о окончании парсинга.
    Console.ResetColor();

    }
    }
    }

     
  2. Uwuku
    Uwuku 1 дек 2022 пишу кодик:pressF: 262 11 окт 2019
    спасибо, обучусь по твоему коду
     
    1. Посмотреть предыдущие комментарии (1)
    2. Uwuku
      kin4emir, а у кого поучиться можно?)
    3. vtlstolyarov
      Uwuku, у меня можно
      C#
      using System;
      using System.IO;
      using System.Linq;
      using System.Text;
      using OpenQA.Selenium;
      using OpenQA.Selenium.Chrome;
      using OpenQA.Selenium.Support.UI;
      using SeleniumExtras.WaitHelpers;

      namespace SeleniumParser
      {
      internal class Program
      {
      private static TimeSpan MaxTimeToWaitForElement = TimeSpan.FromSeconds(10);

      static void Main()
      {
      Console.ForegroundColor = ConsoleColor.Red;

      Console.WriteLine("Enter the path to the file with usernames.");
      string accountsFilePath = Console.ReadLine();

      Console.WriteLine("Enter the path to the file where check results are to be saved.");
      string resultsFilePath = Console.ReadLine();

      Console.ResetColor();

      string[] usernames = File.ReadAllLines(accountsFilePath)
      .Where(username => username != string.Empty)
      .Distinct()
      .ToArray();

      int usernameCount = usernames.Length;
      Console.WriteLine($"Loaded {usernameCount} usernames");

      using var resultStreamWriter = new StreamWriter(resultsFilePath, true, Encoding.ASCII);
      using var driver = new ChromeDriver();
      var navigation = driver.Navigate();
      var wait = new WebDriverWait(driver, MaxTimeToWaitForElement);
      for (int i = 0; i < usernames.Length; i++)
      {
      var username = usernames[i];
      Console.WriteLine($"Processing {i + 1} of {usernameCount} accounts.");
      Console.WriteLine($"Trying to get balance for `{username}`...");
      try
      {
      navigation.GoToUrl($"https://zapper.fi/account/{Uri.EscapeDataString(username)}.eth");
      var balanceElement = wait.Until(ExpectedConditions.ElementExists(By.XPath("//*[@data-testid='1']"))); // ждём пока появится элемент в который выводится баланс
      wait.Until(ExpectedConditions.ElementExists(By.XPath("//*[text()='Net Worth'][not(./*)]"))); // ждём пока не исчезнет иконка подгрузки баланса

      string balance = balanceElement.Text;

      Console.ForegroundColor = ConsoleColor.Green;
      Console.WriteLine(balance);
      Console.ResetColor();

      resultStreamWriter.WriteLine($"{username} {balance}");
      }
      catch (Exception ex)
      {
      Console.ForegroundColor = ConsoleColor.Red;
      Console.WriteLine($"Error on getting balance for `{username}` - either the account does not exist or could not parse the balance."); // Маскируем ошибку из 5 строк в одну и сразу понятную.
      Console.WriteLine($"{ex.GetType()}: {ex.Message}"); // Крайне не рекомендую полностью маскировать ошибку, как минимум ее надо записать куда-то в лог вместе с аккаунтом на которой она возникла
      Console.ResetColor();
      }
      }

      Console.ForegroundColor = ConsoleColor.Red;
      Console.WriteLine("Completed.");
      Console.ResetColor();
      }
      }
      }
    4. Посмотреть следующие комментарии (3)
  3. Help
    Help 1 дек 2022 469 12 май 2017
    1. kin4emir Автор темы
      Help, Не особо понял к чему эт тут, я чисто сделал как понравилось мне, хотя и можно было без селениума обойтись, чисто запросами(но мне было очень впадлу это делать по другому)
Top
Загрузка...