Jump to content

Константин Орлов

Administrators
  • Content count

    1129
  • Joined

  • Last visited

  • Days Won

    2

Константин Орлов last won the day on April 5 2018

Константин Орлов had the most liked content!

Community Reputation

2 Neutral

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. This post cannot be displayed because it is in a password protected forum. Enter Password
  2. Константин Орлов

    C#: работа с текстовыми файлами

    Как выбрать кодировку при чтении файла в C# Если нужно выбрать кодировку при чтении файла (варианты кодировок не знаю, вот пример с одной): string text = File.ReadAllText(fileAdres, Encoding.GetEncoding(1251));
  3. Константин Орлов

    C# как сделать парсер в Visual Studio

    Selenium WebDriver Операторы, полезные для работы с управлением браузером через Селениум Узнать если нужный текст на странице: //собщит, есть ли нужный текст на странице (но не более, этот оператор не умеет находить по тексту нужный элемент) //browser - переменная IWebDriver bool info = browser.PageSource.Contains("текст для поиска"); Найти нужный элемент по тексту внутри него: //создать переменную типа IWebElement, в которую будет помещен span, содержащий текст - нужный текст IWebElement myElement = browser.FindElement(By.XPath("//span[contains(text(), 'нужный текст')]")); Если тип HTML-тега контейнера не известен (div, span, li, ul и т.п.), то вместо него в Xpath ставьте звездочку *. Тогда найдется любой тег, содержащий данный текст. Получить HTML-код элемента Если вы нашли нужный элемент (IWebElement) через Selenium, то можете получить, как весь его код (включая сам элемент), так и только тот код, что он содержит внутри себя. Делается это через обращение к элементу, истребование его атрибута и нужно передать ему outerHTML либо innerHTML: //вернет код в виде string всего элемента, включая его самого textBox1.Text = tag1.GetAttribute("outerHTML"); //вернет только тот код, что находится внутри tag1 (не включая его самого) textBox1.Text = tag1.GetAttribute("innerHTML"); Как в URL Selenium передать ссылку на файл на жестком диске? Синтаксис такой: browser.Navigate().GoToUrl("file:///D:/testparser/Эта_неделя_без_повторов.html"); Закрыть браузер browser.Quit();
  4. Константин Орлов

    C# как сделать парсер в Visual Studio

    AngleSharp - операторы Что и как можно изъять из ссылки? У вас есть некий тип IElement, который получается, если спарсить IHtmlDocument iHtmlDocument (первое тип, второе имя переменной). В foreach вы можете обратиться так: foreach (IElement element in iHtmlDocument.QuerySelectorAll("a")) { ShowContent(element.Text()); ShowContent(element.GetAttribute("href")); ShowContent(element.TextContent); ShowContent(element.InnerHtml); break; } ShowContent моя функция, аналог вывода на консоль. В данном примере я спарсил html-документ, и через цикл обращаюсь к каждому тегу "a" этого документа. Вот что возвращает каждый из них: //Заголовок ссылки element.Text(); //Власти Петербурга объявили конкурс на реконструкцию СКК //URL ссылки element.GetAttribute("href"); //https://www.google.com/url?rct=j&sa=t&url=https://tass.ru/ekonomika/6962147&ct=ga&cd=CAAYADIZYjJmNjRkMWRiZjlhZjBmOTpydTpydTpSVQ&usg=AFQjCNFv6VH4P64l-HFUtm-BENZDLMkBTg //весь текс (в данном случае это тоже заголовок) element.TextContent; //Власти Петербурга объявили конкурс на реконструкцию СКК //HTML который находится внутри элемента element.InnerHtml; //Власти Петербурга объявили конкурс на <b>реконструкцию</b> СКК //HTML который находится вокргу элемента element.OuterHtml; // <a class="result_title_link" href="https://www.google.com/url?rct=j&amp;sa=t&amp;url=https://tass.ru/ekonomika/6962147&amp;ct=ga&amp;cd=CAAYADIZYjJmNjRkMWRiZjlhZjBmOTpydTpydTpSVQ&amp;usg=AFQjCNFv6VH4P64l-HFUtm-BENZDLMkBTg" tabindex="0" target="_blank">Власти Петербурга объявили конкурс на <b>реконструкцию</b> СКК</a> Сложные запросы LINQ C# AngleSharp Пример: var resultParsing = document.QuerySelectorAll("a").Where(item => item.ClassName != null && item.ClassName.Contains("result_title_link")); //получаем из HTML-документа все теги нужного типа private IEnumerable<AngleSharp.Dom.IElement> ParseAllHeaders(IHtmlDocument document) { //ищем все теги "a" (ссылки) var resultParsing = document.QuerySelectorAll("a") //проверка на Null, что у ссылки есть поле "class" .Where(item => item.ClassName != null //выбираем только ссылки с классом из такого названия && item.ClassName.Contains("result_title_link")); //возвращаем результат return resultParsing; }
  5. Константин Орлов

    C# как сделать парсер в Visual Studio

    В данный момент я пишу парсер C# на Selenium, довольно тормозная штука, если необходимо спарсить со страницы несколько тысяч элементов. У меня страница на 3800 ссылок. Уже минут 20 Селением занимается следующей штукой - находит по заголовкам ссылку, переходит на 2 родительских элемента вверх, и добавляет этот элемент в список List<IWebElement>. Это прямо капец как медленно, но причина в том, что элементов много и делается это как бы не напрямую через код, а как бы через драйвер. По крайней мере мне кажется, что в этом причина. Ну и еще в том, что каждый раз, чтобы найти нужную ссылку ему приходится брать заголовок (их 2200 уникальных) и сравнивать со всеми 3800 ссылкам на странице, и так 2200 раз. А еще Selenium WebDriver мне не нравится тем, что он, сцука, найдя элемент (например, блок div или ссылку) не может просто ее сохранить в виде кода, то есть как бы кешировать для своей дальнейшей работы (сам код он может предоставить). И если я обращаюсь к элементу, то он заново опрашивает браузер, то есть он хранит лишь ссылку на элементы (IWebElement), но не сами элементы. И еще - основные посты про Selenium в интернете за 2012-14 годы...
  6. Сделать парсер HTML-страниц на c# с хорошим функционалом не просто, надеюсь вам помогут статьи и прочие материалы, которые я нашел, пока разбирался в этой теме. Что нужно знать для начала? AngleSharp - библиотека для парсинга (устанавливается в Visual Studio и подключается через using), собирает данные со страниц не открывая браузер. Selenium WebDriver - штука для управления браузером через код (устанавливается в Visual Studio и подключается через using), это не парсер в полном смысле слова, а лишь некий интерфейс, который может делать клики, искать элементы и т.п. При работе Селениум открывается браузер, которым управляет программа. И это не браузер в Visual Studio, а обычный Chrome. Может выполнять и JavaScripts код, и понимает XPath. Вообще это драйвер для браузера (т.е. штука, позволяющую им управлять), а не парсер, и не кликер. XPath - язык запросов, чтобы найти конкретный элемент на странице (div, a, li, ul и т.п.), этим языком может пользоваться Selenium, чтобы обратиться к конкретному элементу. LINQ C# - для прямо конкретной работы с информацией (сортировка, преобразование, выборка из массивов и списков) необходимо знать линк, можно и без него, просто кода будет больше и придется напрягаться. JavaScript - код, который выполняется в браузере. Типо как C# только его выполнением и компиляцией занимается браузер. XPath [C#] Введение в XPath на примере простого парсера - про то, как использовать выражения XPath, чтобы найти нужный элемент на странице. Примеры xpath-запросов к html - поможет немного въехать в синтаксис Введение в XPath (часть 1). Поддержка XPath в Selenium и инструментальные средства и Введение в XPath (часть 2). Основы построения запросов - похоже для JavaScript, но может пригодится (с C# синтаксис похожий) AngleSharp Помогите написать самый простой парсер на AngleSharp [дубликат] - пример кода, как запустить парсер на AngleSharp (я не тестировал) Спарсить нужные теги C# AngleSharp? - "Но как мне спарсить все<img> теги, в которых атрибут src заканчивается на _200x300.jpg" Парсинг с C# AngleSharp - как получить URL из ссылки Как парсить страницу на AngleSharp? - чей-то консольный проект с рабочим парсером Как правильно парсить с помощью AngleSharp? Selenium WebDriver Selenium WebDriver: поиск элементов на странице - похоже для JavaScript, но пригодиться может. Выберите родительский элемент известного элемента в Selenium - вопрос с ответом на каком-то из форумов WebDriver: характеристика основных команд Selenium 2.0 — WebDriver. Впечатления, проблемы и советы по использованию - для тех, кто использует Селениум для тестирования интерфейсов сайтов. Автоматизированное тестирование веб-приложения (MS Unit Testing Framework + Selenium WebDriver C#). Часть 2.2: Selenium API wrapper — WebElement Selenium 2.0 и WebDriver Про Selenium и один «велосипед» - опять для тестировщиков Парсинг сайтов на C# - Selenium и HtmlAgilityPack JavaScript [Урок 3] . Получение любой информации со страницы при помощи Javascript Как скрыть элемент? LINQ C# LINQ C# - в работе навороченного парсера не обойтись без знания ЛИНК. Линк на professorweb.ru - неплохой сайт. Уроки C# – LINQ – Where, Select, GroupBy, AsParallel, x.Key – C# - отличный видеоурок по линк Массивы и списки Убрать дубликаты из List - как при помощи linq удалить дубликаты из списка, в котором каждый элемент имеет свои поля, и необходимо сравнивать не сами объекты, а одно из их полей С# всякое полезное Как удалить часть строки до определенного слова C# WebBrowser - браузер встроенный в C# Visual Studio, позволяет прямо в формах открывать браузер Парсинг сайтов на c#. Часть 1. Использование WebBrowser C#, способы хранения настроек программы - сериализация или сохранение данных на HDD Разное C# htmlagilitypack пример простого проекта - еще один парсер на си-шарп C# Agility pack HTML Парсер Разработка веб-скрапера для извлечения данных с портала открытых данных России data.gov.ru
  7. Выпадающий список в Visual Studio Windows Forms называется ComboBox. Как создать перечисление в коде C#? Вы можете создать перечисление в "public partial class FormMain : Form", например: public enum ParsingMode { AllHeaders = 0, AllTagA = 1, Test = 2 }; Как выставить значение в комбобокс по енам? Создать в редакторе форм выпадающий список, а потом в коде задать, чтобы его пункты были составлены из enum: //установить в выпадающий список варианты выбора типа парсинга comboBoxTypeParsing.DataSource = Enum.GetValues(typeof(ParsingMode)); Как считать с комбо бокса, какой пункт был выбран в форме? Вот пример из моего парсера, функция, которая возвращает один из "перечислителей" (один из вариантов) перечисления: /// <summary> /// Считать значение с выпадающего меню с выбором типа парсинга /// </summary> /// <returns>Перечислитель вариантов</returns> private ParsingMode ReadComboBoxTypeParsing() { //создаем переменную, куда считаем данные с выпадающего списка с типом парсинга ParsingMode selectedTypeParsing; //читаем, что выбрал пользователь в выпадающем меню типа парсинга Enum.TryParse(comboBoxTypeParsing.SelectedValue.ToString(), out selectedTypeParsing); //возвращаем, что выбрал пользователь return selectedTypeParsing; }
  8. Программа подсчитывает, что будет, если каждое поколение будет рожать определенное количество детей. При условии, что люди не умирают от болезней и т.п. Для простоты подсчета считается, что родители тут же умирают, как дают потомство. Настраивается количество детей, изначальное количество пар и продолжительность одного поколения. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Globalization; //для языков namespace Generation_Human_Count { public partial class GenNumanCount : Form { public GenNumanCount() { InitializeComponent(); } private void GenNumanCount_Load(object sender, EventArgs e) { /// <summary> /// Всего человек (1 пара - 2 человека) /// </summary> decimal population = 24; /// <summary> /// Продолжительность поколения в годах /// </summary> int generationLength = 25; /// <summary> /// Количество детей в семье /// </summary> int childCount = 4; /// <summary> /// Количество шагов размножения /// </summary> int generationCount = 80; //очистить текст из текстбокса textBox.Text = ""; //вывест входную информацию расчетов textBox.Text += "Изначально человек: " + population + ".\nПродолжительность поколения: " + generationLength + ".\nКол-во детей в семьях: " + childCount + ".\nПодсчитано поколений: " + generationCount + "\n\n"; //проходим все поколения и подчитываем численность for (int i = 1; i < generationCount + 1; i++) { //увеличиваем популяцию (делим на пары и умножаем на кол-во детей) //для простоты считается, что родители сразу умирают при рождении детей population = (population / 2) * childCount; //закоменчено так как просто сохранил такой формат, может пригодится. //string populationText = population.ToString("N3", CultureInfo.GetCultureInfo("ru-RU")); //вывести количество людей в популяции на текущем шаге textBox.Text += "Поколение " + i + ") " + i * generationLength + " год. Чел: " + population.ToString("N0") + "\n"; } } } } Для установки программы в Visual Studio - создайте приложение Windows Form, в форме сделайте Label для ввода текста. Скопируйте код в свой проект, и настройте переменную textBox, чтобы она принимала текст для вывода (возможно, вам нужно будет указать вместо textBox свой Label). Либо просто скачайте готовое решение для VS. Generation Human Count.rar
  9. C#: как подсчитать количество строк в текстовом файле Консольное приложение, которое из текстового файла на жестком диске подсчитывает количество строк, и выводит это в консоль. Для работы скопируйте код в Visual Studio в консольном проекте. class Program { static void Main(string[] args) { //считать в массив все строки из файла string[] NewFile = File.ReadAllLines(@"C:\1.txt"); //счетчик количества строк int Count = 0; //проходим все строки в массиве foreach (string str in NewFile) { //выводим на консоль каждую строку Console.WriteLine(str); //повышаем счетчик Count++; } //вывести на экран инфу с количеством строк Console.WriteLine("Количество строк в документе равно {0}.", Count); //чтобы консоль сама не закрывалась Console.ReadKey(true); } }
  10. Константин Орлов

    Unity: Инвентарь и крафт

    Привет! Все пропало, я со временем (если будет время) все выложу, и с видео и скрипты инвентаря нормальные. Когда напишу...)
  11. Простой скрипт с префабом, который создает как бы робота пылесоса. Ничего особо не делает, просто ходит по комнате и при встрече с коллайдером меняет направление движения. Для установки просто вынесите префаб на сцену, и выставьте положение над полом (по наклонным поверхностям не ездит). Баг - иногда может пройти сквозь стены. Скрипт. Можно самому сделать на основе скрипта объект, а может скачать ассет. using UnityEngine; using System.Collections; /// <summary> /// Робот пылесос, тупо ходит по комнате и отскакивает от препятствий /// </summary> public class RobotVacuumCleaner : MonoBehaviour { /// <summary> /// скорость передвижения /// </summary> public float speed = 3.0f; /// <summary> /// расстояние до препятствия, когда робот повернется /// </summary> public float obstacleRange = 5.0f; void Update() { //передвигает робота вперед transform.Translate(0, 0, speed * Time.deltaTime); //пускаем луч, чтобы определить препятствие впереди Ray ray = new Ray(transform.position, transform.forward); RaycastHit hit; //если впереди по определенной окружности луча что-то есть if (Physics.SphereCast(ray, 0.75f, out hit)) { //если дистанция ниже минимальной допустимой if (hit.distance < obstacleRange) { //выбираем случайно на какой градус повернуться float angle = Random.Range(-110, 110); //поворачиваемся transform.Rotate(0, angle, 0); } } } } RobotVacuumCleaner Робот пылесос.unitypackage
  12. Если в Unity консоль спамит - is never assigned to, and will always have its default value null, то значит, что Юнити думает, что переменной никогда не присваивается значение, хотя оно может присваиваться в инспекторе. Чтобы избежать этого просто изначально присвойте значение, например, даже тот же null. Вроде такого Вместо /// <summary> /// Ссылка на элемент текста в префабе для вывода контента /// </summary> [SerializeField] private Text textContent; Поставьте так /// <summary> /// Ссылка на элемент текста в префабе для вывода контента /// </summary> [SerializeField] private Text textContent = null;
  13. Константин Орлов

    Unity: UI шпаргалка по скриптам интерфейса

    Не позволяет окнам выходить за разрешение экрана Алгоритм не самый удачный, но сохраню это здесь, вдруг приходится. //сколько пикселей от конца экрана безопасная зона, куда будет возвращено окно //при перетаскивании за край экрана int pixeSafeZone = 35; //скрипт должен быть на объекте, и вызываться должна эта функция дял проверки выхода за экран private void CheckOutScreen() { #region //не позволяет окнам выходить за разрешение экрана //если окно вышло по иску за пределы экрана вправо if (transform.position.x > Screen.width) { //возвращаем его в пределы экрана transform.position = new Vector3(Screen.width - pixeSafeZone, transform.position.y); } //если окно вышло по иску за пределы экрана влево else if (transform.position.x <= 0) { //возвращаем его в пределы экрана transform.position = new Vector3(pixeSafeZone, transform.position.y); } //если окно вышло по игреку за пределы экрана вверх if (transform.position.y > Screen.height) { //возвращаем его в пределы экрана transform.position = new Vector3(transform.position.x, Screen.height - pixeSafeZone); } //если окно вышло по игреку за пределы экрана вниз else if (transform.position.y <= 0) { //возвращаем его в пределы экрана transform.position = new Vector3(transform.position.x, pixeSafeZone); } }
  14. Константин Орлов

    Unity: UI шпаргалка по скриптам интерфейса

    Как изменить позицию UI-элемента (окна, кнопки т.п.) в Юнити? gameObject.transform.position = new Vector2(transform.position.x + 190, transform.position.y); Пример кода, который по иксу двигает элемент пользовательского интерфейса на 190 пикселей. Y остается таким же (так как туда вводится та же координата, которой Y сейчас соответствует). Но при смене разрешения такой подход может привести к тому, что элемент окажется за экраном, так как это позиция в пикселях. Второй способ перетаскивания в UI Есть второй способ, который считывает движение мыши (я так понимаю мыши передает лишь +1 либо -1), но окно движется очень медленно и ускорение мышки влияет так, что окно отстает: transform.position += new Vector3(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y")); Нормальный способ перетащить окно в Unity А вот это похоже на что-то вменяемое, нужно реализовать интерфейс (ищите инфу что за интерфейсы по началу перетаскивания, в процессе и в конце): public void OnDrag(PointerEventData eventData) { transform.position += (Vector3)eventData.delta; }
  15. Скрипт, который позволяет стрелять различными примитивами, просто вешайте на камеру. В инспекторе можно выбрать тип снаряда и также тип полета (полет по физике или сразу появление снаряда в нужной точке). Также есть галочка с настройкой свечения (лапочка) у снарядов (просто по приколу). Первый скрипт вешайте на камеру, больше ничего не нужно. Со вторым ничего делать не надо, просто положить в проект. Не забудьте назвать файлы по названию скриптов. Код откомментирован, поэтому также может научить вас пользоваться выстрелами, создавать примитивы (без префабов), настраивать их немного в коде. Первый. Скрипт выстрела using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// стеляет снарядами из примитивов, учит создавать примитивы без префабов /// и выбирать их через enum. тип снаряда выбирается в инспекторе, /// вешается на камеру. /// </summary> public class FoamShootPrim : MonoBehaviour { /// <summary> /// Все возможные снаряды /// </summary> enum TypeShell { Cube = PrimitiveType.Cube, Sphere = PrimitiveType.Sphere, Cylinder = PrimitiveType.Cylinder, Capsule = PrimitiveType.Capsule, } /// <summary> /// Какой снаряд выбран для стрельбы в данный момент /// </summary> [SerializeField] TypeShell typeShell = TypeShell.Cylinder; /// <summary> /// Все возможные типы стрельбы /// </summary> enum TypeShooting { Fly, Teleport } /// <summary> /// Какой тип стрельбы выбран сейчас (задается в редакторе) /// </summary> [SerializeField] TypeShooting typeShooting = TypeShooting.Fly; /// <summary> /// камера игрока, откуда пускаем луч (для типа стрельбы Teleport) /// </summary> private Camera cameraPlayer; /// <summary> /// Светиться ли снарядам /// </summary> [SerializeField] bool isLuminescent = false; void Start() { //найти камеру cameraPlayer = GetComponent<Camera>(); } void Update() { //если нажата левая кнопка мышки if (Input.GetMouseButtonDown(0)) { //стреляем Shooting(); } } /// <summary> /// выстрел, создает объект (снаряд) /// </summary> private void Shooting() { //выбираем, какой снаряд создавать switch (typeShell) { case TypeShell.Cube: CreateShell(PrimitiveType.Cube); break; case TypeShell.Sphere: CreateShell(PrimitiveType.Sphere); break; case TypeShell.Cylinder: CreateShell(PrimitiveType.Cylinder); break; case TypeShell.Capsule: CreateShell(PrimitiveType.Capsule); break; default: Debug.Log("Поступил некорректный снаряд, выбрана Sphere"); CreateShell(PrimitiveType.Sphere); break; } } /// <summary> /// Создает снаряд /// </summary> /// <param name="shell">тип примитива (снаряда)</param> void CreateShell(PrimitiveType shell) { //выбираем тип стрельбы if (typeShooting == TypeShooting.Fly) { Fly(shell); } if (typeShooting == TypeShooting.Teleport) { Teleport(shell); } } void Fly(PrimitiveType shell) { //создаем примитив снаряда GameObject shellInstantiate = GameObject.CreatePrimitive(shell); //выставляем ей позицию как у игрока, но на 1 метр вперед, чтобы не цеплялась за его коллайдер shellInstantiate.transform.position = transform.position + transform.forward; //выставляем градус направления shellInstantiate.transform.rotation = transform.rotation; //делаем объект физическим shellInstantiate.AddComponent<Rigidbody>(); //добавляем на него скрипт с его поведением shellInstantiate.AddComponent<FoamShellPrim>(); //если надо подсвечивать снаряд if (isLuminescent) OnLuminescent(shellInstantiate); } void Teleport(PrimitiveType shell) { //определяем центр экрана, откуда стрелять Vector3 point = new Vector3(cameraPlayer.pixelWidth / 2, cameraPlayer.pixelHeight / 2, 0); //пускаем луч оттуда Ray ray = cameraPlayer.ScreenPointToRay(point); //сюда сохраним инфу о попадании луча RaycastHit hit; //если луч куда-то попал if (Physics.Raycast(ray, out hit)) { //создаем примитив GameObject shellInstantiate = GameObject.CreatePrimitive(shell); //переносим в нужное место shellInstantiate.transform.position = hit.point; //если надо подсвечивать снаряд if (isLuminescent) OnLuminescent(shellInstantiate); } } void OnLuminescent (GameObject shellInstantiate) { //делаем объект маленьким shellInstantiate.transform.localScale = new Vector3(0.3f, 0.3f, 0.3f); //добавляем свечение shellInstantiate.AddComponent<Light>(); } } Второй (скрипт снаряда) using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; /// <summary> /// скрипт для снаряда, прилипающего к коллайдерам, имеет импульс (выстрел) /// учит пользоваться импульсом и всякой хрени /// </summary> public class FoamShellPrim : MonoBehaviour { /// <summary> /// скорость полета снаряда /// </summary> private float speedShell = 15; void Start() { //придать импульс GetComponent<Rigidbody>().AddForce(transform.forward * speedShell, ForceMode.Impulse); } //при соприкосновении прилипнуть (заморозиться) private void OnCollisionEnter(Collision collision) { //игнорируем касания игрока (снаряд от него отскакивает, а не проходит сквозь) if (collision.transform.tag != "Player") { //замораживаем снаряд Destroy(gameObject.GetComponent<Rigidbody>()); } } // Update is called once per frame void Update() { } } FoamShellPrim.cs FoamShootPrim.cs
×