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

  • Автор темы Автор темы volody00
  • Дата начала Дата начала

volody00

Client
Регистрация
06.09.2016
Сообщения
991
Реакции
1 111
Баллы
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 на ноутбуке, поэтому звук не очень и подача довольно хаотична. Косяки вырезать не стал, ставил на паузу когда уж совсем упирался в стену.
 
Номер конкурса статей
  1. Одиннадцатый конкурс статей
Тема статьи
  1. Парсинг

Вложения

Последнее редактирование модератором:
ТС за либу EPPlus.dll респект, давно хотел погуглить что-то такое.. но вечно лень т.к. таблицы редко юзаю
 
Супер!
Мне как новичку все понятно и просто.
Давайте еще статей для новичков в таком духе.
Про Xpath хотелось бы еще материала, если будет желание обязательно пишите, буду ждать.
Благодарю зи инфу
 
Надо еще указать, что в данном случае для составления путей XPath используется плагин XPath Helper Wizard для Chrome. Для новичка статья вполне достойная.
 
  • Спасибо
Реакции: Mikhail B.
На сколько этот способ быстрее чем просто экшенами парсить?
 
Отличная статья для новичков. Как раз сейчас изучаю xpath. Буду голосовать за тебя! Годнота! Респект и + в карму
 
Эта либа внутри себя как-то лочит действия?
Если речь о том, что можно ли парсить в многопотоке не прописывая конструкции вида lock(), то ответ отрицательный (насколько мне известно)
Супер!
Мне как новичку все понятно и просто.
Давайте еще статей для новичков в таком духе.
Про Xpath хотелось бы еще материала, если будет желание обязательно пишите, буду ждать.
Благодарю зи инфу
Если хочешь, можешь скинуть примеры, где у тебя не получается выделить нужный тебе элемент. Я их разберу (если сам смогу выделить :-))
Надо еще указать, что в данном случае для составления путей XPath используется плагин XPath Helper Wizard для Chrome. Для новичка статья вполне достойная.
Указывал в блоке про поиск элементов. Сейчас добавил упоминание об этом в блок с примером парсинга
На сколько этот способ быстрее чем просто экшенами парсить?
Не думаю, что быстрее. Тут шаблоны в 1 поток. Я не знаю, как там на кубиках, но тут точно можно реализовать в многопотоке. Тогда будет намного быстрее. Вчера взял себе Pro, если время будет на днях начну разбираться с многопотоком и попробую выкатить пример парсинга в многопотоке
 
Супер!
Про Xpath хотелось бы еще материала, если будет желание обязательно пишите
есть видео уроки по XPath
https://cloud.mail.ru/public/2dMD/5kV9aC2hc
также есть по С# уроки от него же
и по написанию спамеров
кому нужно пишите в лс кину остальные ссылки. Видео около15 гиг объемом
 
Просматривал на днях курс Рогожкина по С#. Статья похоже по мотивам курса ) Автором усвоено хорошо, плюс.
 
Сомнительный метод дрочиться с хпатх, если есть решения из коробки, причем гораздо проще.

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

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

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

в БД записать ещё лучше и быстрее
Я бы взял связку get запросы + htmlagility + БД
Плюс есть способ для продвинутых пользователей парсить через xpath не начиная каждый раз с корня и не проходя по циклу, а использовать LINQ, например
Это для вас проще =). Получается, мне надо изучить:
  • как работать с Get запросами
  • Как пользоваться htmlagility
  • Как пользоваться БД
Всё это надо изучить по отдельности, а потом ещё собрать в единую головоломку. Был бы текст, как всё это делается (а лучше видео), тогда отлично. Старичкам всё это кажется элементарным, но у новичка (говорю о себе) сразу отпадает желание что-либо пробовать. Лучше парсить так, по тупому, зато не придется тратить десятки часов на то, чтобы разобраться в этом. Но за наводку, куда копать дальше (в плане знаний) всё равно спасибо
 
Нужно просто сначала просмотреть/изучить курс Ростоникса, который в хелпе есть, и все.
 
Хорошая статья, все так просто написано и приведены такие классные примеры.
 
  • Спасибо
Реакции: Kaliostro666
Просматривал на днях курс Рогожкина по С#. Статья похоже по мотивам курса ) Автором усвоено хорошо, плюс.
тоже смотрел и кажется что автор обучался по его курсам. Хотя могу ошибаться
 
в БД записать ещё лучше и быстрее
Я бы взял связку 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
Спасибо, крутая статья :ay:
 
@volody00 , а почему не привел примеры с парсингом картинок. Хотя бы аватарок. Довольно часто встречается необходимость помимо всего скачать фотки, и добавить адреса расположения на диске, для дальнейшей работы.
Может добавишь инструкцию!?
 
@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
Сначала нам надо скачать пути к картинке и сложить их в таблицу. Т.е. делаешь тоже самое, что описано в статье, только сложить тебе надо будет не текст, а значение атрибута 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);
 
Записать путь в таблицу к сохраненной картинке не подскажешь?

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

В логе пишет все OK! картинки в папке, но путей к ним в таблицу не заносятся.
 
Все парситься, но вот записать путь к сохраненной картинке так и не получилось
использовал tabletest.SetValue(a,5,strDownloadResult);

В логе пишет все OK! картинки в папке, но путей к ним в таблицу не заносятся.
Пропиши ещё за циклом
package.Save(); //сохранение изменений
 
  • Спасибо
Реакции: Gavrosh
  • как работать с Get запросами
  • Как пользоваться htmlagility
  • Как пользоваться БД
Пункт 1 достаточно.
Ну может быть потом ещё пункт 3, если нужно парсить круглосуточно в 100500 потоков.
 

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