Guest User

Untitled

a guest
Oct 17th, 2017
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.98 KB | None | 0 0
  1. class ParserWorker<T> where T : class
  2. { //поле с обобщенным типом IParser
  3. IParser<T> parser;
  4. //поле, в котором хранятся настройки для парсера
  5. IParserSettings parserSettings;
  6.  
  7. HtmlLoader loader;
  8.  
  9. bool isActive;
  10.  
  11. private HabraParser habraParser;
  12. private HabraSettings habraSettings;
  13.  
  14. // пара публичных свойств для полей parser и parserSettings
  15. #region Properties
  16. public IParser<T> Parser
  17. {
  18. get
  19. {
  20. return parser;
  21. }
  22. set
  23. {
  24. parser = value;
  25. }
  26.  
  27. }
  28.  
  29. public IParserSettings Settings
  30. {
  31. get
  32. {
  33. return parserSettings;
  34. }
  35. set
  36. {
  37. parserSettings = value;
  38. //создаем новый экземпляр с новыми настройками парсера
  39. loader = new HtmlLoader(value);
  40. }
  41.  
  42.  
  43. }
  44. //свойство, доступное лишь для чтения для контроля работы класса
  45. public bool IsActive
  46. {
  47. get
  48.  
  49. {
  50. return IsActive;
  51. }
  52. }
  53. //#region позволяет указать блок кода, который можно разворачивать и сворачивать в редакторе кода Visual Studio.
  54. #endregion
  55. //пара событий
  56. //первое событие, возвращающее спарсенные за итерацию данные.В аргументах мы передаем ссылку на парсер, а затем
  57. public event Action<object, T> OnNewData;
  58. //второе событие отвечает за информирование при завершении работы парсера
  59. public event Action<object> OnCompleted;
  60. //конструктор, в котором принимается экземпляр, реализующий интерфейс IParser
  61. public ParserWorker(IParser<T> parser)
  62. { //присваиваем значение аргумента полю
  63. this.parser = parser;
  64. }
  65. //конструктор,который кроме парсера принимает его настройки
  66. public ParserWorker(IParser<T> parser, IParserSettings parserSettings) : this(parser)//чтобы не дублировать код, вызываем первый конструктор и передадим ему парсер
  67. {//записываем настройки парсера в поле
  68. this.parserSettings = parserSettings;
  69. }
  70.  
  71. public ParserWorker(HabraParser habraParser, HabraSettings habraSettings)
  72. {
  73. this.habraParser = habraParser;
  74. this.habraSettings = habraSettings;
  75. }
  76.  
  77. //добавляем два метода для запуска и остановки парсера - Start и Abort
  78. public void Start()
  79. {//в методе Start вызываем метод Worker (он будет асинхронным)
  80. isActive = true;
  81. Worker();
  82. }
  83.  
  84. public void Abort()
  85. {
  86. isActive = false;
  87. }
  88. //закрытый асинхронный метод Worker, контролирующий процесс парсинга
  89. private async void Worker()
  90. {//цикл от стартовой до конечной точки из наших настроек
  91. for (int i = parserSettings.StartPoint; i <= parserSettings.EndPoint; i++)
  92. {//делаем проверку на активность. Если был использован метод Abort, то выходим из метода
  93. if (!isActive)
  94. {//вызов метода OnCompleted в случае, если работа парсера была остановлена
  95. OnCompleted?.Invoke(this);
  96. return;
  97. }
  98. //С помощью HtmlLoadera получаем исходный код страницы с индексом из цикла
  99. var source = await loader.GetSourceByPageId(i);
  100. //создаем HtmlParser, доступный нам из AngleSharp
  101. var domParser = new HtmlParser();
  102. //спарсим асинхронно наш исходный код и получим документ, с которым можно работать
  103. var document = await domParser.ParseAsync(source);
  104. //передаем нашему парсеру документ и получаем спарсенные данные в переменную result
  105. var result = parser.Parse(document);
  106. //вызов метода OnNewData, в который передается ссылка и результат
  107. OnNewData?.Invoke(this, result);
  108. }
  109. //вызов метода OnCompleted в случае, если работа парсера была закончена
  110. OnCompleted?.Invoke(this);
  111. isActive = false;
  112. }
  113.  
  114. }
Add Comment
Please, Sign In to add comment