Страницы

Поиск по вопросам

пятница, 13 декабря 2019 г.

Увеличить скорость парсера

#c_sharp #winforms


Как увеличить скорость сбора в разы ?

Если делаю дополнительные потоки с Algoritm2 Algoritm3 и т.д.

То такое ощущение, что скорость распределяется, а не увеличивается.

При этом мощности компьютера и интернет канала полно...

UPD: Не асинхронно, а отдельными потоками в которых всё будет синхронно

using System;
using System.IO;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ParsingImena
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();
        }



        private void Form1_Load(object sender, EventArgs e)
        {

            var algoritm1 = new Task(Algoritm1);
            algoritm1.Start();

        }// Загрузка формы



        private string PoluchitImya(string nomerStranici)
        {
            System.Net.WebClient wc = new System.Net.WebClient();

                String Response = wc.DownloadString("https://site.com/" + nomerStranici);
                String Rate = System.Text.RegularExpressions.Regex.Match(Response,
@"itemprop=""name"">([^<]+)


Ответы

Ответ 1



Расскажу, как это делать более правильно (не идеально, но чуть лучше, чем у вас). Итак, что мы хотим? Мы хотим ускорить загрузку и обработку страничек. За счет чего это можно сделать? За счет асинхронной загрузки и параллельной обработки. Ниже будет пример парсинга нашего сайта SO - я распарсю только несколько страничек, для примера (и чтобы не забанили :)) Как грузить страничку асинхронно? async Task Load(string uri) { using (var client = new HttpClient()) { var res = await client.GetStringAsync(uri); // асинхронная загрузка return res; } } Для удобрства, я напишу метод, который принимает номер страницы Task LoadPage(int page) { return Load($"https://ru.stackoverflow.com/questions/tagged/c%23?page={page}"); } Так, я хочу вытащить из страницы вопросы - заголовок вопроса и его Url. То есть мне нужен класс вопроса public class Question { public string Url {get;set;} public string Title {get;set;} } И способ, как вопросы вытащить со страницы. Я поспользуюсь библиотекой HtmlAgilityPack Question[] GetQuestions(string content) { var doc = new HtmlDocument(); doc.LoadHtml(content); var nodes = doc.DocumentNode.SelectNodes("//*[@class='question-summary']//*/h3/a") .Select(x => new Question() { Title = x.InnerText, Url = x.Attributes["href"].Value }) .ToArray(); return nodes; } Ну и осталось написать метод, который загрузит страничку, распарсит её и вернет список вопросов async Task GetQuestions(int page) { var str = await LoadPage(page); return GetQuestions(str); } Как это запустить? async Task Main() { // грузим 10 страниц var tasks = Enumerable.Range(1, 10) .Select(x=>GetQuestions(x)) .ToArray(); await Task.WhenAll(tasks); // ждем, когда все загрузится // вывод в консоль foreach(var question in tasks.SelectMany(x=>x.Result)) { Console.WriteLine(question.Title); } } Результат - примерно 150 вопросов с 10 страниц было скачано и распарсено за 0,8 секунды Увеличить скорость парсера Как сделать поиск по слову по listbox? Освобождение ресурсов Cannot open database requested by the login C# функции, подпрограммы [требует правки] Изменения стиля внутренних контролов у UserControl'а ........../* тут ещё куча текста*/.......... Событие на нажатие кнопки мыши вне элемента управления. C#. Windows Forms c#, Graphics.DrawString(), InvalidOperationException Привязка анимации WPF Как пропустить unauthorized access exception [дубликат] Добавить текст к имеющемуся И не забудьте все это запускать в отдельном большом таске (по типу как у вас var algoritm1 = new Task(Algoritm1);), чтобы не грузить UI обработками страниц

Комментариев нет:

Отправить комментарий