Как получить название сайта из C#

Я пересматриваю свой старый код и наткнулся на метод получения названия веб-сайта на основе его URL-адреса. Это не совсем то, что вы назвали бы стабильным методом, поскольку он часто не дает результата, а иногда даже дает неправильные результаты. Кроме того, иногда не удается отобразить некоторые символы из заголовка, поскольку они имеют альтернативную кодировку.

Есть ли у кого-нибудь предложения по улучшению этой старой версии?

public static string SuggestTitle(string url, int timeout)
{
    WebResponse response = null;
    string line = string.Empty;

    try
    {
        WebRequest request = WebRequest.Create(url);
        request.Timeout = timeout;

        response = request.GetResponse();
        Stream streamReceive = response.GetResponseStream();
        Encoding encoding = System.Text.Encoding.GetEncoding("utf-8");
        StreamReader streamRead = new System.IO.StreamReader(streamReceive, encoding);

        while(streamRead.EndOfStream != true)
        {
            line = streamRead.ReadLine();
            if (line.Contains("<title>"))
            {
                line = line.Split(new char[] { '<', '>' })[2];
                break;
            }
        }
    }
    catch (Exception) { }
    finally
    {
        if (response != null)
        {
            response.Close();
        }
    }

    return line;
}

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
16
0
23 666
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Для этого вам нужно сделать пару вещей.

  • Сделайте свое приложение многопоточным, чтобы вы могли обрабатывать несколько запросов одновременно и максимизировать количество выполняемых HTTP-запросов.
  • Во время асинхронного запроса загружайте только тот объем данных, который вы хотите вернуть, вы, вероятно, могли бы выполнить синтаксический анализ данных, когда они вернутся в поисках
  • Вероятно, вы хотите использовать регулярное выражение, чтобы вытащить имя заголовка

Я делал это раньше с помощью SEO-ботов, и мне удавалось обрабатывать почти 10 000 запросов одновременно. Вам просто нужно убедиться, что каждый веб-запрос может содержаться в потоке.

Вы, безусловно, хотите, чтобы не предоставлял каждому запросу отдельный поток, если вы хотите обрабатывать 10 000 запросов за раз! (Задействованный стек съел бы вашу память как сумасшедший.) Использование асинхронного API распараллелит операцию без, затратив поток на каждый запрос.

Jon Skeet 30.11.2008 23:34

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

Morten Christiansen 30.11.2008 23:51

@Jon, ну, как я уже сказал, мой был SEO-ботом, который анализирует, и, очевидно, вы хотите ограничить количество запросов за раз для каждого анализа, чтобы сохранить разумный объем памяти. Однако 10 000 были сценарием стресс-теста. И асинхронность была предложением, как просто загрузить заголовок.

Nick Berardi 01.12.2008 17:02

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

Nick Berardi 01.12.2008 17:04

@Jon, вы используете довольно определенное утверждение, что вам не нужен поток для каждого запроса, это может быть правдой, но вы забываете об анализе, который сопровождает каждый запрос. Если бы процессор анализа был однопоточным, то очередь образовалась бы ужасно.

Nick Berardi 01.12.2008 17:06
Ответ принят как подходящий

Более простой способ получить контент:

WebClient x = new WebClient();
string source = x.DownloadString("http://www.singingeels.com/");

Более простой и надежный способ получить титул:

string title = Regex.Match(source, @"\<title\b[^>]*\>\s*(?<Title>[\s\S]*?)\</title\>",
    RegexOptions.IgnoreCase).Groups["Title"].Value;

Есть ли способ установить тайм-аут при использовании WebClient?

Morten Christiansen 01.12.2008 00:32

Я думаю, что единственное, что нужно добавить, это то, что вам нужно добавить @ (для экранирования) к шаблону, то есть: @ "\ <title \ b [^>] * \> \ s * (? <Title> [\ s \ S] *?) \ </ title \> "

netadictos 01.12.2008 00:53

Это руководство предлагает хорошее решение для добавления тайм-аута (и прочего) в класс WebClient: codegator.com/mcook/archive/2006/07/17/…

Morten Christiansen 01.12.2008 01:14

Возможно, с этим предложением для вас откроется новый мир У меня тоже был этот вопрос, и я пришел к этому

Загрузите «Html Agility Pack» с сайта http://html-agility-pack.net/?z=codeplex

Или перейдите на nuget: https://www.nuget.org/packages/HtmlAgilityPack/ И добавьте в эту ссылку.

Добавьте в файл кода следующее:

using HtmlAgilityPack;

Напишите следующий код в своем методе:

var webGet = new HtmlWeb();
var document = webGet.Load(url);    
var title = document.DocumentNode.SelectSingleNode("html/head/title").InnerText;

Источники:

https://codeshare.co.uk/blog/how-to-scrape-meta-data-from-a-url-using-htmlagilitypack-in-c/HtmlAgilityPack получает заголовок и мета

Другие вопросы по теме