Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 3

Правильный парсер

19.09.2013, 00:53. Показов 2295. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброе время суток!

Сразу приведу пример кода:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.IO;
using System.Xml;
using System.Xml.Linq;
 
 
namespace Parser
{
    public partial class Form1 : Form
    {
        String url_file;
        Int32 count_check;
        Int32 count_valid;
        
        //Ini
        public Form1()
        {
            InitializeComponent();
        }
 
        public static String getHttpPage(string url)
        {
            try
            {
                WebRequest req = WebRequest.Create(url);
                WebResponse res = req.GetResponse();
                using (StreamReader reader = new StreamReader(res.GetResponseStream(), Encoding.Default)) 
                { 
                    return reader.ReadToEnd(); 
                }
            }
            catch (Exception e) 
            {
                return e.Message;
            }
        }
        public void process()
        {
            string url;
            StreamReader sr = new StreamReader(url_file);
            while ((url = sr.ReadLine()) != null)
            {
                try
                {
                    url = strrepl(url);
                    XDocument doc = XDocument.Parse(getHttpPage("http://" + url));
                    string num = doc.Element("section").Element("block").Attribute("num").Value;
                    string name = doc.Element("section").Element("name").Attribute("value").Value;
                    if ((Int32.Parse(num) > 0)))
                    {
                        count_valid += 1;
                        label_valid.Text = count_valid.ToString();
                        textBox_list.Text += name + "\r\n";
                        textBox_list.Refresh();
                    }
                    count_check += 1;
                    label_check.Text = count_check.ToString();
                    Application.DoEvents();
                }
                catch{}
            }
            sr.Close();
        }
        public String strrepl(String str)
        {
            str = str.Replace("http://", "");
            str = str.Replace("www.", "");
            str = str.Replace("/", "").Trim();
            return str;
        }
        private void button_select_Click(object sender, EventArgs e)
        {
            OpenFileDialog dialog = new OpenFileDialog();
            dialog.Filter = "Текстовые файлы (*.txt, *.log, *.rtf)|*.txt;*.log;*.rtf;";
            if (dialog.ShowDialog() == DialogResult.OK)
            {
                count_check = 0;
                count_valid = 0;
                label_check.Text = "0";
                label_valid.Text = "0";
                url_file = dialog.FileName;
                button_select.Enabled = false;
                button_run.Enabled = true;
            }
                
        }
        private void button_run_Click(object sender, EventArgs e)
        {
            button_run.Enabled = false;
            button_stop.Enabled = true;
            process(); 
            button_stop.Enabled = false;
        }
    }
}

Назначение думаю становиться ясным. Файл с урлами, большой около 100к адресов приходится проходить за раз, по этому я решил не загружать весь список в память а работать по линейно, так как нужна большая скорость парсинга.

Выявились некоторые недостатки:
1) Форма программы тормозит, хоть я ее рендерю каждый раз после шага цикла, но то ли я не правильно делаю то ли это отголоски неправильного алгоритма.
2) В ней не возможно сделать паузу, в идеале Sleep привязанный к событию
3) Многопоточность, подозреваю что проблемы указанные выше, как раз от этого. Но в реализации ее я наткнулся на грабли, то есть как обращаться к одному файловому дескриптору, например 5 отдельным потокам. Я так подразумеваю, что нужно создавать систему очередей, тогда сама идея многопоточности, становиться под вопросом, хотя могу и ошибаться.

Программа хоть и работает, но покоя мне не дает, хочу довести до идеала. Натолкните на правильный алгоритм, хочу научится правильно мыслить. Всем спасибо за ранее.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
19.09.2013, 00:53
Ответы с готовыми решениями:

Правильный или не правильный ответ
Я создал основу для теста, а дальше по заданию вообще продвинуться не могу, помогите чем сможите! Задание: 1.Создать форму по примеру. ...

Indy: программа не получает правильный ответ от сервера, но сниффер показывает правильный ответ
Всем привет. Моя программа должна сделать гет запрос на определенный сайт. Я включаю программу и снифферю. В сниффере показывается...

Не правильный H1?
Здрасте! Объясните мне дураку, почему дорвей в яндексе по слову ******, вообще не найти на первых страницах, а по elite russian girls...

7
 Аватар для Петррр
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
19.09.2013, 08:32
1. Зачем парсеру GUI? Вполне подойдет консольное приложение. Для увеличения скорости парсинга используйте многопоточность (Thread, TPL).
3. Сто тысяч ссылок - это мала. Поэтому их можно загрузить в потокобезопасную очередь. Файл тоже можно использовать, для этого просто блокируете файл (lock)
1
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 3
19.09.2013, 15:46  [ТС]
Спасибо Петррр, то есть торможение формы вызвано однопоточностью? я правильно понял?
0
 Аватар для Петррр
6721 / 3570 / 900
Регистрация: 28.10.2010
Сообщений: 5,937
19.09.2013, 16:18
Совершенно точно.
0
19.09.2013, 16:23

Не по теме:

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

0
19.09.2013, 18:44

Не по теме:

m0nax, В чем проблема? Создаете тему с названием "Правильный парсер" и вперед. Коллективным разумом пилить...

0
0 / 0 / 0
Регистрация: 18.09.2013
Сообщений: 3
20.09.2013, 00:39  [ТС]
m0nax В точку, я так то как раз и хотел мысли по реализации правильного алгоритма парсера, я даже так и написал

Натолкните на правильный алгоритм, хочу научится правильно мыслить.
Пожалуй, я начну, так как хочу выслушать компетентные мнения

1) Многопоточность, при первом приближении я думаю что это сделать двумя способами, Thread или BackgroundWorker, ссылки на потоки я бы запихнул в глобальный ArrayList, чтобы было удобно контролировать их

2) Данные, загружать в ArrayList и отправлять в ConcurrentQueue.

Это моя первая программа в десктопах, не обращайте внимание на спецефический подход)
0
Неадекват
 Аватар для freeba
1501 / 1237 / 248
Регистрация: 02.04.2010
Сообщений: 2,807
20.09.2013, 02:54
Vec, Имхо, для многопоточности лучше таски - вся необходимая инфраструктура уже есть в фреймворке, кода для управления потоками минимум.

Глобальный массив - не лучшая идея. Алгоритм работы:
-Сунули данные парсеру.
-Парсер переварил, обработал данные.
-Парсер уведомил нас что закончил и доступно объяснил, где лежит результат.

И все это в изолированном режиме - результаты или запросы пересекаться не должны.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.09.2013, 02:54
Помогаю со студенческими работами здесь

Правильный инклюд *.h!
Привет, хочю задать такой вопрос. У меня есть класы в файлах Menu.h, Options.h, About.h, Game.h, Pause.h. Каждый из етих класов должен...

Правильный ответ
Помогите найти правильный ответ: 1) What will I see as output if I were to execute the following statements: PriorityQueue...

Правильный ViewPager
Вообщем все что я сделал прикрепил на картинке. Беда то вот в чем. Ну например я тыкаю пальцем ну и скролирую, а тыкаю то я в кнопку...

Не правильный JS возможно
Нужно узнать,сколько дней прошло с нг,нашел скрипт в интернете,подключил к html,но ничего не происходит при запуске,подскажите как...

Правильный размер
Всем снова доброго времени суток! Работаю с QTableView и с QStandartItemModel соответственно. Объекты используется для создания некого...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru