Пример #1
0
        /// <summary>
        /// Парсинг изображений
        /// </summary>
        /// <param name="drv"></param>
        /// <param name="mng"></param>
        public void parseMangaImageUrls(IWebDriver drv, Manga mng)
        {
            List <String> subImages = new List <String>();

            for (int i = 0; i < 1; i++)
            {
                drv.Navigate().GoToUrl(Chapters[i].Substring(0, Chapters[i].IndexOf("|")));
                int LastPage = int.Parse(drv.FindElement(By.XPath(@"//span[@class='pages-count']")).Text) - 1;
                for (int j = 0; j <= LastPage; j++)
                {
                    drv.Navigate().GoToUrl(Chapters[i].Substring(0, Chapters[i].IndexOf("|")) + "#page=" + j);
                    drv.Navigate().Refresh();
                    drv.FindElement(By.XPath(@"//img[@id='mangaPicture']")).GetAttribute("src");
                    subImages.Add(drv.FindElement(By.XPath(@"//img[@id='mangaPicture']")).GetAttribute("src"));
                }
                mng.Images.Add(new List <string>(subImages));
            }
        }
Пример #2
0
        public MainWindow()
        {
            InitializeComponent();

            Stopwatch stopwatch = new Stopwatch();              //создание объекта класса Stopwatch

            stopwatch.Start();                                  //таймер
            Scraper sp = new Scraper();                         //создание объекта класса

            sp.SetMainUrl("https://readmanga.live/list");       //ссылка для получения полного списка манги
            var options = new EdgeOptions();                    //задание опций для Edge

            options.UseChromium = true;                         //включение хромиума

            using (IWebDriver driver = new EdgeDriver(options)) //основная работа парсера
            {
                WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(15));
                driver.Navigate().GoToUrl(sp.GetMainUrl()); //переход на сайт
                Manga mg = new Manga();                     //создание объекта mg класса Manga
                sp.ParseFirstPage(driver, sp);              //парсинг первой страницы с каталогом манг

                #region rotating to every page and get page url

                var l = 0;                                          //счетчик
                //while(driver.FindElements(By.XPath(@"//a[@class='nextLink']")).Count > 0) //парсинг всех страниц //откоментировать когда будет готов парсер
                while (l < 1)                                       //закоментировать когда будет готов парсер
                {
                    driver.Navigate().GoToUrl(sp.getNextPageUrl()); //переход на следующую страницу
                    sp.ParseAllPages(driver);
                    l++;
                }

                #endregion

                List <Manga>  MangaList  = new List <Manga>(); //создание списка MangaList
                List <Manhua> ManhuaList = new List <Manhua>();
                List <Manhwa> ManhwaList = new List <Manhwa>();

                #region navigate to current content page and parse data from it

                /*   Парсинг конкректной страницы   */
                //for (int j = 0; j < sp.GetMangaUrl().Count; j++) //парсинг манги
                for (int j = 0; j < 6; j++)
                {
                    Manga  mng = new Manga();                       //создание объекта mng класса Manga
                    Manhwa mnh = new Manhwa();                      //создание объекта mnh класса Manhwa
                    Manhua mna = new Manhua();                      //создание объекта mna класса Manhua
                    driver.Navigate().GoToUrl(sp.GetMangaUrl()[j]); //переход по страницам

                    /*   Раскрытие скрытых жанров   */
                    if (driver.FindElements(By.XPath(@"//p[@class='elementList']/span[@class='js-link']")).Count > 0)
                    {
                        driver.FindElement(By.XPath(@"//p[@class='elementList']/span[@class='js-link']")).Click(); //имитация клика
                    }

                    /*   Парсинг манги   */
                    if (driver.FindElements(By.XPath(@"//span[@class='elem_category ']/a")).Count == 0)
                    {
                        #region parse manga

                        mng.getMangaContent(driver, mng); //получение данных
                        mng.parseMangaImageUrls(driver, mng);
                        MangaList.Add(mng);               //запись объе в список

                        #endregion
                    }
                    else
                    {
                        #region parse manhwa

                        /*   Парсинг манхвы   */
                        if (driver.FindElements(By.XPath(@"//span[@class='elem_category ']/a"))[0].Text == "Манхва")
                        {
                            mnh.getManhwaContent(driver, mnh); //получение данных
                            ManhwaList.Add(mnh);               //запись объе в список
                        }

                        #endregion

                        #region parse manhua
                        /*   Парсинг маньхуа   */
                        if (driver.FindElements(By.XPath(@"//span[@class='elem_category ']/a"))[0].Text == "Маньхуа")
                        {
                            mna.getManhuaContent(driver, mna); //получение данных
                            ManhuaList.Add(mna);               //запись объе в список
                        }
                        #endregion
                    }
                }

                #endregion

                #region tree creating

                /* Формирование дерерва объектов   */
                for (int i = 0; i < MangaList.Count; i++)
                {
                    var mainTree = new TreeViewItem();
                    mainTree.Header = MangaList[i].Category + " { " + i + " } ";

                    /*   Формирование названия   */
                    var title = new TreeViewItem();
                    title.Header = "Название";
                    title.Items.Add(MangaList[i].Title);
                    mainTree.Items.Add(title);

                    if (MangaList[i].OtherTitles.Count > 0)
                    {
                        /*   Формирование других названий   */
                        var otherTitles = new TreeViewItem();
                        otherTitles.Header = "Другие названия";
                        foreach (var _otherTitles in MangaList[i].OtherTitles)
                        {
                            otherTitles.Items.Add(_otherTitles);
                        }
                        mainTree.Items.Add(otherTitles);
                    }

                    /*  Формирование описания   */
                    var description = new TreeViewItem();
                    description.Header = "Описание";
                    description.Items.Add(MangaList[i].Description);
                    mainTree.Items.Add(description);

                    /*   Формирование кол-ва томов   */
                    var volumeNumber = new TreeViewItem();
                    volumeNumber.Header = "Кол-во томов";
                    volumeNumber.Items.Add(MangaList[i].VolumeNumber);
                    mainTree.Items.Add(volumeNumber);

                    /*   Формировнаие кол-ва глав   */
                    var chapterNumber = new TreeViewItem();
                    chapterNumber.Header = "Кол-во глав";
                    chapterNumber.Items.Add(MangaList[i].ChapterNumber);
                    mainTree.Items.Add(chapterNumber);

                    /*   Формирование года выпуска   */
                    var releaseYear = new TreeViewItem();
                    releaseYear.Header = "Год выпуска";
                    releaseYear.Items.Add(MangaList[i].ReleaseYear);
                    mainTree.Items.Add(releaseYear);

                    /*   Формирование статуса перевода   */
                    var translateStatus = new TreeViewItem();
                    translateStatus.Header = "Статус перевода";
                    translateStatus.Items.Add(MangaList[i].TranslateStatus);
                    mainTree.Items.Add(translateStatus);

                    /*   Формирование списка переводчиков   */
                    var translators = new TreeViewItem();
                    translators.Header = "Переводчики";
                    foreach (var _translator in MangaList[i].Tranlators)
                    {
                        translators.Items.Add(_translator);
                    }
                    mainTree.Items.Add(translators);

                    /*   Формирование списка глав   */
                    var chapters = new TreeViewItem();
                    chapters.Header = "Главы";
                    foreach (var _chapters in MangaList[i].Chapters)
                    {
                        chapters.Items.Add(_chapters);
                    }
                    mainTree.Items.Add(chapters);

                    /*   Формирование списка художников   */
                    if (MangaList[i].Painter != null)
                    {
                        var painter = new TreeViewItem();
                        painter.Header = "Художник";
                        painter.Items.Add(MangaList[i].Painter);
                        mainTree.Items.Add(painter);
                    }

                    /*   Формирование списка авторов*/
                    if (MangaList[i].Author != null)
                    {
                        var author = new TreeViewItem();
                        author.Header = "Автор";
                        author.Items.Add(MangaList[i].Author);
                        mainTree.Items.Add(author);
                    }

                    /*   Формирование списка сценаристов   */
                    if (MangaList[i].Screenwriter != null)
                    {
                        var screenwriter = new TreeViewItem();
                        screenwriter.Header = "Сценарист";
                        screenwriter.Items.Add(MangaList[i].Screenwriter);
                        mainTree.Items.Add(screenwriter);
                    }

                    TreeView.Items.Add(mainTree);
                }

                #endregion
                stopwatch.Stop(); //отключение таймера
                var time = stopwatch.Elapsed;
                /*   Формирование времени   */
                Timer.Content += String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
                                               time.Hours, time.Minutes, time.Seconds,
                                               time.Milliseconds / 10);
                Fail.Content        += sp.getErrorMessage();
                FailCounter.Content += sp.getFailCounter().ToString();
            }
        }
Пример #3
0
        /// <summary>
        /// Парсинг информации о манге
        /// </summary>
        /// <param name="drv"></param>
        public void getMangaContent(IWebDriver drv, Manga mng)
        {
            Scraper srp = new Scraper();

            srp.setFailCounter();
            mng.Category = "Манга";
            try
            {
                /*   Получение названия манги   */
                mng.Title = drv.FindElement(By.XPath(@"//span[@class='name']")).Text;
            }
            catch (Exception e)
            {
                srp.setFailCounter(+1);
                srp.setErrorMessage(e.Message + e.StackTrace);
            }

            try
            {
                /*   Получение английского названия   */
                mng.OtherTitles.Add(drv.FindElement(By.XPath(@"//span[@class='eng-name']")).Text);
            }
            catch (Exception e)
            {
                srp.setFailCounter(+1);
                srp.setErrorMessage(e.Message + e.StackTrace);
            }

            try
            {
                /*   Получение оригинального названия   */
                mng.OtherTitles.Add(drv.FindElement(By.XPath(@"//span[@class='original-name']")).Text);
            }
            catch (Exception e)
            {
                srp.setFailCounter(+1);
                srp.setErrorMessage(e.Message + e.StackTrace);
            }

            try
            {
                /*   получение задней картины   */
                mng.BackgroundImg = drv.FindElements(By.XPath(@"//img[@class='fotorama__img']"))[0].GetAttribute("src");
            }
            catch (Exception e)
            {
                srp.setFailCounter(+1);
                srp.setErrorMessage(e.Message + e.StackTrace);
            }

            try
            {
                /*   Получение кол-ва томов   */
                var str = Regex.Replace(drv.FindElement(By.XPath(@"//tbody/tr[1]/td[1]/a")).Text, @"[^\d|^-]", "");
                mng.VolumeNumber = byte.Parse(str.Substring(0, str.IndexOf("-")));
            }
            catch (Exception e)
            {
                srp.setFailCounter(+1);
                srp.setErrorMessage(e.Message + e.StackTrace);
            }

            try
            {
                /*   получение статуса перевода   */
                mng.TranslateStatus = Regex.Replace(drv.FindElement(By.XPath(@"//div[@class='subject-meta col-sm-7']/p[2]")).Text, @"Перевод: ", "");
            }
            catch (Exception e)
            {
                srp.setFailCounter(+1);
                srp.setErrorMessage(e.Message + e.StackTrace);
            }

            try
            {
                /*   получение года выпуска   */
                mng.ReleaseYear = ushort.Parse(drv.FindElement(By.XPath(@"//span[@class='elem_year ']/a")).Text);
            }
            catch (Exception e)
            {
                srp.setFailCounter(+1);
                srp.setErrorMessage(e.Message + e.StackTrace);
            }

            try
            {
                /*   Получение списка жанров   */
                ICollection <IWebElement> genres        = drv.FindElements(By.XPath(@"//span[@class='elem_genre ']/a"));                           //подготовка данных к заненсению в список Genres
                ICollection <IWebElement> hidden_genres = drv.FindElements(By.XPath(@"//p[@class='elementList']/span[@class='elem_genre hide']")); //подготовка скрытых данных к занесению в список Genres
                foreach (var gnrs in genres)                                                                                                       //запись данных в список Genres
                {
                    mng.Genres.Add(gnrs.Text);
                }
                foreach (var hdn_genres in hidden_genres) //запись данных в список Genres
                {
                    mng.Genres.Add(Regex.Replace(hdn_genres.Text, ", ", ""));
                }
            }
            catch (Exception e)
            {
                srp.setFailCounter(+1);
                srp.setErrorMessage(e.Message + e.StackTrace);
            }

            try
            {
                /*   Получение художника   */
                mng.Painter = drv.FindElement(By.XPath(@"//span[@class='elem_illustrator ']/a")).Text;
            }
            catch (Exception e)
            {
                srp.setFailCounter(+1);
                srp.setErrorMessage(e.Message + e.StackTrace);
            }

            try
            {
                /*   Получение художника   */
                mng.Author = drv.FindElement(By.XPath(@"//span[@class='elem_author ']/a")).Text;
            }
            catch (Exception e)
            {
                srp.setFailCounter(+1);
                srp.setErrorMessage(e.Message + e.StackTrace);
            }

            try
            {
                /*   Получение сценариста   */
                mng.Screenwriter = drv.FindElement(By.XPath(@"//span[@class='elem_screenwriter ']/a")).Text;
            }
            catch (Exception e)
            {
                srp.setFailCounter(+1);
                srp.setErrorMessage(e.Message + e.StackTrace);
            }

            try
            {
                /*   Получение описания   */
                mng.Description = drv.FindElement(By.XPath(@"//div[@class='manga-description']")).Text;
            }
            catch (Exception e)
            {
                srp.setFailCounter(+1);
                srp.setErrorMessage(e.Message + e.StackTrace);
            }

            try
            {
                /*   Получение ссылок на главы   */
                ICollection <IWebElement> chapter = drv.FindElements(By.XPath(@"//a[@class='cp-l']"));
                foreach (var ch in chapter)
                {
                    mng.Chapters.Add(ch.GetAttribute("href") + "|" + ch.Text);
                }
            }
            catch (Exception e)
            {
                srp.setFailCounter(+1);
                srp.setErrorMessage(e.Message + e.StackTrace);
            }

            try
            {
                /*   Получение количества глав   */
                mng.ChapterNumber = Convert.ToUInt16(mng.Chapters.Count);
            }

            catch (Exception e)
            {
                srp.setFailCounter(+1);
                srp.setErrorMessage(e.Message + e.StackTrace);
            }


            try
            {
                /*   Получение списка журналов   */
                ICollection <IWebElement> magazines = drv.FindElements(By.XPath(@"//span[@class='elem_magazine ']/a"));
                foreach (var _magazine in magazines)
                {
                    mng.Magazines.Add(_magazine.Text);
                }
            }
            catch (Exception e)
            {
                srp.setFailCounter(+1);
                srp.setErrorMessage(e.Message + e.StackTrace);
            }

            try
            {
                /*   Получение списка переводчиков   */
                ICollection <IWebElement> translators = drv.FindElements(By.XPath(@"//span[@class='elem_translator ']/a"));
                foreach (var _translator in translators)
                {
                    mng.Tranlators.Add(_translator.Text);
                }
            }
            catch (Exception e)
            {
                srp.setFailCounter(+1);
                srp.setErrorMessage(e.Message + e.StackTrace);
            }

            try
            {
                /*   Получение списка издательств   */
                ICollection <IWebElement> publishings = drv.FindElements(By.XPath(@"//span[@class='elem_publisher ']"));
                foreach (var _publishing in publishings)
                {
                    mng.Publishings.Add(Regex.Replace(_publishing.Text, ", | ", ""));
                }
            }
            catch (Exception e)
            {
                srp.setFailCounter(+1);
                srp.setErrorMessage(e.Message + e.StackTrace);
            }
        }