Я пересматриваю свой старый код и наткнулся на метод получения названия веб-сайта на основе его 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;
}
И последнее замечание: я бы хотел, чтобы код также работал быстрее, так как он блокируется до тех пор, пока страница не будет извлечена, поэтому, если я могу получить только заголовок сайта, а не всю страницу, было бы здорово.





Для этого вам нужно сделать пару вещей.
Я делал это раньше с помощью SEO-ботов, и мне удавалось обрабатывать почти 10 000 запросов одновременно. Вам просто нужно убедиться, что каждый веб-запрос может содержаться в потоке.
Это спорный вопрос, поскольку мне нужно выполнять только один запрос за раз. Потребность в скорости возникает из-за того, что пользователь ждет ответа.
@Jon, ну, как я уже сказал, мой был SEO-ботом, который анализирует, и, очевидно, вы хотите ограничить количество запросов за раз для каждого анализа, чтобы сохранить разумный объем памяти. Однако 10 000 были сценарием стресс-теста. И асинхронность была предложением, как просто загрузить заголовок.
@Morten, я просто ухожу от самых основных деталей, которые вы мне дали. Вы сказали, что хотите, чтобы он работал быстрее, и что вы хотите загрузить только заголовок, асинхронный запрос - лучший способ ограничить загружаемый размер, потому что вы можете остановить процесс, когда найдете свой ответ.
@Jon, вы используете довольно определенное утверждение, что вам не нужен поток для каждого запроса, это может быть правдой, но вы забываете об анализе, который сопровождает каждый запрос. Если бы процессор анализа был однопоточным, то очередь образовалась бы ужасно.
Более простой способ получить контент:
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?
Я думаю, что единственное, что нужно добавить, это то, что вам нужно добавить @ (для экранирования) к шаблону, то есть: @ "\ <title \ b [^>] * \> \ s * (? <Title> [\ s \ S] *?) \ </ title \> "
Это руководство предлагает хорошее решение для добавления тайм-аута (и прочего) в класс WebClient: codegator.com/mcook/archive/2006/07/17/…
Возможно, с этим предложением для вас откроется новый мир У меня тоже был этот вопрос, и я пришел к этому
Загрузите «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 получает заголовок и мета
Вы, безусловно, хотите, чтобы не предоставлял каждому запросу отдельный поток, если вы хотите обрабатывать 10 000 запросов за раз! (Задействованный стек съел бы вашу память как сумасшедший.) Использование асинхронного API распараллелит операцию без, затратив поток на каждый запрос.