Question

Quand il n'y a pas d'API de service Web disponible, votre seule option est peut-être à l'écran Gratter, mais comment vous le faites dans c #?

comment pensez-vous de le faire?

Était-ce utile?

La solution

Matt et les réponses de Paul sont corrects. « Grattage écran » en analysant le code HTML d'un site Web est généralement une mauvaise idée parce que:

  1. L'analyse syntaxique HTML peut être difficile , surtout si elle est malformé. Si vous gratter une page très, très simple alors des expressions régulières pourraient travailler. Sinon, utilisez un cadre d'analyse syntaxique comme le HTML Agility Pack.

  2. Les sites Web sont une cible mobile . Vous devez mettre à jour votre code chaque fois que le site source change leur structure de balisage.

  3. screen scraping ne joue pas bien avec Javascript . Si le site cible utilise toute sorte de scénario dynamique pour manipuler la page Web que vous allez avoir beaucoup de mal à racler. Il est facile de saisir la réponse HTTP, il est beaucoup plus difficile de gratter ce que le navigateur affiche en réponse à un script côté client contenu dans cette réponse.

Si screen scraping est la seule option, voici quelques clés du succès:

  1. le rendre aussi facile que possible de changer les modèles vous recherchez . Si possible, stocker les motifs sous forme de fichiers texte ou dans un fichier de ressources quelque part. Il est très facile pour les autres développeurs (ou vous-même en 3 mois) pour comprendre ce balisage que vous attendez à trouver.

  2. Valider l'entrée et lancer des exceptions significatives . Dans votre code d'analyse syntaxique, prenez soin de faire vos exceptions très utiles. Le site cible changement sur vous, et quand cela arrive, vous voulez que vos messages d'erreur pour vous dire non seulement quelle partie du code a échoué, mais pourquoi il a échoué. Mention à la fois le modèle que vous recherchez et le texte que vous comparez contre.

  3. Ecrire beaucoup de tests automatisés . Vous voulez qu'il soit très facile à exécuter votre scraper de façon non destructive parce que vous faire beaucoup de développement itératif pour obtenir les modèles à droite. Automatiser autant les tests que vous pouvez, il sera rentable à long terme.

  4. Considérons un outil d'automatisation du navigateur comme Watin . Si vous avez besoin d'interactions complexes avec le site cible, il pourrait être plus facile d'écrire votre scraper du point de vue du navigateur lui-même, plutôt que de déblayage avec les requêtes HTTP et les réponses à la main.

pour comment pour racler l'écran en C #, vous pouvez utiliser Watin (voir ci-dessus) et gratter le document résultant en utilisant son DOM, ou vous pouvez utiliser la classe WebClient [voir MSDN ou Google] pour obtenir à la réponse HTTP brute, y compris le contenu HTML, puis utiliser une sorte d'analyse à base de texte pour extraire les données que vous voulez.

Autres conseils

Utilisez Html Agility pack . Il gère mal et HTML malformé. Il vous permet de requête avec XPath, ce qui rend très facile de trouver les données que vous recherchez. NE PAS écrire un analyseur à la main et ne pas utiliser des expressions régulières, il est tout simplement trop maladroit.

Le terme que vous recherchez est en fait appelé Écran Grattage.

Une chose que vous devez considérer au sujet de grattage des sites Web est qu'ils sont hors de votre contrôle et peuvent changer fréquemment et de manière significative. Si vous allez à gratter le fait du changement devrait partie de votre stratégie globale. Par exemple. vous devez mettre à jour votre code, tôt ou tard pour faire face à une « cible mouvante ».

Voici quelques liens C # pour vous aider à démarrer:

http://www.cambiaresearch.com/c4/3ee4f5fc-0545-4360-9bc7-5824f840a28c/How-to-scrape-or-download-a-webpage-using-csharp.aspx

Voici un exemple de code C # qui vous aidera à

Uri url = new Uri("http://msdn.microsoft.com/en-US/");
if (url.Scheme == Uri.UriSchemeHttp)
{
    //Create Request Object
    HttpWebRequest objRequest = (HttpWebRequest)HttpWebRequest.Create(url);
    //Set Request Method
    objRequest.Method = WebRequestMethods.Http.Get;
    //Get response from requested url
    HttpWebResponse objResponse = (HttpWebResponse)objRequest.GetResponse();
    //Read response in stream reader
    StreamReader reader = new StreamReader(objResponse.GetResponseStream());
    string tmp = reader.ReadToEnd();
    objResponse.Close();
    //Set response data to container
    this.pnlScreen.GroupingText = tmp;
}

Juste une chose à noter, quelques personnes ont mentionné en tirant sur le site Web comme XML, puis en utilisant XPath pour itérer à travers les nœuds. Il est probablement important de vous assurer que vous travaillez avec un site qui a été développé en XHTML pour vous assurer que le code HTML représente un document XML bien formé.

Du point de vue pratique (je l'ai écrit des dizaines d'applications « web interactif » au fil des ans), je me suis finalement installé sur Watin CSQuery .

Watin fournir les bases de l'automatisation du navigateur (en interaction avec des boutons, etc.), tandis que CSQuery vous permet d'utiliser la syntaxe de style jQuery pour analyser le contenu de la page.

J'utilisé Sélénium pendant un certain temps (également conçu pour les tests automatisés de sites web) avec IE et FireFox, mais trouve qu'il est enclin à se briser quand il est utilisé pour racler à long terme. Tous mes systèmes de production actuels sont Watin + CSQuery et fournissent racler fiable de plusieurs sites Web sur une base quotidienne.

Note: Je me rends compte Watin n'a pas été mis à jour pendant un certain temps, mais "si elle est pas cassé, l'utilise!":)

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