Парсер веб-сайтов для 1С:Предприятие 8.3

08.08.14

Интеграция - Сайты и интернет-магазины

Данная конфигурация является 1С-оберткой над проектом Abot, и тесно связанным с ним проектом: Html Agility Pack.

Скачать файлы

Наименование Файл Версия Размер
Парсер веб-сайтов
.dt 30,14Mb
222
.dt 30,14Mb 222 Скачать

08.08.2014: Вышла статья-продолжение Парсинг HTML без регулярных выражений  от пользователя monsta. В статье дается ссылка на информацию, почему нельзя использовать RegEx в мире Html. Также описывается утилита HAP Explorer для тестирования XPath.

Данная конфигурация является 1С-оберткой над проектом Abot (https://github.com/sjdirect/abot/), и тесно связанным с ним проектом: Html Agility Pack (http://htmlagilitypack.codeplex.com/).

Для работы потребуется установленный .Net Framework 4 и Elisy .Net Bridge 4.0.6.

Текущий статус проекта – бета с открытым исходным кодом. Выложен, скорее, как пример интеграции 1С и .Net framework.

Основная функциональность включает в себя:

  1. Обход всех страниц произвольного веб-сайта, начиная с главной страницы
  2. Ведение черного списка ссылок, которые исключаются из обхода
  3. Скачивание и группировка страниц на основании URL
  4. Обработка неправильно оформленных Html
  5. Протоколирование работы в файл
  6. Поддержка разных кодировок
  7. Анализ html-файла через XPath и регулярные выражения
  8. Простейший отчет по найденным данным

Проект обладает несколькими выявленными недостатками. После баг-репорта разработчикам abot оказалось, что в бета-стадии новая версия проекта. И, возможно, имел бы смысл ориентироваться на нее. Вторая проблема – в редких случаях после завершения работы 1С процесс 1cv8c не завершается. Закономерность пока найти не удалось.

Видео, как пользоваться:

//

.net bridge .net framework веб-парсер web-парсер парсинг html

См. также

API-интеграция 1С с маркетплейсами ОЗОН, WildBerries, Я.Маркет, СберМегаМаркет, Стройландия, Леруа Мерлен, Hoff, AliExpress для УТ11, КА2, ERP2, УНФ, БП3, Розница, УТ10, УПП1.3

Сайты и интернет-магазины Платформа 1С v8.3 1С:Комплексная автоматизация 1.х 1С:Управление торговлей 10 1С:Розница 2 1С:Управление производственным предприятием 1С:Управление нашей фирмой 1.6 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Беларусь Россия Управленческий учет Платные (руб)

Модуль для интеграции с маркетплейсами ОЗОН, WildBerries, Я.Маркет, СберМегаМаркет, Стройландия, Леруа Мерлен, Hoff, AliExpress. При помощи расширения поддерживаются следующие методы: обмен остатками товаров, обмен ценами, обработка заказов, печать стикеров, загрузка отчетов комиссионеров по API (в том числе Я.Маркет). Подходит для конфигураций Беларуси.

59990 руб.

05.09.2023    6590    83    74    

63

Интеграция Альфа Авто 5 / Альфа Авто 6 и AUTOCRM / Инфотек

Сайты и интернет-магазины WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 1С:Управление торговлей 11 Автомобили, автосервисы Россия Управленческий учет Платные (руб)

Интеграционный модуль обмена между конфигурацией Альфа Авто 5 и Альфа Авто 6 и порталом AUTOCRM. Данный модуль универсален. Позволяет работать с несколькими обменами AUTOCRM разных брендов в одной информационной базе в ручном и автоматическом режиме. Без существенных изменений типовой конфигурации. Проверено с брендами: Интеграция 1С и GEELY Интеграция 1С и HAVAL Интеграция 1С и KIA Интеграция 1С и FORD Интеграция 1С и LADA ГАРАНТИЯ 100% ВНЕДРЕНИЯ!

36000 руб.

03.08.2020    15660    9    17    

9

Оплата покупок "Долями" в 1С:Розница 2.3 (для работы с сервисом dolyame.ru)

Сайты и интернет-магазины Платформа 1С v8.3 1С:Розница 2 Розничная и сетевая торговля (FMCG) Россия Платные (руб)

Готовое интеграционное решение для оплаты покупок Долями в 1C:Розница 2.3. Реализовано в виде расширения. Интеграция сервиса dolyame.ru для приема платежей в рассрочку.

18000 руб.

19.12.2023    1040    4    0    

4

Обмен данными с сайтом. БП 3.0

Оптовая торговля Розничная торговля Сайты и интернет-магазины Платформа 1С v8.3 Бухгалтерский учет 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Платные (руб)

Обмен данными с сайтом на платформе 1С:Битрикс (и подобными) для 1С: Бухгалтерия предприятия 3.0.

12000 руб.

18.03.2019    31182    108    100    

62

Интеграция 1С — Битрикс24. Обмен задачами

Сайты и интернет-магазины Интеграция WEB-интеграция Платформа 1С v8.3 Конфигурации 1cv8 Управленческий учет Платные (руб)

Интеграция 1С и Битрикс24. Разработка имеет двухстороннюю синхронизацию 1С и Битрикс24 задачами. Решение позволяет создавать пользователя в 1С из Битрикс24 и наоборот. Данная разработка технически подходит под все основные конфигурации линейки продуктов 1С:Предприятие 8.3 (8.3.18.1289). При приобретении предоставляется 1 месяц бесплатных обновлений разработки. Доступна демо-версия продукта с подключением Вашего Битрикс24

5040 руб.

04.05.2021    17425    6    15    

13

Выгрузка для АВИТО

Сайты и интернет-магазины Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Управление торговлей 11 Россия Платные (руб)

Выгрузка товаров услуг из 1С для сайта "Авито" раздел "Автозагрузка" выполнена в виде обработки. Обработка подходит для конфигураций УТ, УНФ и Розница. Данная обработка позволяет создавать шаблон с объявлениями для "Авито" - "Автозагрузка".

4200 руб.

07.06.2022    15241    42    56    

37
Вознаграждение за ответ
Показать полностью
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. bayce 45 23.02.14 19:30 Сейчас в теме
А для чего это нужно???
2. Elisy 948 24.02.14 08:01 Сейчас в теме
(1)
А для чего это нужно???

Цены загружать откуда-нибудь, например. Мониторить сайты конкурентов.
3. Kosmovski 9 24.02.14 11:22 Сейчас в теме
очень хорошо если бы выложыл ссылки на Elisy .Net Bridge 4.0.6. а то но их официальном сайте скачать нет возможности. А на форуме ссылки даже после регистрации не появляються, сорри появляються только после активации аккаунта.
4. Elisy 948 24.02.14 13:35 Сейчас в теме
(3) Kosmovski,
выложу здесь - в комментариях для удобства. Страница на Инфостарте почему-то стала неактивной.
Прикрепленные файлы:
Elisy-Net-Bridge-SDK-4-0-6.zip
44. nicknick267-1 13.04.18 19:56 Сейчас в теме
(4) Я так понимаю, она платная, как ее можно приобрести?
46. Elisy 948 14.04.18 07:06 Сейчас в теме
(44) Компонент продается на этой странице:
https://infostart.ru/public/20035/
До покупки, пожалуйста, воспользуйтесь бесплатной демо-версией. Она имеет весь функционал, но выдает сообщение при первом обращении.
5. compreSSor 10 27.02.14 01:22 Сейчас в теме
когда пытаюсь загрузить *.dt - пишет - "Неверный формат файла для загрузки информационной базы" - это нормально ?
7. Elisy 948 27.02.14 07:43 Сейчас в теме
(5)
Спасибо за замечание. Сейчас тяжело будет изменить свойства статьи, потому что при изменении статья уходит на модерацию, насколько знаю. Из-за этого статья будет недоступна.
8. compreSSor 10 27.02.14 12:08 Сейчас в теме
(7) и ещё где-то укажите, что при 1-м запуске необходимо указать каталог для темп-файлов
9. Elisy 948 27.02.14 12:58 Сейчас в теме
(8) Вы правы. Упустил из виду. При первом запуске необходимо указать каталог для временных файлов. Его можно указать через Сервис-Папка временных файлов в разделе Парсер. В каталог пишутся dll и полный протокол работы, чтобы выявлять возможные проблемы.
Вот пример: "D:\370-Парсинг\Temp\". В конце обратный слеш должен присутствовать.
12. compreSSor 10 15.04.14 22:22 Сейчас в теме
блин... долго не заходил в конфу - сейчас пытаюсь запустить парсер - выдаёт ошибку

{ОбщийМодуль.ПарсерКлиент.Модуль(5)}: Тип не определен (AddIn.ElisyNetBridge4)
AddIn = New("AddIn.ElisyNetBridge4");

Функция ПолучитьNet() Экспорт
	
	ПодключитьВнешнююКомпоненту("Elisy.NetBridge4");
	AddIn = New("AddIn.ElisyNetBridge4");
	Net = AddIn.GetNet();
	Net.ActivateByLicenseFile("");
	
	Возврат Net;
КонецФункции
Показать

что могло пойти не так ? Elisy-Net-Bridge-SDK-4-0-6.zip - установлен.
платформа 1С - 8.3.4.465
13. Elisy 948 17.04.14 14:08 Сейчас в теме
(12) compreSSor,
Добрый день, попробуйте переустановить Elisy-Net-Bridge-SDK-4-0-6.zip под администратором.
Судя по ошибке, ссылка на компонент не найдена в ветке реестра или ссылка из реестра ведет на несуществующий файл Elisy.NetBridge.dll
14. compreSSor 10 17.04.14 16:27 Сейчас в теме
(13) уже пробовал... даже полностью удалял и опять устанавливал.
хотя теперь просто пишет - "Тип не определен (AddIn.ElisyNetBridge4)"
15. Elisy 948 18.04.14 14:41 Сейчас в теме
(14) compreSSor,
Установлен у вас .Net Framework 4 ?
6. compreSSor 10 27.02.14 01:36 Сейчас в теме
прошу прощения - установил платформу 8.3 - всё загрузилось.
просто в описании указано
Платформа:

1C: Предприятие 8.2
1С: Предприятие 8.3

10. sss999 48 14.04.14 08:54 Сейчас в теме
крутая штука )только не понятно как узнать например адреса фоток и реквизитов на сайте как прописать,где у вас там написано div//
11. Elisy 948 14.04.14 10:11 Сейчас в теме
(10)
крутая штука )только не понятно как узнать например адреса фоток и реквизитов на сайте как прописать,где у вас там написано div//

Я в хроме через контекстное меню выбирал Inspect Element, элемент открывался в дереве отладчика.

16. compreSSor 10 26.04.14 16:02 Сейчас в теме
19. Elisy 948 20.02.15 06:48 Сейчас в теме
(16) compreSSor,
Какая у вас стояла ОС, когда не запускался .Net Bridge ? Windows 8.1?
22. compreSSor 10 31.03.15 10:16 Сейчас в теме
(19) нет... всегда была Windows 7 (x64)
17. monsta 58 06.08.14 21:20 Сейчас в теме
Данная работа заслуживает большего внимания. Вот еще один пример использования технологий, о которых говорится в статье.
NN2P; orfos; Elisy; +3 Ответить
18. Elisy 948 08.08.14 05:37 Сейчас в теме
(17) monsta,
Данная работа заслуживает большего внимания. Вот еще один пример использования технологий, о которых говорится в статье.

Спасибо за статью, добавил ссылку на нее в своей статье. Думаю, что ваше описание будет всем полезно.
20. monsta 58 27.03.15 11:43 Сейчас в теме
Может замутим аналог import.io в 1С?
21. Elisy 948 27.03.15 13:48 Сейчас в теме
(20) monsta,
Может замутим аналог import.io в 1С?

Много можно чего сделать на основе парсера. Вот ребята сделали Продукт Сбор цен конкурентов 2.0
http://www.richmedia.us/post/2015/03/11/odineskin-parser.aspx
23. monsta 58 31.03.15 11:36 Сейчас в теме
(21) занятная штука!
Умела бы она вот так делать - цены бы не было!
Import.io пользуется спросом как десктопное приложение, возможно и конфигурация могла бы быть коммерчески интересной.
24. stolya 3 08.04.15 06:55 Сейчас в теме
Парсить веб-сайты проще всего с помощью объекта ПостроительDOM. Работает на любой версии платформы.
Ниже приведен пример скачивания веб-страницы и чтение ее построителем DOM (если есть поле HTML документа, на котором загружена страница, что раздел загрузки веб страницы можно пропустить).
Обработка читает данные в таблице со страниц с сайта http://enstru.skc.kz/ru/last/?PAGEN_1=1
// Объявление переменных
ОбрабатываемыеКолонки = Новый Соответствие;
ОбрабатываемыеКолонки.Вставить("Код"              , "Код");
ОбрабатываемыеКолонки.Вставить("Единица измерения", "ЕдиницаИзмерения");
ОбрабатываемыеКолонки.Вставить("МКЕИ"             , "ЕдиницаИзмеренияКод");
ОбрабатываемыеКолонки.Вставить("Название"         , "ПолноеНаименование");
ОбрабатываемыеКолонки.Вставить("Описание"         , "Характеристика");
ОбрабатываемыеКолонки.Вставить("Вид"              , "ВидНоменклатуры");

СоответствияИменИИндексовКолонок = Новый Соответствие;
НомерСтраницы                    = 1;
КоличествоСтраниц                = 1;
Массив                           = Новый Массив;

Пока НомерСтраницы <= КоличествоСтраниц Цикл
	
	#Если Клиент Тогда
		Состояние("Обработка страницы " + НомерСтраницы + " из " + ?(СоответствияИменИИндексовКолонок.Количество() = 0, "?", КоличествоСтраниц), , "Пожалуйста, подождите...");
	#КонецЕсли
	
	// Загрузка веб-страницы
	Заголовки = Новый Соответствие;
	Заголовки.Вставить("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36");
	
	// Получим текст страницы данные страницы
	ВременныйФайл  = ПолучитьИмяВременногоФайла("html");
	HTTPСоединение = Новый HTTPСоединение("enstru.skc.kz");
	
	HTTPОтвет = HTTPСоединение.Получить(Новый HTTPЗапрос("/ru/last/?PAGEN_1=" + НомерСтраницы, Заголовки), ВременныйФайл);
	Если HTTPОтвет.КодСостояния <> 200 Тогда
		ВызватьИсключение HTTPОтвет.КодСостояния;
	КонецЕсли;
	
	ЧтениеТекста  = Новый ЧтениеТекста(ВременныйФайл);
	ТекстСтраницы = ЧтениеТекста.Прочитать();
	ЧтениеТекста.Закрыть();
	
	УдалитьФайлы(ВременныйФайл);
	
	// Чтение HTML страницы
	ЧтениеHTML = Новый ЧтениеHTML;
	ЧтениеHTML.УстановитьСтроку(ТекстСтраницы);
	
	ПостроительDOM = Новый ПостроительDOM;
	ДокументHTML = ПостроительDOM.Прочитать(ЧтениеHTML);
	Для Каждого ТаблицаHTML Из ДокументHTML.ПолучитьЭлементыПоИмени("table") Цикл
		Если ТаблицаHTML.ИмяКласса = "detail-table" Тогда
			Перейти ~ПриступитьКЧтениюТаблицы;
		КонецЕсли;
	КонецЦикла;
	
	ЧтениеHTML.Закрыть();
	Возврат Массив;
	
	~ПриступитьКЧтениюТаблицы:
	
	Если СоответствияИменИИндексовКолонок.Количество() = 0 Тогда
		
		КоличествоСтраниц = СтрЧислоВхождений(ТаблицаHTML.ПредыдущийСоседний.ТекстовоеСодержимое, "|");
		#Если Клиент Тогда
			Состояние("Обработка страницы " + НомерСтраницы + " из " + ?(СоответствияИменИИндексовКолонок.Количество() = 0, "?", КоличествоСтраниц), , "Пожалуйста, подождите...");
		#КонецЕсли
		
		ИндексКолонки   = -1;
		СтрокаЗаголовка = ТаблицаHTML.ПолучитьЭлементыПоИмени("thead")[0];
		Для Каждого ТекКолонка Из СтрокаЗаголовка.ДочерниеУзлы[0].ДочерниеУзлы Цикл
			ИндексКолонки = ИндексКолонки + 1;
			Если ОбрабатываемыеКолонки[ТекКолонка.ТекстовоеСодержимое] <> Неопределено Тогда
				СоответствияИменИИндексовКолонок.Вставить(ОбрабатываемыеКолонки[ТекКолонка.ТекстовоеСодержимое], ИндексКолонки);
			КонецЕсли;
		КонецЦикла;
		
	КонецЕсли;
	
	ТаблицаДанных = ТаблицаHTML.ПолучитьЭлементыПоИмени("tbody")[0];
	Для Каждого ТекСтрока Из ТаблицаДанных.ДочерниеУзлы Цикл
		Массив.Добавить(СокрЛП(ТекСтрока.ДочерниеУзлы.Элемент(СоответствияИменИИндексовКолонок["Код"]).ТекстовоеСодержимое));
	КонецЦикла;
	
	ЧтениеHTML.Закрыть();
	НомерСтраницы = НомерСтраницы + 1;
	
КонецЦикла;
Показать
25. Elisy 948 08.04.15 13:21 Сейчас в теме
(24) Насколько мне известно многие средства плохо работают с невалидными HTML, например, не хватает в середине одного закрывающего тэга.
Есть еще детали, с которыми не понятно как справится родной компонент. Например, кодировка сайта может быть разная. Может быть даже так, что сервер возращает одну кодировку, а Head страницы содержит другую.
И, как бы, приведенный вами код не обладает универсальностью. Код прописан под конкретный веб-сайт, решение из статьи претендует на некоторую гибкость (через XPath и регулярные выражения), скорость (через многопоточность и операции в памяти).
26. пользователь 08.04.15 23:48
Сообщение было скрыто модератором.
...
27. DieseL_d2 24.06.15 13:11 Сейчас в теме
Как можно добавить использование proxy?

Используя С# это можно сделать следующим способом, но как это написать в 1с?
-------------------------------------------------------------------------------------------
//Extend the PageRequester class and override the method that creates the HttpWebRequest
public class YourCustomPageRequester : PageRequester
{
protected override HttpWebRequest BuildRequestObject(Uri uri)
{
HttpWebRequest request = base.BuildRequestObject(uri);
request.Proxy = new WebProxy(_config.ConfigurationExtensions["MyProxy1"]);
return request;
}
}

//Load config from xml then add proxy values to the "ConfigurationExtensions" dictionary
CrawlConfiguration crawlConfig = AbotConfigurationSectionHandler.LoadFromXml().Convert();
crawlConfig.ConfigurationExtensions.Add("MyProxy1", "http://myproxy1.com:8080");

//Create an instance of the crawler and pass in your configuration and custom impl for the IPageRequester
PoliteWebCrawler crawler = new PoliteWebCrawler(crawlConfig, null, null, null, new YourCustomPageRequester(), null, null,null, null)

//Crawl the site and the proxy should be used
crawler.Crawl(new Uri("http://somesite.com/"));
-------------------------------------------------------------------------------------------
28. Elisy 948 25.06.15 14:37 Сейчас в теме
(27)
Как можно добавить использование proxy?

В обработке ЗагрузкаСтраниц в макете ИсходныйКод содержится код C#. Думаю, что в него нужно добавить наследованный класс
public class YourCustomPageRequester : PageRequester 
{ 
protected override HttpWebRequest BuildRequestObject(Uri uri) 
{ 
HttpWebRequest request = base.BuildRequestObject(uri); 
request.Proxy = new WebProxy("http://myproxy1.com:8080"); 
return request; 
} 
} 
Показать

подставив адрес прокси-сервера (нужно проверить параметр WebProxy, что он дейтсвительно строковый

Далее в этом же макете поменять строку
Crawler = new PoliteWebCrawler(crawlConfig, null, null, null, null, null, null, null, null);

на
Crawler = new PoliteWebCrawler(crawlConfig, null, null, null, new YourCustomPageRequester(), null, null,null, null)
29. DieseL_d2 01.07.15 16:57 Сейчас в теме
Как можно отладить эту конструкцию? Получаю ошибку:
Ошибки компиляции:
c:\Users\Pavel\AppData\Local\Temp\3sy2r1ay.0.cs(16,20) : error CS0246: Не удалось найти имя типа или пространства имен "HttpWebRequest" (пропущена директива using или ссылка на сборку?)


Код получился таким:
using System;
using System.Runtime.InteropServices;
using Abot.Crawler;
using Abot.Poco;
using Abot.Core;



namespace Elisy.NetBridge.Crawler
{		
    public class Helper : IDisposable
    {
	public class YourCustomPageRequester : PageRequester 
{ 
protected override HttpWebRequest BuildRequestObject(Uri uri) 
{ 
HttpWebRequest request = base.BuildRequestObject(uri); 
request.Proxy = new WebProxy("212.82.126.32:80"); 
return request; 
} 
} 
    	object _form;
    	
    	public IWebCrawler Crawler {get; set;}
    	
    	public Helper(CrawlConfiguration crawlConfig, object form)
    	{
    	    _form = form;
    	    Crawler = new PoliteWebCrawler(crawlConfig, null, null, null, new YourCustomPageRequester(), null, null,null, null)
    		
            Crawler.PageCrawlStartingAsync += crawler_ProcessPageCrawlStarting;
            Crawler.PageCrawlCompletedAsync += crawler_ProcessPageCrawlCompleted;
            Crawler.PageCrawlDisallowedAsync += crawler_PageCrawlDisallowed;
            Crawler.PageLinksCrawlDisallowedAsync += crawler_PageLinksCrawlDisallowed;
            
            Crawler.ShouldDownloadPageContent((crawledPage, crawlContext) =>
            {
            	CrawlDecision decision = new CrawlDecision { Allow = true };
    		    try
    		    {
    			    object result = _form.GetType().InvokeMember("crawler_ShouldDownloadPageContent", 
				    System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Public,
				    null, _form, new object[] {decision, crawledPage, crawlContext });
				    return decision;
    		    }
    		    catch(Exception ex)
    		    {
    		    	return decision;
	    	    }
            });


            Crawler.ShouldCrawlPage((pageToCrawl, crawlContext) =>
            {
            	CrawlDecision decision = new CrawlDecision { Allow = true };
    		    try
    		    {
    			    object result = _form.GetType().InvokeMember("crawler_ShouldCrawlPage", 
				    System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Public,
				    null, _form, new object[] {decision, pageToCrawl, crawlContext });
				    return decision;
    		    }
    		    catch(Exception ex)
    		    {
    		    	return decision;
	    	    }
            });


            Crawler.ShouldCrawlPageLinks((crawledPage, crawlContext) =>
            {
            	CrawlDecision decision = new CrawlDecision { Allow = true };
    		    try
    		    {
    			    object result =  _form.GetType().InvokeMember("crawler_ShouldCrawlPageLinks", 
				    System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Public,
				    null, _form, new object[] {decision, crawledPage, crawlContext });
				    return decision;
    		    }
    		    catch(Exception ex)
    		    {
    		    	return decision;
	    	    }
            });
            
    	}

        void crawler_ProcessPageCrawlStarting(object sender, PageCrawlStartingArgs e)
        {   
    		try
    		{
    			object result = _form.GetType().InvokeMember("crawler_ProcessPageCrawlStarting", 
				System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Public,
				null, _form, new object[] { sender, e });
    		}
    		catch(Exception ex)
    		{
	    	}
        }

        void crawler_ProcessPageCrawlCompleted(object sender, PageCrawlCompletedArgs e)
        {
    		try
    		{
    			object result = _form.GetType().InvokeMember("crawler_ProcessPageCrawlCompleted", 
				System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Public,
				null, _form, new object[] { sender, e });
    		}
    		catch(Exception ex)
    		{
	    	}
        }

        void crawler_PageLinksCrawlDisallowed(object sender, PageLinksCrawlDisallowedArgs e)
        {
    		try
    		{
    			object result = _form.GetType().InvokeMember("crawler_PageLinksCrawlDisallowed", 
				System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Public,
				null, _form, new object[] { sender, e });
    		}
    		catch(Exception ex)
    		{
	    	}
        }

        void crawler_PageCrawlDisallowed(object sender, PageCrawlDisallowedArgs e)
        {
    		try
    		{
    			object result = _form.GetType().InvokeMember("crawler_PageCrawlDisallowed", 
				System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Public,
				null, _form, new object[] { sender, e });
    		}
    		catch(Exception ex)
    		{
	    	}
        }

    	public void Dispose()
    	{
    		if (_form != null)
    			Marshal.ReleaseComObject(_form);
    	}
	}

}
Показать
30. Elisy 948 02.07.15 05:55 Сейчас в теме
(29) DieseL_d2,
Как можно отладить эту конструкцию?

Судя по ошибке, ругается на строку
HttpWebRequest request = base.BuildRequestObject(uri); 

ошибку можно попробовать исправить, заменив строку на
var request = base.BuildRequestObject(uri); 

или
System.Net.HttpWebRequest request = base.BuildRequestObject(uri); 
или добавив в конструкции using строку
using System.Net;
31. DieseL_d2 03.07.15 14:39 Сейчас в теме
При добавлении System.Net появились новые предупреждения.
И ошибка. Но форуме Adot написал, пока тишина.

c:\Users\Pavel\AppData\Local\Temp\z0nw0vnz.0.cs(11,19) : error CS1729: Abot.Core.PageRequester не содержит конструктор, который принимает 0 аргументов
c:\Users\Pavel\AppData\Local\Temp\z0nw0vnz.0.cs(47,27) : warning CS0168: Переменная "ex" объявлена, но ни разу не использовалась
c:\Users\Pavel\AppData\Local\Temp\z0nw0vnz.0.cs(64,27) : warning CS0168: Переменная "ex" объявлена, но ни разу не использовалась
c:\Users\Pavel\AppData\Local\Temp\z0nw0vnz.0.cs(81,27) : warning CS0168: Переменная "ex" объявлена, но ни разу не использовалась
c:\Users\Pavel\AppData\Local\Temp\z0nw0vnz.0.cs(97,23) : warning CS0168: Переменная "ex" объявлена, но ни разу не использовалась
c:\Users\Pavel\AppData\Local\Temp\z0nw0vnz.0.cs(110,23) : warning CS0168: Переменная "ex" объявлена, но ни разу не использовалась
c:\Users\Pavel\AppData\Local\Temp\z0nw0vnz.0.cs(123,23) : warning CS0168: Переменная "ex" объявлена, но ни разу не использовалась
c:\Users\Pavel\AppData\Local\Temp\z0nw0vnz.0.cs(136,23) : warning CS0168: Переменная "ex" объявлена, но ни разу не использовалась

код получился вот таким:

using System;
using System.Runtime.InteropServices;
using Abot.Crawler;
using Abot.Poco;
using Abot.Core;
using System.Net;

namespace Elisy.NetBridge.Crawler
{

    	public class YourCustomPageRequester : PageRequester 
{ 
protected override HttpWebRequest BuildRequestObject(Uri uri) 
{ 
var request = base.BuildRequestObject(uri); 
request.Proxy = new WebProxy("212.82.126.32:80"); 
return request; 
} 
} 
    public class Helper : IDisposable
    {
    	object _form;
    	
    	public IWebCrawler Crawler {get; set;}
    	
    	public Helper(CrawlConfiguration crawlConfig, object form)
    	{
    	    _form = form;
    	    
    		Crawler = new PoliteWebCrawler(crawlConfig, null, null, null, new YourCustomPageRequester(), null, null,null, null);

            Crawler.PageCrawlStartingAsync += crawler_ProcessPageCrawlStarting;
            Crawler.PageCrawlCompletedAsync += crawler_ProcessPageCrawlCompleted;
            Crawler.PageCrawlDisallowedAsync += crawler_PageCrawlDisallowed;
            Crawler.PageLinksCrawlDisallowedAsync += crawler_PageLinksCrawlDisallowed;
            
            Crawler.ShouldDownloadPageContent((crawledPage, crawlContext) =>
            {
            	CrawlDecision decision = new CrawlDecision { Allow = true };
    		    try
    		    {
    			    object result = _form.GetType().InvokeMember("crawler_ShouldDownloadPageContent", 
				    System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Public,
				    null, _form, new object[] {decision, crawledPage, crawlContext });
				    return decision;
    		    }
    		    catch(Exception ex)
    		    {
    		    	return decision;
	    	    }
            });


            Crawler.ShouldCrawlPage((pageToCrawl, crawlContext) =>
            {
            	CrawlDecision decision = new CrawlDecision { Allow = true };
    		    try
    		    {
    			    object result = _form.GetType().InvokeMember("crawler_ShouldCrawlPage", 
				    System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Public,
				    null, _form, new object[] {decision, pageToCrawl, crawlContext });
				    return decision;
    		    }
    		    catch(Exception ex)
    		    {
    		    	return decision;
	    	    }
            });


            Crawler.ShouldCrawlPageLinks((crawledPage, crawlContext) =>
            {
            	CrawlDecision decision = new CrawlDecision { Allow = true };
    		    try
    		    {
    			    object result =  _form.GetType().InvokeMember("crawler_ShouldCrawlPageLinks", 
				    System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Public,
				    null, _form, new object[] {decision, crawledPage, crawlContext });
				    return decision;
    		    }
    		    catch(Exception ex)
    		    {
    		    	return decision;
	    	    }
            });
            
    	}

        void crawler_ProcessPageCrawlStarting(object sender, PageCrawlStartingArgs e)
        {   
    		try
    		{
    			object result = _form.GetType().InvokeMember("crawler_ProcessPageCrawlStarting", 
				System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Public,
				null, _form, new object[] { sender, e });
    		}
    		catch(Exception ex)
    		{
	    	}
        }

        void crawler_ProcessPageCrawlCompleted(object sender, PageCrawlCompletedArgs e)
        {
    		try
    		{
    			object result = _form.GetType().InvokeMember("crawler_ProcessPageCrawlCompleted", 
				System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Public,
				null, _form, new object[] { sender, e });
    		}
    		catch(Exception ex)
    		{
	    	}
        }

        void crawler_PageLinksCrawlDisallowed(object sender, PageLinksCrawlDisallowedArgs e)
        {
    		try
    		{
    			object result = _form.GetType().InvokeMember("crawler_PageLinksCrawlDisallowed", 
				System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Public,
				null, _form, new object[] { sender, e });
    		}
    		catch(Exception ex)
    		{
	    	}
        }

        void crawler_PageCrawlDisallowed(object sender, PageCrawlDisallowedArgs e)
        {
    		try
    		{
    			object result = _form.GetType().InvokeMember("crawler_PageCrawlDisallowed", 
				System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.Public,
				null, _form, new object[] { sender, e });
    		}
    		catch(Exception ex)
    		{
	    	}
        }

    	public void Dispose()
    	{
    		if (_form != null)
    			Marshal.ReleaseComObject(_form);
    	}
	}
	
}
Показать
32. Elisy 948 04.07.15 06:07 Сейчас в теме
(31) DieseL_d2,
Случайно нашел ваш пост на форуме Abot. Там ответили, что конструктор YourCustomPageRequester содержит параметры и код нужно исправить на
Crawler = new PoliteWebCrawler(crawlConfig, null, null, null, new YourCustomPageRequester(crawlConfig), null, null,null, null)
33. DieseL_d2 06.07.15 12:38 Сейчас в теме
Это приводит к увеличению ошибок:)

c:\Users\Pavel\AppData\Local\Temp\shd4vol5.0.cs(30,75) : error CS1729: Elisy.NetBridge.Crawler.YourCustomPageRequester не содержит конструктор, который принимает 1 аргументов
c:\Users\Pavel\AppData\Local\Temp\shd4vol5.0.cs(11,22) : error CS1729: Abot.Core.PageRequester не содержит конструктор, который принимает 0 аргументов
34. DieseL_d2 06.07.15 13:28 Сейчас в теме
Разобрался сам, в совете по добавлению прокси была куча синтаксических ошибок, нашел другой пример, отладил пару других мелких ошибок, код получился вот таким:

Теперь возникает вопрос, как можно менять прокси во время работы по достижению определенного числа скачанных станиц.

Перезапуск с новым прокси по сути даст тот же набор страниц(бот пробежит по тем же ссылкам). Запуск бота по последней скачанной странице тоже не совсем верен.

Я правильно понимаю, что где-то внутри Adot формируется перечень url, по которым нужно пройтись? можно его как-то оттуда вытянуть, перед перезапуском?
35. Elisy 948 10.07.15 12:16 Сейчас в теме
(34) DieseL_d2,
Думаю, это проще реализовать в классе YourCustomPageRequester
Объявить в нем массив адресов прокси,
private string[] _адресаПрокси = new string[3] {"212.82.126.32:80", "Proxy2", "Proxy3"};
номер текущего прокси
int _номерТекущегоАдресаПрокси = 0;
номер страницы в текущем прокси
int _номерСтраницы = 0;

в методе protected override HttpWebRequest BuildRequestObject(Uri uri)
обращаться к прокси по _адресаПрокси[_номерТекущегоАдресаПрокси % _адресаПрокси.Length]
увеличивать счетчик _номерСтраницы++
Если счетчик достигает предела страниц на 1 прокси, увеличивать на 1
_номерТекущегоАдресаПрокси++
36. compreSSor 10 15.07.15 20:47 Сейчас в теме
вопрос для всех - как отпарсить " http://dwgroup.com.ua/Catalog.aspx?p=175 " на предмет "Артикул, Цена, Изображение" ?
особенно интересует "Изображение"
37. Elisy 948 16.07.15 06:14 Сейчас в теме
(36) compreSSor,
Думаю, что задача решается в несколько проходов
На первом проходе через регулярные выражения атрибута onclick можно выйти на ID в ShowDescription(41423)

ShowDescription определен в "http://dwgroup.com.ua/js/main.js?15" как
    Show_popup('divDescription');
    $.get('GoodsNameDescription.aspx?m=' + Math.random() + '&id=' + id, function(data) {
        $('#divDescription').html(data);
    });
    Show_popup('divDescription');
    return false;

Радует, что получение идет через get-запрос. Это значит, что доступны URL с описаниями
"http://dwgroup.com.ua/GoodsNameDescription.aspx?m=1&id=41424"
"http://dwgroup.com.ua/GoodsNameDescription.aspx?m=1&id=41423"
38. s_uu 22 13.08.15 22:07 Сейчас в теме
При запуске парсера выдает сообщение "Elisy .Net Bridge v4.0.6.0
Evaluation NFR version / Ознакомительная NFR-версия
Copyright © 2008-2015 Elisy Software Design
E-mail: support@1csoftware.com; Web: http://www.1csoftware.com/dotnet/
Use the main MAC-address to activate component / Используйте основной MAC-адрес для активации компонента
The following MAC-addresses are available / Доступны следующие MAC-адреса :
(Ppp)
88532EC198AB (Wireless80211)
88532EC198AA (Wireless80211)
E8039A96B0DF (Ethernet)"
И ничего не происходит! Как исправить?
39. Elisy 948 14.08.15 06:27 Сейчас в теме
(38) s_uu,
Сообщение говорит о правильном начале работы компонента .Net Bridge. Почему ничего не происходит, нужно смотреть в отладчике. Возможно, виноваты настройки сети. По представленной вами информации сложно судить.
40. white-mount 11.09.16 11:48 Сейчас в теме
Два момента которые не осветил автор:
1) На сайте разработчика читаем:
2. Системные требования

Операционная система (Операционная система (Архитектура x86): Windows 7/Vista SP1/XP SP3/2008/2003 SP2 ):
Версия .Net-платформы: .Net framework 4.0
...
Примечание: . Ограниченная поддержка 64-битных приложений (например, 64-разрядного сервера 1С:Предприятие) осуществляется через расширение COM+.


2) Сведения которые требует продавец, указывают на привязку клиентской лицензии к конкретному железу. :
Доп.Информация: Сразу после оплаты вы получите форму для заполнения регистрационных данных, в которой должны будете заполнить следующие поля:
- Фамилия Имя Отчество;
- Адрес электронной почты (email);
- MAC-адрес компьютера;
Эти данные будут переданы продавцу для завершения сделки купли-продажи товара.


Поддерживаю (38) s_uu , на скачанной с сайта, после довольно долгой регистрации, ознакомительной версии обработка выдаёт аналогичные сообщения.
Дополнительно, Net framework 4.5 и выше не воспринимает.
Стоит ли покупать продукт, который невозможно протестировать, и который намертво привязывается к одному пк, вопрос открытый.
41. Elisy 948 13.09.16 10:06 Сейчас в теме
1) На сайте разработчика читаем:

Не понятен смысл комментария - компонент поддерживает х86, но ничто не мешает использовать под х64 через COM+.

Поддерживаю (38) s_uu , на скачанной с сайта, после довольно долгой регистрации, ознакомительной версии обработка выдаёт аналогичные сообщения.

Пользователь в (38) решил не исследовать дальше и не ответил на мой вопрос (39). Понятно, что ничего с этим поделать нельзя будет без дополнительной информации. На Инфостарте, кстати тоже можно скачать без долгой регистрации.

Дополнительно, Net framework 4.5 и выше не воспринимает.

Очень странно, так как установка .Net обычно несет с собой предыдущие версии также. И если вы увидели картинку в (38), значит инициализация .Net прошла, так как было обращение к MAC-адресам средствами .Net.

Стоит ли покупать продукт, который невозможно протестировать, и который намертво привязывается к одному пк, вопрос открытый.

Именно поэтому Elisy .Net Bridge поставляется бесплатно для ознакомительного доступа, чтобы можно было проверить работу до покупки. Парсер должен работать на незарегистрированном компоненте. Будет надоедать сообщение только.
45. nicknick267-1 13.04.18 19:57 Сейчас в теме
(41) Сергей здравствуйте.
Как можно приобрести Elisy .Net Bridge?
47. Elisy 948 14.04.18 07:07 Сейчас в теме
(45) Компонент продается на этой странице:
https://infostart.ru/public/20035/
До покупки, пожалуйста, воспользуйтесь бесплатной демо-версией. Она имеет весь функционал, но выдает сообщение при первом обращении.
42. zlakizla 62 28.10.16 12:01 Сейчас в теме
Добрый день!
Подскажите, пожалуйста, несколько вопросов при использовании:
1) Как парсить каталог по страницам? Например, есть УРЛ "https://au.ru/sport/sports_nutrition/" .На данной странице 50 товаров, я получаю наименование и цену товара. А вот, чтобы увидеть следующие товары, надо переходить по страницам. УРЛ следующей страницы "https://au.ru/sport/sports_nutrition/?page=2 (3, 4, 5 и так далее)". Как можно парсить эти страницы?

2) Как сопоставить Полученные значения при анализе страниц? Например, получаю 2 значения (Наименование и Цена). В итоге получается таблица, в которой сначала идут строки с Наименованием, а потом строки с Ценой. Есть, конечно, колонка "Индекс", но по нему не всегда можно сопоставить. Например, у меня получилось, что я одно значение по Пути "//a[@class="lotcard-name"]" не нашел и, соответственно, индексы сдвинулись на единицу, и уже не получается сопоставить какому Наименованию соответствует Цена.
43. Elisy 948 28.10.16 15:38 Сейчас в теме
(42) zlakizla,
Шаг 1 - скачать нужные страницы. В справочнике Группы страницы попробуйте установить шаблон
https://au.ru/sport/sports_nutrition/?page=*
Скачайте страницы

2. Индекс планировался для сопоставления. Если не получается через параметр a[@class="lotcard-name"] загрузить все значения, нужно поэкспериментировать с другими значениями, чтобы возвращались все элементы
48. deman_ru 19 01.04.19 16:56 Сейчас в теме
Не подскажите в чем может быть проблема, некоторые страницы загружаются не корректно, проблема с кодировкой, русские буквы получаются вида: Замок СЃ Рў-образной ручкой оптом РІ наличии РЅР
49. Elisy 948 02.04.19 08:41 Сейчас в теме
(48)
Нужно смотреть заголовки этих страниц. 1. Может быть кодировка не Utf-8 2. Может быть включено сжатие данных. Я не проверял, как при сжатии себе может вести парсер.
Можете дать пример ссылки?
50. deman_ru 19 02.04.19 23:01 Сейчас в теме
(49) Разобрался, нужно было в настройках указать кодировку страниц. Спасибо за ответ!
51. user1690352 29.10.21 01:59 Сейчас в теме
Господи, а звучит как — универсальный парсер веб-сайтов. Как веб-разработчик заявляю, что универсального парсера на данный момент не существует по техническим причинам (отсутствие искусственного интеллекта). То, что он парсит какие-то тэги и ссылки может помочь в одной цели - составлении sitemap.xml или Карты сайта, которая к 1С не имеет никакого отношения. Никаких полезных данных не вынуть с помощью данного краулера, оно и понятно, в общем-то. Так что да, не более чем демонстрация Net Bridge
52. e-rogov 10 10.03.23 18:47 Сейчас в теме
подскажите где скачать
Elisy-Net-Bridge-SDK-4-0-20.zip
которая теперь бесплатная?
53. Elisy 948 11.03.23 07:16 Сейчас в теме
(52)
Все дистрибутивы Elisy .Net Bridge можно найти на странице Инфостарт
https://infostart.ru/public/20035/
Оставьте свое сообщение