Парсер многостраничного сайта - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, уважаемые программисты. Обращаюсь к вам с такой проблемой. Написал парсер для сайта одной игры. Парсер работает отлично, код ниже прилагаю, но есть одна проблема - на сайте больше 6 миллионов страниц, которые мне необходимо прочитать. Последовательный подход, привел к тому, что 100.000 страниц, пропарсил за 10 часов примерно. Предполагаю, что многопоточность помогла бы решить проблему, но не могу понять, как передать метод в потоки. Как сделать правильно? Бьюсь уже не первый день, но видимо рано подошел к идее многопоточности. Если у вас есть советы или идеи, как решить мою проблему, буду сильно благодарен. Итак, код:
  public partial class Form1 : Form
    {
        int id = 48234;
        string page = @"http://www.heroeswm.ru/pl_info.php?id=";
        
        WebClient web = new WebClient();
        string pattern = @"Груза доставлено - (\S*[0-9])";
        string pattern2 = @"(\w*)";
        string znach;
        string sborka;
        int convertZnach;
        int iterator=13;
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
           
            web.Encoding = UTF8Encoding.Default;
            for (int i = 0; i < 6429691; i++)
            {
              
                string str = web.DownloadString(page + id);

                Regex regex = new Regex(pattern);
 
                Match match = regex.Match(str);
                while (match.Success)
                {
                    // Т.к. мы выделили в шаблоне одну группу (одни круглые скобки),
                    // ссылаемся на найденное значение через свойство Groups класса Match
 
                    znach = match.Groups[1].Value;

                    // Переходим к следующему совпадению
                    match = match.NextMatch();
                }
                if (!String.IsNullOrEmpty(znach))
                {
                    Console.WriteLine("Этот тип был на ивенте! Его АйДи "+id);
                    // здесь происходит поиск цифр в  полученной при загрузке строке. удаляется запятая и конвертируемый результат, попадает в convertZnach
                    Regex regex2 = new Regex(pattern2);

                    Match match2 = regex2.Match(znach);
                    while (match2.Success)
                    {

                        sborka += match2.Groups[1].Value;

                        match2 = match2.NextMatch();
                    }
                    convertZnach = Convert.ToInt32(sborka);
                    if (convertZnach >= 6000)
                    {
 
                        iterator++;
                        Console.WriteLine("Этот тип набил больше 6тонн: "+id);
                        Console.WriteLine(convertZnach);
                        Console.WriteLine(iterator);
                    }
                }
                //3990
                convertZnach = 0;
                sborka = null;
                znach = null;
                id++;
                if (id == 6429690)
                {
                    MessageBox.Show("Последняя итерация");
                }
 
            }
 
            textBox1.Text = "Финиш! Всего прочкошлемных типов:"+iterator;
        }

    }
Заранее, спасибо.

Решение задачи: «Парсер многостраничного сайта»

textual
Листинг программы
DownloadStringAsync

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.455 из 5