Question

Je revisite un de mes vieux codes et suis tombé sur une méthode pour obtenir le titre d'un site Web en fonction de son URL. Ce n'est pas vraiment ce que vous appelleriez une méthode stable car elle échoue souvent à produire un résultat et parfois même à produire des résultats incorrects. De plus, il arrive parfois que certains des caractères du titre ne soient pas affichés, car il s’agit d’un codage alternatif.

Quelqu'un a-t-il des suggestions d'amélioration par rapport à cette ancienne version?

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;
}

Une dernière remarque - j'aimerais que le code soit également plus rapide, car il bloque jusqu'à ce que la page ait été récupérée. Par conséquent, si je peux obtenir uniquement l'en-tête du site et non la page entière, ce serait formidable.

Était-ce utile?

La solution

Un moyen plus simple d’obtenir le contenu:

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

Un moyen plus simple et plus fiable d’obtenir le titre:

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

Autres conseils

Avec cette suggestion, un nouveau monde s’ouvre pour vous J'ai aussi eu cette question et suis venu à cette

Télécharger "Pack d'agilité HTML" sur http://html-agility-pack.net/?z=codeplex

Ou accédez à nuget: https://www.nuget.org/packages/HtmlAgilityPack/ Et ajoutez dans cette référence.

Ajouter un suivi en utilisant dans le fichier de code:

using HtmlAgilityPack;

Écrivez le code suivant dans votre méthode:

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

Sources:

https://codeshare.co.uk/blog/how-to-scrape-meta-data-from-a-url-using-htmlagilitypack-in-c/ HtmlAgilityPack obtenir le titre et la méta

Pour ce faire, vous devrez faire plusieurs choses.

  • Personnalisez votre application pour qu'elle puisse traiter plusieurs demandes simultanément et maximiser le nombre de demandes HTTP en cours.
  • Au cours de la requête asynchrone, téléchargez uniquement la quantité de données que vous souhaitez récupérer, vous pouvez probablement analyser les données à la recherche
  • .
  • Voulez-vous probablement utiliser regex pour extraire le nom du titre

Je l'ai déjà fait avec les robots SEO et j'ai été en mesure de traiter près de 10 000 requêtes à la fois. Vous devez simplement vous assurer que chaque requête Web peut être autonome dans un fil de discussion.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top