Пишем парсеры в Zennoposter на C#. Инструкция для новичков от новичка

volody00

Client
Регистрация
06.09.2016
Сообщения
918
Благодарностей
953
Баллы
93
Пишем парсеры в Zennoposter на C#. Инструкция для новичков от новичка

Всем привет. Несколько оговорок перед началом:

  • Я новичок и статья также предназначена для новичков. Если вы никогда не писали на 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» (щелкните правой кнопкой мыши)

image001.png


image003.png


Открываем ссылки из Gac, жмем добавить, жмем обзор, выбираем файл epplus.dll, который должен быть по пути "C:\Program Files (x86)\ZennoLab\RU\ZennoPoster Pro\ваша версия\Progs\ExternalAssemblies"

image005.png



Теперь открываем «директивы using» и вставляем такой код:

C#:
using OfficeOpenXml;
using OfficeOpenXml.Style;
image007.png


Теперь создаем на компьютере xlsx табличку и можно начинать работать с ней в кубике C#.

image009.png




В кубике 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

Ок. Теперь научимся работать с нашей таблицей. Сначала заполним её чем-нибудь:

image011.png



Чтобы получить что-то из таблицы, мы используем такой код:

C#:
string test1 = Convert.ToString(tabletest.GetValue(1,1)); //заносим в переменную test1 значение в 1 строке 1 столбце

return test1; //return означает, что тут мы прервем выполнение кода (т.е. всё, что идет после  return выполняться не будет) и выведем в лог значение переменной test1
image013.png


Чтобы записать что-то в таблицу, мы используем такой код:

C#:
tabletest.SetValue(1,2,"новая строка"); //в 1 строку 2 столбец запиши фразу новая строка

package.Save(); //сохрани изменения
image015.png


Чтобы удалить из таблицы какую-то строку или колонку, мы используем такой код:

C#:
tabletest.DeleteRow(1); //удалить строку

tabletest.DeleteColumn(1); //удалить колонку

package.Save(); //сохранение изменений
Для примера удалил строку:

image017.png


Для подсчета количества строк использовать такой код:

C#:
string test = tabletest.Dimension.Rows.ToString(); //считаем количество строк
return test;
image019.png


P.S. В Epplus.dll счет начинается не с нуля, а с одного


Учимся находить элементы на странице


Для нахождения элементов будем использовать Xpath. Установите к себе в гугл хром дополнение «Xpath Helper Wizard».

Я вам распишу то, что подходит в 80% случаев. Если захотите капнуть глубже, то почитайте статьи про xpath с предыдущих конкурсов и поизучайте примеры тут - http://www.zvon.org/xxl/XPathTutorial/General_rus/examples.html

Давайте поищем элементы на разных страницах. Начнем с ютуба. Предположим, мы хотим собрать ссылки на видео.

image021.png


Давайте кратко по теории. Любая страница состоит из 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 пути всегда начинаются с двух косых черточек //)

image023.png


Розовое – это все ссылки на странице. Но нам ведь нужны только ссылки на видео, так? Для этого нам надо указать какой-то уникальный атрибут, который есть только у нужных нам ссылок. Сначала посмотрим, что за атрибуты есть у нужных нам ссылок. Нажмем правой кнопкой мыши по нужному нам элементу и выберем «просмотреть код».

image025.png


Смотрите, какие атрибуты есть у нашей ссылки: id, class, title, ahref, aria-label

image027.png


Давайте пробовать искать по ним и смотреть, какие элементы будут выделяться. В Xpath Helper Wizard пишем: //a[@id='video-title']

image029.png


Смотрите, судя по всему выделилось именно то, что нам нужно. Если бы не нашли то, что нужно, то надо было бы пробовать дальше:

image031.png


Давайте закрепим пройденное. Зайдем сюда (мы хотим спарсить ссылки на ресурсы): https://www.liveinternet.ru/rating/ru/

image033.png


Жмем правой кнопкой мыши

image035.png


Смотрим на атрибуты и пробуем искать:

image037.png


image039.png


Давайте теперь рассмотрим другие варианты нахождения элемента. Единственное, поясню ещё момент. Вы должны четко понимать, что хотите найти. Давайте зайдем на ozon.ru и опять попробуем найти ссылку:

image041.png


image043.png


Смотрите, тут у нас тег span, а не <a>. Если нам нужны ссылки на товары, нам нужна именно ссылка, а не тег span. Как её найти в данном случае? Просто перемещаемся по коду выше (или ниже) и смотрим, что у нас выделяется

image045.png


Видите, я промотал чуть выше и нашел нашу ссылку.

С этим разобрались. Покажу ещё пару примеров, которые часто используются (например, по каким-то причинам предыдущий способ не помог). Давайте сначала на примере ютуб:

//a[contains(@id, 'video-title')] – найди тег <a>, у которого в атрибуте id содержится video-title (P.S. Тоже самое, как в предыдущем методе, только там было равно, а здесь содержится)

image047.png


//a[contains(text(), 'ДЖЕРРАРД')] – найди тег a, у которого в тексте есть слово ДЖЕРРАРД

image049.png


//h3[contains(@class, 'style')]/a[contains(@id, 'video')] – найди сначала тег h3, у которого class содержит style , а затем найди его «ребенка» тег a, у которого id содер жит video. P.S. Под ребенком я подразумеваю, что тег a находится внутри h3.

Вариант для ленивых (предупреждение: пути, сформированные таким образом вряд ли долго проживут)

image051.png


Хотя тут он выдал вполне себе хороший путь:

//*[@id="video-title"] – означает найди любой тег, у которого id равен video-title. Только project maker будет ругаться на двойные кавычки, вместо них надо вставить одинарные. Вот так: //*[@id='video-title']

И забыл ещё вот что. Смотрите, тут у нас 27 результатов:

image053.png


Мы можем выбрать любой из них по номеру, но делать это будем в 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 автоматически генерируется профиль:

image055.png


Так вот, у меня генерировался английский профиль и при заходе на ютуб открывалась англоязычная версия сайта. Оказывается, в англоязычной версии нужен уже совершенно другой Xpath путь. Так что перед запуском убедитесь, что у вас сгенерирован русский профиль и открывается русская версия сайта ютуб.



Пробуем писать парсер

Давайте напишем парсер, который будет собирать названия наушников и цену со всех страниц этой категории - https://doctorhead.ru/catalog/naushniki_moscow/

У нас есть 88 страниц, которые надо спарсить. Как мы получим ссылки? Часто это проще сделать вручную, чем писать под это дело код. Смотрите, как формируются у нас страницы:


Как мы их получим? Идем в excel и делаем следующим образом:

image057.png


image059.png


image061.png


Если вы обратили внимание, то тут я убрал косую черту на конце:


Это нужно для размножения в excel. Обычно у сайтов настроен редирект и проблем не возникает, однако здесь такое не катит. Т.е. тут нам нужны ссылки именно такого вида https://doctorhead.ru/catalog/naushniki_moscow/88/. Как мы их получим:

image063.png


image065.png


image067.png


image069.png


image071.png


Теперь создадим новый xls файл, дадим названия для столбцов и вставим полученные ссылки в первый столбец:

image073.png


Этап 2

Итак, мы с вами получили ссылки, с которых будем парсить. Давайте теперь перейдем в Project Maker и напишем код, который будет переходить по этим ссылкам и находить те элементы, что мы хотим спарсить.

Добавим кубик C# код:

image075.png


Добавим ссылки из gac и директивы Using:

image077.png


В ссылки из Gac добавим библиотеку epplus.dll

image079.png


И подключим её, прописав в директивы using:

C#:
using OfficeOpenXml;
using OfficeOpenXml.Style;
Теперь в кубике C# подключим таблицу:

image081.png


Так, теперь нам надо написать код, который будет переходить по ссылкам и находить нужные нам элементы. Логика такая:

  • берем ссылку из таблицы
  • переходим по ней
  • находим название наушников, цену наушников, ссылку на наушники
  • повторяем снова, пока не кончатся все наши ссылки

image083.png


Теперь нам надо составить Xpath пути, которые мы пропишем в скобках.

Давайте сначала найдем названия товаров (в коде у нас это zagolovki). Переходим на сайт в гугл хроме, жмем по нужному нам элементу правой кнопкой мыши и выбираем просмотреть код:

image085.png


Вот мы сразу её нашли:

image087.png


Мы видим, что нам нужна ссылка (тег <a>) у которой есть атрибут class со значением head_name_item. Пробуем составить Xpath путь (используется плагин для гугл хром Xpath Helper Wizard):

image089.png


Видим, что нам сходу удалось выделить те элементы, что нужно. Проверим этот XPath путь на других страницах:

image091.png


Видим, что и здесь всё хорошо. Это мы составили Xpath путь для поиска названий товаров. Давайте пропишем его в коде:

image093.png


И давайте сразу запоминать, что нам нужно будет получить из найденного элемента: значение какого-то атрибута или текст? В данном случае это текст

image095.png


Идем дальше. Давайте теперь составим Xpath путь для ценника. Тоже самое: наводимся на ценник, жмем правую кнопку мыши, просмотреть код и находим его в коде:

image097.png


Видим, что тут тег span, у которого есть class="pi_price_cur". Пробуем составить Xpath путь:

image099.png


Видим, что всё норм. Добавляем его в код:

image101.png


Также отметили для себя, что нам нужен будет текст, а не значение какого-то атрибута.

Теперь найдем нашу ссылку. Наводимся, жмем правую кнопку мыши, просмотреть код и находим её в коде:

image103.png


Код не кажется вам знакомым? Мы его уже находили, когда искали заголовок. Только тогда нам нужен был ТЕКСТ, а теперь нам нужно ЗНАЧЕНИЕ АТРИБУТА HREF.

image105.png


Раз мы его уже находили, удаляем из кода последнюю строчку, т.к. она лишняя.

В итоге у нас получился вот такой код:

image107.png


Давайте протестируем, нет ли каких-либо ошибок. Только вместо tabletest.Dimension.Rows поставим, например, 10 (иначе нам придется ждать, пока он обойдет все 88 страниц). Что он должен делать: брать ссылку из таблицы, переходить по ней, находить нужный элемент.

image109.png


Вроде бы всё норм, ошибок не видно:

image111.png


Этап 3

Так, идем дальше. Теперь нам надо перебрать в цикле собранные нами данные и сохранить в таблицу.

Для этого прям внутри этого цикла создадим ещё один цикл для перебора наших коллекций. Какая его логика:

  • берем первый элемент из коллекции, достаем оттуда нужное значение
  • записываем это значение в таблицу
  • повторяем до тех пор, пока не закончатся элементы в коллекции

image113.png


Давайте разберем каждую строчку:

  • 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 на единицу, чтобы в следующем круге он записывал уже на следующую строку

Тут вам надо понять логику кода.

image115.png


Так, это мы с вами сложили названия товаров. Нам также надо сложить с вами ценники и ссылки на сами товары. Давайте это сделаем.

image117.png


Обратите внимание на получение ссылки. Помните, я говорил, что нам надо запомнить, что мы планируем изъять текст или значение какого атрибута? Так вот, тут нам нужно как раз значение атрибута href найденного нами элемента, а не текст ссылки. Поэтому мы и написали .GetAttribute(“”);

По сути всё, мы закончили. Обязательно закройте на компьютере таблицу xls, иначе project maker выдаст ошибку при попытке сохранения данных.

Давайте пробовать запускать.

image119.png


image121.png


У меня не спарсилось название товара и ссылка на товар? Где проблема? Она в Xpath пути. Я там проверял кое-что и специально сделал неправильный XPath путь (а затем забыл изменить обратно), поэтому так. У вас всё должно было отработать норм. Сейчас покажу где (а то вдруг кто-то запутается)

image123.png


Так, пробуем запустить ещё раз:

image125.png


Вот теперь всё норм. Осталось нам на 7 строке вместо i<10 написать i<89; чтобы спарсились все страницы.

P.S. Конкретно в этом шаблоне не так как нужно (имею ввиду мне) отрабатывает команда tabletest.Dimension.Rows. Я уже подустал, нету сил разбираться, где я там накосячил, поэтому просто вручную задаем нужное количество страниц и не паримся.


В видео представлена переделка шаблона под себя на примере парсинга вот этой категории - https://zennolab.com/discussion/forums/voprosy-novichkov.16/. Видео записывалось в режиме Live на ноутбуке, поэтому звук не очень и подача довольно хаотична. Косяки вырезать не стал, ставил на паузу когда уж совсем упирался в стену.
 
Тема статьи
Парсинг
Номер конкурса статей
Одиннадцатый конкурс статей

Вложения

Для запуска проектов требуется программа ZennoPoster или ZennoDroid.
Это основное приложение, предназначенное для выполнения автоматизированных шаблонов действий (ботов).
Подробнее...

Для того чтобы запустить шаблон, откройте нужную программу. Нажмите кнопку «Добавить», и выберите файл проекта, который хотите запустить.
Подробнее о том, где и как выполняется проект.

Последнее редактирование модератором:

Sanekk

Client
Регистрация
24.06.2016
Сообщения
999
Благодарностей
390
Баллы
63
ТС за либу EPPlus.dll респект, давно хотел погуглить что-то такое.. но вечно лень т.к. таблицы редко юзаю
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Эта либа внутри себя как-то лочит действия?
 
  • Спасибо
Реакции: surrealmix

filatelika

Client
Регистрация
30.10.2015
Сообщения
13
Благодарностей
0
Баллы
1
Супер!
Мне как новичку все понятно и просто.
Давайте еще статей для новичков в таком духе.
Про Xpath хотелось бы еще материала, если будет желание обязательно пишите, буду ждать.
Благодарю зи инфу
 

Nike59

Client
Регистрация
05.08.2011
Сообщения
122
Благодарностей
122
Баллы
43
Надо еще указать, что в данном случае для составления путей XPath используется плагин XPath Helper Wizard для Chrome. Для новичка статья вполне достойная.
 
  • Спасибо
Реакции: Mikhail B.

GAGAn

Client
Регистрация
22.02.2015
Сообщения
37
Благодарностей
4
Баллы
8
На сколько этот способ быстрее чем просто экшенами парсить?
 

Demiz

Client
Регистрация
19.12.2017
Сообщения
187
Благодарностей
121
Баллы
43
Отличная статья для новичков. Как раз сейчас изучаю xpath. Буду голосовать за тебя! Годнота! Респект и + в карму
 

volody00

Client
Регистрация
06.09.2016
Сообщения
918
Благодарностей
953
Баллы
93
Эта либа внутри себя как-то лочит действия?
Если речь о том, что можно ли парсить в многопотоке не прописывая конструкции вида lock(), то ответ отрицательный (насколько мне известно)
Супер!
Мне как новичку все понятно и просто.
Давайте еще статей для новичков в таком духе.
Про Xpath хотелось бы еще материала, если будет желание обязательно пишите, буду ждать.
Благодарю зи инфу
Если хочешь, можешь скинуть примеры, где у тебя не получается выделить нужный тебе элемент. Я их разберу (если сам смогу выделить :-))
Надо еще указать, что в данном случае для составления путей XPath используется плагин XPath Helper Wizard для Chrome. Для новичка статья вполне достойная.
Указывал в блоке про поиск элементов. Сейчас добавил упоминание об этом в блок с примером парсинга
На сколько этот способ быстрее чем просто экшенами парсить?
Не думаю, что быстрее. Тут шаблоны в 1 поток. Я не знаю, как там на кубиках, но тут точно можно реализовать в многопотоке. Тогда будет намного быстрее. Вчера взял себе Pro, если время будет на днях начну разбираться с многопотоком и попробую выкатить пример парсинга в многопотоке
 

Supergrok

Client
Регистрация
05.03.2019
Сообщения
171
Благодарностей
156
Баллы
43
Супер!
Про Xpath хотелось бы еще материала, если будет желание обязательно пишите
есть видео уроки по XPath
https://cloud.mail.ru/public/2dMD/5kV9aC2hc
также есть по С# уроки от него же
и по написанию спамеров
кому нужно пишите в лс кину остальные ссылки. Видео около15 гиг объемом
 

gevolushn

Известная личность
Регистрация
25.03.2019
Сообщения
518
Благодарностей
269
Баллы
63

Master4eg

Client
Регистрация
06.04.2016
Сообщения
421
Благодарностей
122
Баллы
43
Эх, показал бы хоть кто в примере как парсить инсту, там все классы обновляются
 

tony11111

Client
Регистрация
29.11.2017
Сообщения
31
Благодарностей
63
Баллы
18
Просматривал на днях курс Рогожкина по С#. Статья похоже по мотивам курса ) Автором усвоено хорошо, плюс.
 

zarufakis

Client
Регистрация
22.03.2019
Сообщения
1 702
Благодарностей
1 078
Баллы
113
Сомнительный метод дрочиться с хпатх, если есть решения из коробки, причем гораздо проще.

Можно гетом взять код страницы в переменную, и кубиком "Парсить данные" вытащить нужное из переменной, так же как из DOM, не прибегая к вебу, тогда все будет летать на многопотоке. Затем все это записать в CSV, который так же прикрасно открывается экселем.
 
  • Спасибо
Реакции: Alex1987

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
Сомнительный метод дрочиться с хпатх, если есть решения из коробки, причем гораздо проще.

Можно гетом взять код страницы в переменную, и кубиком "Парсить данные" вытащить нужное из переменной, так же как из DOM, не прибегая к вебу, тогда все будет летать на многопотоке. Затем все это записать в CSV, который так же прикрасно открывается экселем.
в БД записать ещё лучше и быстрее
Я бы взял связку get запросы + htmlagility + БД
Плюс есть способ для продвинутых пользователей парсить через xpath не начиная каждый раз с корня и не проходя по циклу, а использовать LINQ, например
 
  • Спасибо
Реакции: zarufakis

zarufakis

Client
Регистрация
22.03.2019
Сообщения
1 702
Благодарностей
1 078
Баллы
113
в БД записать ещё лучше и быстрее
Я бы взял связку get запросы + htmlagility + БД
Плюс есть способ для продвинутых пользователей парсить через xpath не начиная каждый раз с корня и не проходя по циклу, а использовать LINQ, например
с БД все вообще по маслу полетит ))
 

vrska

Client
Регистрация
07.02.2010
Сообщения
589
Благодарностей
408
Баллы
63
Сомнительный метод дрочиться с хпатх, если есть решения из коробки, причем гораздо проще.

Можно гетом взять код страницы в переменную, и кубиком "Парсить данные" вытащить нужное из переменной, так же как из DOM, не прибегая к вебу, тогда все будет летать на многопотоке. Затем все это записать в CSV, который так же прикрасно открывается экселем.
А можно соснуть, если данные подгружаются ява-скриптом
 
  • Спасибо
Реакции: TwistDanceR

volody00

Client
Регистрация
06.09.2016
Сообщения
918
Благодарностей
953
Баллы
93
Эх, показал бы хоть кто в примере как парсить инсту, там все классы обновляются
Как часто обновляются? Скинь урл и что хочешь спарсить, я попробую

в БД записать ещё лучше и быстрее
Я бы взял связку get запросы + htmlagility + БД
Плюс есть способ для продвинутых пользователей парсить через xpath не начиная каждый раз с корня и не проходя по циклу, а использовать LINQ, например
Это для вас проще =). Получается, мне надо изучить:
  • как работать с Get запросами
  • Как пользоваться htmlagility
  • Как пользоваться БД
Всё это надо изучить по отдельности, а потом ещё собрать в единую головоломку. Был бы текст, как всё это делается (а лучше видео), тогда отлично. Старичкам всё это кажется элементарным, но у новичка (говорю о себе) сразу отпадает желание что-либо пробовать. Лучше парсить так, по тупому, зато не придется тратить десятки часов на то, чтобы разобраться в этом. Но за наводку, куда копать дальше (в плане знаний) всё равно спасибо
 

tony11111

Client
Регистрация
29.11.2017
Сообщения
31
Благодарностей
63
Баллы
18
Нужно просто сначала просмотреть/изучить курс Ростоникса, который в хелпе есть, и все.
 

bumer

Client
Регистрация
15.03.2015
Сообщения
225
Благодарностей
81
Баллы
28
Хорошая статья, все так просто написано и приведены такие классные примеры.
 
  • Спасибо
Реакции: Kaliostro666

russya

Client
Регистрация
08.07.2014
Сообщения
743
Благодарностей
78
Баллы
28
Просматривал на днях курс Рогожкина по С#. Статья похоже по мотивам курса ) Автором усвоено хорошо, плюс.
тоже смотрел и кажется что автор обучался по его курсам. Хотя могу ошибаться
 

russya

Client
Регистрация
08.07.2014
Сообщения
743
Благодарностей
78
Баллы
28
в БД записать ещё лучше и быстрее
Я бы взял связку get запросы + htmlagility + БД
Плюс есть способ для продвинутых пользователей парсить через xpath не начиная каждый раз с корня и не проходя по циклу, а использовать LINQ, например
а зачем htmlagility , если у зенки появилась новая функция
Код:
ssilki = ZennoPoster.Parser.ParseByXpath(get,"//div[contains(@class,'s-include-content-margin s-border-bottom')]","outerhtml").ToList();
очень удобно работать с гет запросами и ParseByXpath. Только есть одно но, если xpath не находит, то выходит по ошибки с с#. Но думаю разрабы скоро исправят это.
А так крутая вещь и не нужно никаких библиотек подрубать
 
  • Спасибо
Реакции: HastaLaVista

Redsmokky

Client
Регистрация
06.10.2015
Сообщения
313
Благодарностей
195
Баллы
43
Спасибо, крутая статья :ay:
 

Шива

Client
Регистрация
05.02.2018
Сообщения
1 088
Благодарностей
341
Баллы
83

Gavrosh

Client
Регистрация
08.10.2016
Сообщения
65
Благодарностей
21
Баллы
8
@volody00 , а почему не привел примеры с парсингом картинок. Хотя бы аватарок. Довольно часто встречается необходимость помимо всего скачать фотки, и добавить адреса расположения на диске, для дальнейшей работы.
Может добавишь инструкцию!?
 

volody00

Client
Регистрация
06.09.2016
Сообщения
918
Благодарностей
953
Баллы
93
@volody00 , а почему не привел примеры с парсингом картинок. Хотя бы аватарок. Довольно часто встречается необходимость помимо всего скачать фотки, и добавить адреса расположения на диске, для дальнейшей работы.
Может добавишь инструкцию!?
Сначала нам надо скачать пути к картинке и сложить их в таблицу. Т.е. делаешь тоже самое, что описано в статье, только сложить тебе надо будет не текст, а значение атрибута src тега img.
Дальнейший код подразумевает, что у нас подключена библиотека Epplus.dll и мы берем пути к картинкам начиная со 2 строки 2 столбца из таблицы xls
C#:
//начало: подключение таблицы
var package = new ExcelPackage(new FileInfo(@"E:\zennoposter - проекты\для конкурса\наша табличка.xlsx")); //путь к табличке
ExcelWorksheet tabletest = package.Workbook.Worksheets[1]; //где tabletest - имя(любое) – лучше вообще никогда не менять, а 1 - номер листа в excel
//конец: подключение таблицы
for(int k = 2; k<=tabletest.Dimension.Rows; k++) //цикл для сохранения картинок
{
    string strImageURL = tabletest.GetValue(k,2).ToString(); //ложим в переменную strImageURL урл картинку из таблицы из k строки 2 столбца
    string papka_save = @"E:\флешка\"; //папка куда хотим сохранить файлы
    string strDownloadResult = ZennoPoster.HttpGet(strImageURL,"","UTF-8",ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.File,5000); //get запрос для сохранения изображения (в переменную кладется путь к скаченному файлу)
    File.Move(strDownloadResult, papka_save + new FileInfo(strDownloadResult).Name); //перемещаем сохраненные файлы в нужную нам папку
}
 
  • Спасибо
Реакции: ParadoxRU и Gavrosh

Gavrosh

Client
Регистрация
08.10.2016
Сообщения
65
Благодарностей
21
Баллы
8
Сначала нам надо скачать пути к картинке и сложить их в таблицу. Т.е. делаешь тоже самое, что описано в статье, только сложить тебе надо будет не текст, а значение атрибута src тега img.
Дальнейший код подразумевает, что у нас подключена библиотека Epplus.dll и мы берем пути к картинкам начиная со 2 строки 2 столбца из таблицы xls
C#:
//начало: подключение таблицы
var package = new ExcelPackage(new FileInfo(@"E:\zennoposter - проекты\для конкурса\наша табличка.xlsx")); //путь к табличке
ExcelWorksheet tabletest = package.Workbook.Worksheets[1]; //где tabletest - имя(любое) – лучше вообще никогда не менять, а 1 - номер листа в excel
//конец: подключение таблицы
for(int k = 2; k<=tabletest.Dimension.Rows; k++) //цикл для сохранения картинок
{
    string strImageURL = tabletest.GetValue(k,2).ToString(); //ложим в переменную strImageURL урл картинку из таблицы из k строки 2 столбца
    string papka_save = @"E:\флешка\"; //папка куда хотим сохранить файлы
    string strDownloadResult = ZennoPoster.HttpGet(strImageURL,"","UTF-8",ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.File,5000); //get запрос для сохранения изображения (в переменную кладется путь к скаченному файлу)
    File.Move(strDownloadResult, papka_save + new FileInfo(strDownloadResult).Name); //перемещаем сохраненные файлы в нужную нам папку
}
Записать путь в таблицу к сохраненной картинке не подскажешь?

Вроде как так
tabletest.SetValue(a,5,strDownloadResult);
 

volody00

Client
Регистрация
06.09.2016
Сообщения
918
Благодарностей
953
Баллы
93
Записать путь в таблицу к сохраненной картинке не подскажешь?

Вроде как так
tabletest.SetValue(a,5,strDownloadResult);
Тут у тебя будет записан путь, куда скачиваются картинки по умолчанию (если ничего не напутал я). Можешь так и оставлять а последнюю строчку закомментировать. А как прописать после перемещения тут надо подумать, а сейчас времени уже нету. Напишешь завтра если не получится у тебя реализовать то, что тебе нужно
 

Gavrosh

Client
Регистрация
08.10.2016
Сообщения
65
Благодарностей
21
Баллы
8
Тут у тебя будет записан путь, куда скачиваются картинки по умолчанию (если ничего не напутал я). Можешь так и оставлять а последнюю строчку закомментировать. А как прописать после перемещения тут надо подумать, а сейчас времени уже нету. Напишешь завтра если не получится у тебя реализовать то, что тебе нужно
Все парситься, но вот записать путь к сохраненной картинке так и не получилось
использовал tabletest.SetValue(a,5,strDownloadResult);

В логе пишет все OK! картинки в папке, но путей к ним в таблицу не заносятся.
 

volody00

Client
Регистрация
06.09.2016
Сообщения
918
Благодарностей
953
Баллы
93
Все парситься, но вот записать путь к сохраненной картинке так и не получилось
использовал tabletest.SetValue(a,5,strDownloadResult);

В логе пишет все OK! картинки в папке, но путей к ним в таблицу не заносятся.
Пропиши ещё за циклом
package.Save(); //сохранение изменений
 
  • Спасибо
Реакции: Gavrosh

redman

Client
Регистрация
11.03.2016
Сообщения
554
Благодарностей
178
Баллы
43
  • как работать с Get запросами
  • Как пользоваться htmlagility
  • Как пользоваться БД
Пункт 1 достаточно.
Ну может быть потом ещё пункт 3, если нужно парсить круглосуточно в 100500 потоков.
 

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)