Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.73/26: Рейтинг темы: голосов - 26, средняя оценка - 4.73
1 / 1 / 0
Регистрация: 29.05.2014
Сообщений: 175

Парсинг страниц в параллельных потоках

17.03.2015, 18:16. Показов 4878. Ответов 49
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
знаю что скорее всего никто не поможет, но всё же) есть метод который с каждой страницы сайта считывает определённое слово, и таких страниц 10-20. ждать пока программа считает каждую страницу и только потом выдаст ответ - долго. нужно, чтобы все 10 страниц считывались одновременно параллельно. как это реализовать в моём методе?

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
         static CookieDictionary cook = new CookieDictionary();
 
         string[] GET_3()
        {
 
            List<string> f_list = new List<string>();
            var request = new HttpRequest();
            request.UserAgent = HttpHelper.ChromeUserAgent();
            request.Cookies = cook;
            //HttpResponse response = request
 
            Regex newReg = new Regex("<a href=\"/(.*)\" class=\"stream-profile-container\">");
            int P_n = 1;
            while (true)
            {
                HttpResponse response = request.Get(string.Format("http://ask.fm/likes/id89413064/question/124782358537/people/?page={0}", P_n));
                P_n++;
                var z = response.ToString();
 
                MatchCollection matches = newReg.Matches(z);
 
                if (matches.Count <= 0)
                    break;
 
                for (int i = matches.Count - 1, w = 1; i > -1; i--, w++)
                    f_list.Add(matches[i].Groups[1].ToString());
 
            }
 
            return f_list.ToArray();
        }
        
        private void bt_follow_Click_1(object sender, EventArgs e)
        {
            listBox1.Items.AddRange(GET_3());
         }
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.03.2015, 18:16
Ответы с готовыми решениями:

Обработка множества файлов в параллельных потоках
День добрый, уважаемые форумчане. Прошу помочь с моим камнем преткновения &quot;Потоками&quot;. Имеется задача: На диске существует папка...

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

Заполнение векторов в параллельных потоках
Доброе время суток! Имеется несколько векторов, задача заключается в том,чтобы заполнить их значениями в функциях, дабы это...

49
Кодогенератор
 Аватар для hepper
200 / 200 / 51
Регистрация: 15.06.2011
Сообщений: 794
17.03.2015, 22:40
в цикле запустите 10 потоков/асинхронно с исполнением вашего метода и ждите результат, который потом обрабатывайте.
0
1 / 1 / 0
Регистрация: 29.05.2014
Сообщений: 175
17.03.2015, 23:20  [ТС]
hepper, я не знаю как это сделать, поэтому и прошу чтоб тут мне помогли добрые люди) вы можете мне помочь это сделать??
0
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
18.03.2015, 00:44
Лучший ответ Сообщение было отмечено Inkorpus как решение

Решение

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
private static Task<List<string>> RequestToSite(int firstPageNumber=1, int lastPageNumber=10)
        {
           var cookieContaner = new CookieContainer();
             // set your own cookies
             //...
            var newReg = new Regex("<a href=\"/(.*)\" class=\"stream-profile-container\">");
            
            var parent = new Task<List<string>>(() =>
            {
                var results = new List<string>();
                var list = Enumerable.Range(firstPageNumber, (lastPageNumber-firstPageNumber+1));
                foreach (var par in list)
                    new Task(() =>
                    {
                        Console.WriteLine("ThreadId={0}", Thread.CurrentThread.ManagedThreadId);
                        var nextOneResult = new List<string>();
                        var request = (HttpWebRequest)WebRequest.Create(String.Format(@"http://ask.fm/likes/id89413064/question/124782358537/people/?page={0}",par));
                        request.UserAgent = "Chrome";
                        request.CookieContainer = cookieContaner;
                        string responsestring = null;
                        using (var reader = new StreamReader(request.GetResponse().GetResponseStream()))
                            responsestring = reader.ReadToEnd();
                        var matches = newReg.Matches(responsestring);
 
                        if (matches.Count > 0)
                        {
                            for (int i = matches.Count - 1, w = 1; i > -1; i--, w++)
                                nextOneResult.Add(matches[i].Groups[1].ToString());
                            results.AddRange(nextOneResult);
                        }
                    },TaskCreationOptions.AttachedToParent).Start();
                return results;
            });
            parent.Start();
            return parent;
        }
 
static void Main(string[] args)
        {
            var sw = Stopwatch.StartNew();
            var res = RequestToSite(1,5).Result;
            sw.Stop();
            Console.WriteLine("Execution time: {0}",sw.Elapsed.TotalSeconds);
            foreach (var result in res)
            {
                Console.WriteLine(result);
            }
            Console.ReadKey(true);
        }
Насчет потокобезопасности при доступе из разных Task-ов к коллекции results не уверен.
1
1 / 1 / 0
Регистрация: 29.05.2014
Сообщений: 175
18.03.2015, 01:07  [ТС]
IamRain, выдаёт одну единственную ошибку:

Ошибка 1 Имя "Stopwatch" отсутствует в текущем контексте
0
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
18.03.2015, 01:08
C#
1
using System.Diagnostics;
0
1 / 1 / 0
Регистрация: 29.05.2014
Сообщений: 175
18.03.2015, 01:10  [ТС]
IamRain, благодарен вам за помощь! =)
0
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
18.03.2015, 01:11
Для сравнения: быстрее хоть выполняется?
0
1 / 1 / 0
Регистрация: 29.05.2014
Сообщений: 175
18.03.2015, 01:27  [ТС]
IamRain, ну сейчас я поработал с цифрами и довёл вывод данных до 1.111 сек) для справки - вывод без многопоточности занимал в среднем 7сек+ =)

я извиняюсь, а вы бы не могли пояснить комментариями свою работу? только сам процесс создания потоков

Добавлено через 2 минуты
IamRain,
C#
1
RequestToSite(int firstPageNumber=1, int lastPageNumber=10)
– тут я так понял создаётся список отвечающий за кол-во потоков?

C#
1
2
3
4
5
6
7
var parent = new Task<List<string>>(() =>
            {
                var results = new List<string>();
                var list = Enumerable.Range(firstPageNumber, (lastPageNumber-firstPageNumber+1));
                foreach (var par in list)
                    new Task(() =>
                    {
– как конкретно действует эта часть?

C#
1
2
3
var sw = Stopwatch.StartNew();
            var res = RequestToSite(1,5).Result;
            sw.Stop();
– и вот эта?
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
18.03.2015, 01:28
Цитата Сообщение от IamRain Посмотреть сообщение
Насчет потокобезопасности при доступе из разных Task-ов к коллекции results не уверен.
C#
1
var results = new ConcurrentBag<string>();
2
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
18.03.2015, 01:34
Цитата Сообщение от Inkorpus Посмотреть сообщение
– как конкретно действует эта часть?
Между Task-ами можно устанавливать отношение "Родитель-потомок". C использованием флага TaskCreationOptions.AttachedToParent при создании потока. Когда у Task-а родителя есть дочерние таски, то он не завершится до тех пор, пока не завершится выполнение всех дочерних тасков.
Просто на каждую страницу тут создается один дочерний Task.
1
1 / 1 / 0
Регистрация: 29.05.2014
Сообщений: 175
18.03.2015, 01:39  [ТС]
IamRain, ещё раз благодарю =)

Добавлено через 4 минуты
IamRain, хммммм только что заметил одну вещь - выводит только 40 id, хотя в той ссылке их ровно 260
0
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
18.03.2015, 01:50
Ну, проверив в отладчике, вижу, что не каждая таска находит совпадения. (То бишь Matches.Count = 0)
0
1 / 1 / 0
Регистрация: 29.05.2014
Сообщений: 175
18.03.2015, 01:53  [ТС]
IamRain, мой косяк, тут старая ссылка в которой 40 человек =) не досмотрел

Добавлено через 3 минуты
IamRain, да и вправду не каждая, как это исправить можно?
0
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
18.03.2015, 01:56
Смотрите ваш регекс. Для подобных задач есть специально заточенный HtmlAgilityPack. Если я прав, конечно.
0
1 / 1 / 0
Регистрация: 29.05.2014
Сообщений: 175
18.03.2015, 01:58  [ТС]
IamRain, мой регекс без многопоточности находил все id =) мне кажется что он не все страницы просматривает, как считаете?
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
18.03.2015, 01:59
Вот доработанная версия. И не подвешивает окно. Я просто в оконном начал тестить, да и думаю, что релиз будет не консольным

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow"
        Width="525"
        Height="350"
        WindowStartupLocation="CenterScreen">
    <Grid>
        <ListBox x:Name="listBox"
                 Width="258"
                 Margin="10,10,0,10"
                 HorizontalAlignment="Left" />
        
        <Button Width="75"
                Margin="273,10,0,0"
                HorizontalAlignment="Left"
                VerticalAlignment="Top"
                Click="FollowButton_Click"
                Content="Получить" />
 
    </Grid>
</Window>
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
using System.Diagnostics;
using System.Windows;
 
namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        
        private async void FollowButton_Click(object sender, RoutedEventArgs e)
        {
            listBox.Items.Clear();
 
            var sw = Stopwatch.StartNew();
            var res = await WebSiteParser.RequestToSite(1, 5);
            sw.Stop();
 
            Debug.WriteLine("Execution time: {0}", sw.Elapsed.TotalSeconds);
 
            foreach (var result in res)
            {
                Debug.WriteLine(result);
                listBox.Items.Add(result);
            }
        }
    }
}
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
    static class WebSiteParser
    {
        public static Task<ConcurrentBag<string>> RequestToSite(int firstPageNumber = 1, int lastPageNumber = 10)
        {
            var cookieContaner = new CookieContainer();
            // set your own cookies
            //...
            var newReg = new Regex("<a href=\"/(.*)\" class=\"stream-profile-container\">");
 
            var parent = new Task<ConcurrentBag<string>>(() =>
            {
                var results = new ConcurrentBag<string>();
                var list = Enumerable.Range(firstPageNumber, (lastPageNumber - firstPageNumber + 1));
                foreach (var par in list)
                {
                    new Task((page) =>
                    {
                        Debug.WriteLine("ThreadId={0}", Thread.CurrentThread.ManagedThreadId);
                        var nextOneResult = new List<string>();
                        var request = (HttpWebRequest)WebRequest.Create(String.Format(
                            @"http://ask.fm/likes/id89413064/question/124782358537/people/?page={0}", page));
                        request.UserAgent = "Chrome";
                        request.CookieContainer = cookieContaner;
                        string responsestring = null;
                        using (var reader = new StreamReader(request.GetResponse().GetResponseStream()))
                            responsestring = reader.ReadToEnd();
                        var matches = newReg.Matches(responsestring);
 
                        if (matches.Count > 0)
                        {
                            for (int i = matches.Count - 1, w = 1; i > -1; i--, w++)
                                nextOneResult.Add(matches[i].Groups[1].ToString());
 
                            for (int i = 0; i < nextOneResult.Count; i++)
                                results.Add(nextOneResult[i]);
                        }
                    }, par, TaskCreationOptions.AttachedToParent).Start();
                }
 
                return results;
            });
            parent.Start();
            return parent;
        }
    }
Вложения
Тип файла: rar AskFmParser.rar (73.7 Кб, 8 просмотров)
1
1 / 1 / 0
Регистрация: 29.05.2014
Сообщений: 175
18.03.2015, 02:05  [ТС]
Casper-SC, очень вам благодарен! =) а в чём была проблема?
0
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
18.03.2015, 02:11
Цитата Сообщение от Inkorpus Посмотреть сообщение
а в чём была проблема?
Я не говорю, что всё должно заработать, что вы недавно обсуждали (не все страницы и т.д.). Я этого и не видел, когда выкладывал. Просто я чуть переделал мелочи, которые всё же нужно было переделать. И пример как не подвешивать окно.

Добавлено через 2 минуты
То есть, вероятно, ещё есть что исправлять.
0
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,228
18.03.2015, 02:11
То есть все же лучше передавать в конструктор Task-и параметр, нежели использовать замыкание? Результат тот же.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.03.2015, 02:11
Помогаю со студенческими работами здесь

Умножение матриц в параллельных потоках
Помогите пожалуйста! Необходимо создать две матрицы 10x10, которые будут автоматически заполнятся числами от 1 до 9. перемножить...

Организовать рандом в параллельных процессах(потоках)
как организовать рандом в параллельных процессах(потоках)? про rand() и srand(time(0)) в main знаю но т.к. в одно время и в разных...

Парсинг страниц
У меня небольшая проблема. Вот суть моей идеи. Есть страница с торрент-трекера, чтобы каждый раз не залазить на сайт, я хотел бы сделать...

Парсинг страниц!
Добрый день подскажите кто знает как отпарсить правильно данную страничку http://devilscity.combats.com/inf.pl?1133864833, мне нужны ссылки...

Парсинг страниц(ы)
Добрый день, товарищи! Решил попробовать автоматизировать выкачивание данных с сайта АТС посредством Python (изучал в университете, решил...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru