Пишем парсеры в Zennoposter на C#. Инструкция для новичков от новичка
Всем привет. Несколько оговорок перед началом:
Куда будем складывать данные – работа с библиотекой Epplus.dll
Полученный результат я предлагаю складывать в таблицу xls с использованием внешней библиотеки Epplus.dll. Преимущество её в том, что можно работать с несколькими листами. Перейдем к установке.
Установка библиотеки EPPlus.dll
Скачать библиотеку можно отсюда (можете качать с официального сайта, но там целая проблема найти кнопку download =) ).
Берем файл EPPlus.dll и кидаем по этому пути:
"C:\Program Files (x86)\ZennoLab\RU\ZennoPoster Pro\ваша версия\Progs\ExternalAssemblies"
В projectMaker во вкладке «Проекты» создаем «ссылки из Gac» и «Директивы using» (щелкните правой кнопкой мыши)
Открываем ссылки из Gac, жмем добавить, жмем обзор, выбираем файл epplus.dll, который должен быть по пути "C:\Program Files (x86)\ZennoLab\RU\ZennoPoster Pro\ваша версия\Progs\ExternalAssemblies"
Теперь открываем «директивы using» и вставляем такой код:
Теперь создаем на компьютере xlsx табличку и можно начинать работать с ней в кубике C#.
В кубике C# в свойствах действия вверху кода прописываем подключение таблицы:
В этот код вам вникать не надо(я и сам его не понимаю). Пускай стоит в самом верху, он нам не мешает. Вам надо лишь прописать свой путь (т.е. вместо «E:\zennoposter - проекты\наша табличка.xlsx» прописать путь до вашей таблицы xlsx, которую мы создали на предыдущем шаге). И вы можете вместо [1] ставить [2] или [3] и т.д. – это номера листов в Excel
Ок. Теперь научимся работать с нашей таблицей. Сначала заполним её чем-нибудь:
Чтобы получить что-то из таблицы, мы используем такой код:
Чтобы записать что-то в таблицу, мы используем такой код:
Чтобы удалить из таблицы какую-то строку или колонку, мы используем такой код:
Для примера удалил строку:
Для подсчета количества строк использовать такой код:
P.S. В Epplus.dll счет начинается не с нуля, а с одного
Учимся находить элементы на странице
Для нахождения элементов будем использовать Xpath. Установите к себе в гугл хром дополнение «Xpath Helper Wizard».
Я вам распишу то, что подходит в 80% случаев. Если захотите капнуть глубже, то почитайте статьи про xpath с предыдущих конкурсов и поизучайте примеры тут - http://www.zvon.org/xxl/XPathTutorial/General_rus/examples.html
Давайте поищем элементы на разных страницах. Начнем с ютуба. Предположим, мы хотим собрать ссылки на видео.
Давайте кратко по теории. Любая страница состоит из html тегов, например:
У этих тегов есть разные атрибуты (чаще всего), например:
Так вот, наша задача – найти нужный нам тег с нужными нам атрибутами. Далее будет понятно.
Итак, наша задача – найти ссылки. Ссылки у нас обозначаются тегом <a>. Идем в хром, жмем по значку xpath helper wizard и во второе поле пишем //a (P.S. Xpath пути всегда начинаются с двух косых черточек //)
Розовое – это все ссылки на странице. Но нам ведь нужны только ссылки на видео, так? Для этого нам надо указать какой-то уникальный атрибут, который есть только у нужных нам ссылок. Сначала посмотрим, что за атрибуты есть у нужных нам ссылок. Нажмем правой кнопкой мыши по нужному нам элементу и выберем «просмотреть код».
Смотрите, какие атрибуты есть у нашей ссылки: id, class, title, ahref, aria-label
Давайте пробовать искать по ним и смотреть, какие элементы будут выделяться. В Xpath Helper Wizard пишем: //a[@id='video-title']
Смотрите, судя по всему выделилось именно то, что нам нужно. Если бы не нашли то, что нужно, то надо было бы пробовать дальше:
Давайте закрепим пройденное. Зайдем сюда (мы хотим спарсить ссылки на ресурсы): https://www.liveinternet.ru/rating/ru/
Жмем правой кнопкой мыши
Смотрим на атрибуты и пробуем искать:
Давайте теперь рассмотрим другие варианты нахождения элемента. Единственное, поясню ещё момент. Вы должны четко понимать, что хотите найти. Давайте зайдем на ozon.ru и опять попробуем найти ссылку:
Смотрите, тут у нас тег span, а не <a>. Если нам нужны ссылки на товары, нам нужна именно ссылка, а не тег span. Как её найти в данном случае? Просто перемещаемся по коду выше (или ниже) и смотрим, что у нас выделяется
Видите, я промотал чуть выше и нашел нашу ссылку.
С этим разобрались. Покажу ещё пару примеров, которые часто используются (например, по каким-то причинам предыдущий способ не помог). Давайте сначала на примере ютуб:
//a[contains(@id, 'video-title')] – найди тег <a>, у которого в атрибуте id содержится video-title (P.S. Тоже самое, как в предыдущем методе, только там было равно, а здесь содержится)
//a[contains(text(), 'ДЖЕРРАРД')] – найди тег a, у которого в тексте есть слово ДЖЕРРАРД
//h3[contains(@class, 'style')]/a[contains(@id, 'video')] – найди сначала тег h3, у которого class содержит style , а затем найди его «ребенка» тег a, у которого id содер жит video. P.S. Под ребенком я подразумеваю, что тег a находится внутри h3.
Вариант для ленивых (предупреждение: пути, сформированные таким образом вряд ли долго проживут)
Хотя тут он выдал вполне себе хороший путь:
//*[@id="video-title"] – означает найди любой тег, у которого id равен video-title. Только project maker будет ругаться на двойные кавычки, вместо них надо вставить одинарные. Вот так: //*[@id='video-title']
И забыл ещё вот что. Смотрите, тут у нас 27 результатов:
Мы можем выбрать любой из них по номеру, но делать это будем в project maker.
Итак, мы научились находить нужные нам элементы. Давайте теперь их сложим в таблицу. Полностью рабочий код для youtube:
P.S. Не забывайте закрывать xls таблицу на компьютере перед выполнением кода, иначе вылезет ошибка
P.P.S. В процессе написания шаблона столкнулся с такой фигней. Данные не парсились, и я не мог понять почему. В project maker автоматически генерируется профиль:
Так вот, у меня генерировался английский профиль и при заходе на ютуб открывалась англоязычная версия сайта. Оказывается, в англоязычной версии нужен уже совершенно другой Xpath путь. Так что перед запуском убедитесь, что у вас сгенерирован русский профиль и открывается русская версия сайта ютуб.
Пробуем писать парсер
Давайте напишем парсер, который будет собирать названия наушников и цену со всех страниц этой категории - https://doctorhead.ru/catalog/naushniki_moscow/
У нас есть 88 страниц, которые надо спарсить. Как мы получим ссылки? Часто это проще сделать вручную, чем писать под это дело код. Смотрите, как формируются у нас страницы:
Как мы их получим? Идем в excel и делаем следующим образом:
Если вы обратили внимание, то тут я убрал косую черту на конце:
Это нужно для размножения в excel. Обычно у сайтов настроен редирект и проблем не возникает, однако здесь такое не катит. Т.е. тут нам нужны ссылки именно такого вида https://doctorhead.ru/catalog/naushniki_moscow/88/. Как мы их получим:
Теперь создадим новый xls файл, дадим названия для столбцов и вставим полученные ссылки в первый столбец:
Этап 2
Итак, мы с вами получили ссылки, с которых будем парсить. Давайте теперь перейдем в Project Maker и напишем код, который будет переходить по этим ссылкам и находить те элементы, что мы хотим спарсить.
Добавим кубик C# код:
Добавим ссылки из gac и директивы Using:
В ссылки из Gac добавим библиотеку epplus.dll
И подключим её, прописав в директивы using:
Теперь в кубике C# подключим таблицу:
Так, теперь нам надо написать код, который будет переходить по ссылкам и находить нужные нам элементы. Логика такая:
Теперь нам надо составить Xpath пути, которые мы пропишем в скобках.
Давайте сначала найдем названия товаров (в коде у нас это zagolovki). Переходим на сайт в гугл хроме, жмем по нужному нам элементу правой кнопкой мыши и выбираем просмотреть код:
Вот мы сразу её нашли:
Мы видим, что нам нужна ссылка (тег <a>) у которой есть атрибут class со значением head_name_item. Пробуем составить Xpath путь (используется плагин для гугл хром Xpath Helper Wizard):
Видим, что нам сходу удалось выделить те элементы, что нужно. Проверим этот XPath путь на других страницах:
Видим, что и здесь всё хорошо. Это мы составили Xpath путь для поиска названий товаров. Давайте пропишем его в коде:
И давайте сразу запоминать, что нам нужно будет получить из найденного элемента: значение какого-то атрибута или текст? В данном случае это текст
Идем дальше. Давайте теперь составим Xpath путь для ценника. Тоже самое: наводимся на ценник, жмем правую кнопку мыши, просмотреть код и находим его в коде:
Видим, что тут тег span, у которого есть class="pi_price_cur". Пробуем составить Xpath путь:
Видим, что всё норм. Добавляем его в код:
Также отметили для себя, что нам нужен будет текст, а не значение какого-то атрибута.
Теперь найдем нашу ссылку. Наводимся, жмем правую кнопку мыши, просмотреть код и находим её в коде:
Код не кажется вам знакомым? Мы его уже находили, когда искали заголовок. Только тогда нам нужен был ТЕКСТ, а теперь нам нужно ЗНАЧЕНИЕ АТРИБУТА HREF.
Раз мы его уже находили, удаляем из кода последнюю строчку, т.к. она лишняя.
В итоге у нас получился вот такой код:
Давайте протестируем, нет ли каких-либо ошибок. Только вместо tabletest.Dimension.Rows поставим, например, 10 (иначе нам придется ждать, пока он обойдет все 88 страниц). Что он должен делать: брать ссылку из таблицы, переходить по ней, находить нужный элемент.
Вроде бы всё норм, ошибок не видно:
Этап 3
Так, идем дальше. Теперь нам надо перебрать в цикле собранные нами данные и сохранить в таблицу.
Для этого прям внутри этого цикла создадим ещё один цикл для перебора наших коллекций. Какая его логика:
Давайте разберем каждую строчку:
Тут вам надо понять логику кода.
Так, это мы с вами сложили названия товаров. Нам также надо сложить с вами ценники и ссылки на сами товары. Давайте это сделаем.
Обратите внимание на получение ссылки. Помните, я говорил, что нам надо запомнить, что мы планируем изъять текст или значение какого атрибута? Так вот, тут нам нужно как раз значение атрибута href найденного нами элемента, а не текст ссылки. Поэтому мы и написали .GetAttribute(“”);
По сути всё, мы закончили. Обязательно закройте на компьютере таблицу xls, иначе project maker выдаст ошибку при попытке сохранения данных.
Давайте пробовать запускать.
У меня не спарсилось название товара и ссылка на товар? Где проблема? Она в Xpath пути. Я там проверял кое-что и специально сделал неправильный XPath путь (а затем забыл изменить обратно), поэтому так. У вас всё должно было отработать норм. Сейчас покажу где (а то вдруг кто-то запутается)
Так, пробуем запустить ещё раз:
Вот теперь всё норм. Осталось нам на 7 строке вместо i<10 написать i<89; чтобы спарсились все страницы.
P.S. Конкретно в этом шаблоне не так как нужно (имею ввиду мне) отрабатывает команда tabletest.Dimension.Rows. Я уже подустал, нету сил разбираться, где я там накосячил, поэтому просто вручную задаем нужное количество страниц и не паримся.
В видео представлена переделка шаблона под себя на примере парсинга вот этой категории - https://zennolab.com/discussion/forums/voprosy-novichkov.16/. Видео записывалось в режиме Live на ноутбуке, поэтому звук не очень и подача довольно хаотична. Косяки вырезать не стал, ставил на паузу когда уж совсем упирался в стену.
Всем привет. Несколько оговорок перед началом:
- Я новичок и статья также предназначена для новичков. Если вы никогда не писали на C#, то можете начать пробовать с этой статьи
- Парсятся довольно простые ресурсы. На более сложных сайтах бывают свои нюансы, но принцип один и тот же.
- Для понимания статьи вам желательно знать самые основы C#. Как вариант можно посмотреть вот эти уроки на ютубе (не мои) - youtube.com/watch?v=DKJIG6LAK6E&list=PLVMmweigHAdrvQAny9LC1C1B8Sw4IcaXL
- Шаблоны написаны на последней версии Project Maker (5.29.4.0), так что не знаю, как они будут отрабатывать на более ранних версиях
- Не рассмотрен многопоток (что конечно плохо), ввиду того, что у меня версия Lite и у меня нет возможности его протестить
- Шаблоны на web (post-get наверняка лучше, но этими знаниями я также не обладаю)
- Код открытый и закомментированный. Можете пользоваться, экспериментировать и т.д.
Куда будем складывать данные – работа с библиотекой Epplus.dll
Полученный результат я предлагаю складывать в таблицу xls с использованием внешней библиотеки Epplus.dll. Преимущество её в том, что можно работать с несколькими листами. Перейдем к установке.
Установка библиотеки EPPlus.dll
Скачать библиотеку можно отсюда (можете качать с официального сайта, но там целая проблема найти кнопку download =) ).
Берем файл EPPlus.dll и кидаем по этому пути:
"C:\Program Files (x86)\ZennoLab\RU\ZennoPoster Pro\ваша версия\Progs\ExternalAssemblies"
В projectMaker во вкладке «Проекты» создаем «ссылки из Gac» и «Директивы using» (щелкните правой кнопкой мыши)
Открываем ссылки из Gac, жмем добавить, жмем обзор, выбираем файл epplus.dll, который должен быть по пути "C:\Program Files (x86)\ZennoLab\RU\ZennoPoster Pro\ваша версия\Progs\ExternalAssemblies"
Теперь открываем «директивы using» и вставляем такой код:
C#:
using OfficeOpenXml;
using OfficeOpenXml.Style;
Теперь создаем на компьютере xlsx табличку и можно начинать работать с ней в кубике C#.
В кубике C# в свойствах действия вверху кода прописываем подключение таблицы:
C#:
//начало: подключение таблицы
var package = new ExcelPackage(new FileInfo(@"E:\zennoposter - проекты\для конкурса\наша табличка.xlsx")); //путь к табличке
ExcelWorksheet tabletest = package.Workbook.Worksheets[1]; //где tabletest - имя(любое) – лучше вообще никогда не менять, а 1 - номер листа в excel
//конец: подключение таблицы
В этот код вам вникать не надо(я и сам его не понимаю). Пускай стоит в самом верху, он нам не мешает. Вам надо лишь прописать свой путь (т.е. вместо «E:\zennoposter - проекты\наша табличка.xlsx» прописать путь до вашей таблицы xlsx, которую мы создали на предыдущем шаге). И вы можете вместо [1] ставить [2] или [3] и т.д. – это номера листов в Excel
Ок. Теперь научимся работать с нашей таблицей. Сначала заполним её чем-нибудь:
Чтобы получить что-то из таблицы, мы используем такой код:
C#:
string test1 = Convert.ToString(tabletest.GetValue(1,1)); //заносим в переменную test1 значение в 1 строке 1 столбце
return test1; //return означает, что тут мы прервем выполнение кода (т.е. всё, что идет после return выполняться не будет) и выведем в лог значение переменной test1
Чтобы записать что-то в таблицу, мы используем такой код:
C#:
tabletest.SetValue(1,2,"новая строка"); //в 1 строку 2 столбец запиши фразу новая строка
package.Save(); //сохрани изменения
Чтобы удалить из таблицы какую-то строку или колонку, мы используем такой код:
C#:
tabletest.DeleteRow(1); //удалить строку
tabletest.DeleteColumn(1); //удалить колонку
package.Save(); //сохранение изменений
Для примера удалил строку:
Для подсчета количества строк использовать такой код:
C#:
string test = tabletest.Dimension.Rows.ToString(); //считаем количество строк
return test;
P.S. В Epplus.dll счет начинается не с нуля, а с одного
Учимся находить элементы на странице
Для нахождения элементов будем использовать Xpath. Установите к себе в гугл хром дополнение «Xpath Helper Wizard».
Я вам распишу то, что подходит в 80% случаев. Если захотите капнуть глубже, то почитайте статьи про xpath с предыдущих конкурсов и поизучайте примеры тут - http://www.zvon.org/xxl/XPathTutorial/General_rus/examples.html
Давайте поищем элементы на разных страницах. Начнем с ютуба. Предположим, мы хотим собрать ссылки на видео.
Давайте кратко по теории. Любая страница состоит из html тегов, например:
- <p>
- <a>
- <span>
- <div> и т.д.
У этих тегов есть разные атрибуты (чаще всего), например:
- <p class=”vacy”>какой-то текст </p>
- <a href=”http://site.ru” id=”ssylk” class=”tver”>ссылка</a>
Так вот, наша задача – найти нужный нам тег с нужными нам атрибутами. Далее будет понятно.
Итак, наша задача – найти ссылки. Ссылки у нас обозначаются тегом <a>. Идем в хром, жмем по значку xpath helper wizard и во второе поле пишем //a (P.S. Xpath пути всегда начинаются с двух косых черточек //)
Розовое – это все ссылки на странице. Но нам ведь нужны только ссылки на видео, так? Для этого нам надо указать какой-то уникальный атрибут, который есть только у нужных нам ссылок. Сначала посмотрим, что за атрибуты есть у нужных нам ссылок. Нажмем правой кнопкой мыши по нужному нам элементу и выберем «просмотреть код».
Смотрите, какие атрибуты есть у нашей ссылки: id, class, title, ahref, aria-label
Давайте пробовать искать по ним и смотреть, какие элементы будут выделяться. В Xpath Helper Wizard пишем: //a[@id='video-title']
Смотрите, судя по всему выделилось именно то, что нам нужно. Если бы не нашли то, что нужно, то надо было бы пробовать дальше:
Давайте закрепим пройденное. Зайдем сюда (мы хотим спарсить ссылки на ресурсы): https://www.liveinternet.ru/rating/ru/
Жмем правой кнопкой мыши
Смотрим на атрибуты и пробуем искать:
Давайте теперь рассмотрим другие варианты нахождения элемента. Единственное, поясню ещё момент. Вы должны четко понимать, что хотите найти. Давайте зайдем на ozon.ru и опять попробуем найти ссылку:
Смотрите, тут у нас тег span, а не <a>. Если нам нужны ссылки на товары, нам нужна именно ссылка, а не тег span. Как её найти в данном случае? Просто перемещаемся по коду выше (или ниже) и смотрим, что у нас выделяется
Видите, я промотал чуть выше и нашел нашу ссылку.
С этим разобрались. Покажу ещё пару примеров, которые часто используются (например, по каким-то причинам предыдущий способ не помог). Давайте сначала на примере ютуб:
//a[contains(@id, 'video-title')] – найди тег <a>, у которого в атрибуте id содержится video-title (P.S. Тоже самое, как в предыдущем методе, только там было равно, а здесь содержится)
//a[contains(text(), 'ДЖЕРРАРД')] – найди тег a, у которого в тексте есть слово ДЖЕРРАРД
//h3[contains(@class, 'style')]/a[contains(@id, 'video')] – найди сначала тег h3, у которого class содержит style , а затем найди его «ребенка» тег a, у которого id содер жит video. P.S. Под ребенком я подразумеваю, что тег a находится внутри h3.
Вариант для ленивых (предупреждение: пути, сформированные таким образом вряд ли долго проживут)
Хотя тут он выдал вполне себе хороший путь:
//*[@id="video-title"] – означает найди любой тег, у которого id равен video-title. Только project maker будет ругаться на двойные кавычки, вместо них надо вставить одинарные. Вот так: //*[@id='video-title']
И забыл ещё вот что. Смотрите, тут у нас 27 результатов:
Мы можем выбрать любой из них по номеру, но делать это будем в project maker.
Итак, мы научились находить нужные нам элементы. Давайте теперь их сложим в таблицу. Полностью рабочий код для youtube:
C#:
HtmlElementCollection luboe_imy = null; //все HtmlElementCollection лучше объявлять в самом верху
//начало: подключение таблицы
var package = new ExcelPackage(new FileInfo(@"E:\zennoposter - проекты\для конкурса\наша табличка.xlsx")); //путь к табличке
ExcelWorksheet tabletest = package.Workbook.Worksheets[1]; //где tabletest - имя(любое) – лучше вообще никогда не менять, а 1 - номер листа в excel
//конец: подключение таблицы
instance.ActiveTab.Navigate("https://youtube.com"); //переходим на сайт
instance.ActiveTab.WaitDownloading(); //дожидаемся загрузки страницы
luboe_imy = instance.ActiveTab.FindElementsByXPath("//a[@id='video-title']"); //парсим данные: Xpath путь
for(int i=1; i<luboe_imy.Count; i++) //цикл перебора найденных элементов. luboe_imy.Count означает, что цикл будет крутиться до тех пор, пока не закончатся все найденные нами элементы
{
string ssylk = luboe_imy.GetByNumber(i).GetAttribute("href"); //ложим в переменную ssylk атрибут href нашего элемента
project.SendInfoToLog(ssylk); //выводим в лог для самопроверки
tabletest.SetValue(i,2, ssylk); //записываем данные в таблицу: строка, столбец, что записываем
}
package.Save(); //сохраняем в таблицу
P.S. Не забывайте закрывать xls таблицу на компьютере перед выполнением кода, иначе вылезет ошибка
P.P.S. В процессе написания шаблона столкнулся с такой фигней. Данные не парсились, и я не мог понять почему. В project maker автоматически генерируется профиль:
Так вот, у меня генерировался английский профиль и при заходе на ютуб открывалась англоязычная версия сайта. Оказывается, в англоязычной версии нужен уже совершенно другой Xpath путь. Так что перед запуском убедитесь, что у вас сгенерирован русский профиль и открывается русская версия сайта ютуб.
Пробуем писать парсер
Давайте напишем парсер, который будет собирать названия наушников и цену со всех страниц этой категории - https://doctorhead.ru/catalog/naushniki_moscow/
У нас есть 88 страниц, которые надо спарсить. Как мы получим ссылки? Часто это проще сделать вручную, чем писать под это дело код. Смотрите, как формируются у нас страницы:
- https://doctorhead.ru/catalog/naushniki_moscow/2/
- https://doctorhead.ru/catalog/naushniki_moscow/3/
- https://doctorhead.ru/catalog/naushniki_moscow/4/
- и т.д. до 88 страницы (https://doctorhead.ru/catalog/naushniki_moscow/88/)
Как мы их получим? Идем в excel и делаем следующим образом:
Если вы обратили внимание, то тут я убрал косую черту на конце:
- было https://doctorhead.ru/catalog/naushniki_moscow/88/
- а я сделал https://doctorhead.ru/catalog/naushniki_moscow/88
Это нужно для размножения в excel. Обычно у сайтов настроен редирект и проблем не возникает, однако здесь такое не катит. Т.е. тут нам нужны ссылки именно такого вида https://doctorhead.ru/catalog/naushniki_moscow/88/. Как мы их получим:
Теперь создадим новый xls файл, дадим названия для столбцов и вставим полученные ссылки в первый столбец:
Этап 2
Итак, мы с вами получили ссылки, с которых будем парсить. Давайте теперь перейдем в Project Maker и напишем код, который будет переходить по этим ссылкам и находить те элементы, что мы хотим спарсить.
Добавим кубик C# код:
Добавим ссылки из gac и директивы Using:
В ссылки из Gac добавим библиотеку epplus.dll
И подключим её, прописав в директивы using:
C#:
using OfficeOpenXml;
using OfficeOpenXml.Style;
Теперь в кубике C# подключим таблицу:
Так, теперь нам надо написать код, который будет переходить по ссылкам и находить нужные нам элементы. Логика такая:
- берем ссылку из таблицы
- переходим по ней
- находим название наушников, цену наушников, ссылку на наушники
- повторяем снова, пока не кончатся все наши ссылки
Теперь нам надо составить Xpath пути, которые мы пропишем в скобках.
Давайте сначала найдем названия товаров (в коде у нас это zagolovki). Переходим на сайт в гугл хроме, жмем по нужному нам элементу правой кнопкой мыши и выбираем просмотреть код:
Вот мы сразу её нашли:
Мы видим, что нам нужна ссылка (тег <a>) у которой есть атрибут class со значением head_name_item. Пробуем составить Xpath путь (используется плагин для гугл хром Xpath Helper Wizard):
Видим, что нам сходу удалось выделить те элементы, что нужно. Проверим этот XPath путь на других страницах:
Видим, что и здесь всё хорошо. Это мы составили Xpath путь для поиска названий товаров. Давайте пропишем его в коде:
И давайте сразу запоминать, что нам нужно будет получить из найденного элемента: значение какого-то атрибута или текст? В данном случае это текст
Идем дальше. Давайте теперь составим Xpath путь для ценника. Тоже самое: наводимся на ценник, жмем правую кнопку мыши, просмотреть код и находим его в коде:
Видим, что тут тег span, у которого есть class="pi_price_cur". Пробуем составить Xpath путь:
Видим, что всё норм. Добавляем его в код:
Также отметили для себя, что нам нужен будет текст, а не значение какого-то атрибута.
Теперь найдем нашу ссылку. Наводимся, жмем правую кнопку мыши, просмотреть код и находим её в коде:
Код не кажется вам знакомым? Мы его уже находили, когда искали заголовок. Только тогда нам нужен был ТЕКСТ, а теперь нам нужно ЗНАЧЕНИЕ АТРИБУТА HREF.
Раз мы его уже находили, удаляем из кода последнюю строчку, т.к. она лишняя.
В итоге у нас получился вот такой код:
Давайте протестируем, нет ли каких-либо ошибок. Только вместо tabletest.Dimension.Rows поставим, например, 10 (иначе нам придется ждать, пока он обойдет все 88 страниц). Что он должен делать: брать ссылку из таблицы, переходить по ней, находить нужный элемент.
Вроде бы всё норм, ошибок не видно:
Этап 3
Так, идем дальше. Теперь нам надо перебрать в цикле собранные нами данные и сохранить в таблицу.
Для этого прям внутри этого цикла создадим ещё один цикл для перебора наших коллекций. Какая его логика:
- берем первый элемент из коллекции, достаем оттуда нужное значение
- записываем это значение в таблицу
- повторяем до тех пор, пока не закончатся элементы в коллекции
Давайте разберем каждую строчку:
- for(int k=0; k<cennik.Count; k++) {} – поскольку у нас в коллекции содержится множество элементов, чтобы их вытащить, нужен счетчик. При этом счетчик крутиться до тех пор, пока k меньше чем количество элементов в коллекции (k<cennik.Count)
- string zag = zagolovki.GetByNumber(z).InnerText; - тут мы с вами вытаскиваем конкретную строчку из нашей коллекции. Изначально z = 0. Т.е. мы получаем нулевую строку. При следующей итерации z станет равным 1, и мы получим следующую строку и т.д. Обратите внимание, где именно мы объявили этот счетчик (в предыдущем цикле).
- tabletest.SetValue(a,2,zag); - тут мы записываем в таблицу. Вместо a будет подставлено 2, значит, при первой итерации мы запишем с вами в 2 строку 2 столбец. При следующей итерации a станет равной 3 и данные запишутся в 3 строку 2 столбец
- package.Save(); - нужно для сохранение данных в таблицу на компьютере
- z++ - нам надо увеличить значение z на единицу, чтобы в следующем круге он взял уже следующий элемент
- a++ - нам надо увеличить значение a на единицу, чтобы в следующем круге он записывал уже на следующую строку
Тут вам надо понять логику кода.
Так, это мы с вами сложили названия товаров. Нам также надо сложить с вами ценники и ссылки на сами товары. Давайте это сделаем.
Обратите внимание на получение ссылки. Помните, я говорил, что нам надо запомнить, что мы планируем изъять текст или значение какого атрибута? Так вот, тут нам нужно как раз значение атрибута href найденного нами элемента, а не текст ссылки. Поэтому мы и написали .GetAttribute(“”);
По сути всё, мы закончили. Обязательно закройте на компьютере таблицу xls, иначе project maker выдаст ошибку при попытке сохранения данных.
Давайте пробовать запускать.
У меня не спарсилось название товара и ссылка на товар? Где проблема? Она в Xpath пути. Я там проверял кое-что и специально сделал неправильный XPath путь (а затем забыл изменить обратно), поэтому так. У вас всё должно было отработать норм. Сейчас покажу где (а то вдруг кто-то запутается)
Так, пробуем запустить ещё раз:
Вот теперь всё норм. Осталось нам на 7 строке вместо i<10 написать i<89; чтобы спарсились все страницы.
P.S. Конкретно в этом шаблоне не так как нужно (имею ввиду мне) отрабатывает команда tabletest.Dimension.Rows. Я уже подустал, нету сил разбираться, где я там накосячил, поэтому просто вручную задаем нужное количество страниц и не паримся.
В видео представлена переделка шаблона под себя на примере парсинга вот этой категории - https://zennolab.com/discussion/forums/voprosy-novichkov.16/. Видео записывалось в режиме Live на ноутбуке, поэтому звук не очень и подача довольно хаотична. Косяки вырезать не стал, ставил на паузу когда уж совсем упирался в стену.
- Номер конкурса статей
- Одиннадцатый конкурс статей
- Тема статьи
- Парсинг
Вложения
Последнее редактирование модератором:




)