0

必要なページからリンクやその他のターゲット文字列を取得できる HTML スクレーパーを c# でコーディングしたいと考えています。

私は始めたばかりで、すぐに問題に遭遇しました。クラスでコードを分離する方法がわからないため、さまざまな検索エンジンを使用できます。

これは私の現在のコードです:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics;
using System.Net;
using HtmlAgilityPack;

namespace Scraper.Components
{
    class Scraper
    {
        public Scraper()
        {
            WebClient client = new WebClient();
            client.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648)");

            HtmlDocument doc = new HtmlDocument();
            doc.Load(client.OpenRead("xxx"));

            HtmlNode rootNode = doc.DocumentNode;

            HtmlNodeCollection adNodes = rootNode.SelectNodes("//a[@class='ad-title']");

            foreach(HtmlNode adNode in adNodes) {
                Debug.WriteLine(
                    adNode.Attributes["href"].Value
                );
            }
        }
    }
}

私の意図は、以下のコード全体をclient.Headers.Add独立したクラスに分離することです。たとえば、次のように呼び出すことができます。

Scraper scraper = new Scraper(new GoogleSE('http://google.com/...'));

またはそのようなもの。

事前にご協力いただきありがとうございます。

4

1 に答える 1

3

これまでのところ、単なるスターター アイデアですが、このようなものがうまくいくはずです。

これが戦略パターンの始まりです。また、検索エンジン オブジェクトを生成するためのファクトリ パターンを確認することもできます。

namespace Scraper.Components
{
    class Scraper
    {
        public Scraper(ISearchEngine engine)
        {
            WebClient client = new WebClient();
            client.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648)");
            engine.Search(client);
        }

    }
    class GoogleSE: ISearchEngine
    {
        public void Search(WebClient client){
            HtmlDocument doc = new HtmlDocument();
            doc.Load(client.OpenRead("http:\\google.com"));

            HtmlNode rootNode = doc.DocumentNode;

            HtmlNodeCollection adNodes = rootNode.SelectNodes("//a[@class='ad-title']");

            foreach(HtmlNode adNode in adNodes) {
                Debug.WriteLine(
                    adNode.Attributes["href"].Value
                );
            }
        }
    class BingSE: ISearchEngine
    {
        public void Search(WebClient client){
            HtmlDocument doc = new HtmlDocument();
            doc.Load(client.OpenRead("http:\\bing.com"));

            HtmlNode rootNode = doc.DocumentNode;

            HtmlNodeCollection adNodes = rootNode.SelectNodes("//a[@class='ad-title']");

            foreach(HtmlNode adNode in adNodes) {
                Debug.WriteLine(
                    adNode.Attributes["href"].Value
                );
            }
        }
    }

    Interface ISearchEngine{
        void Search();
    }
}
于 2013-09-04T03:04:52.400 に答える