0

我想在 c# 中编写一个 html 刮板,它可以从我想要的页面中获取链接或其他目标字符串。

我刚开始就直接遇到了一个问题:我不知道如何在类中分离代码,所以我可以使用不同的搜索引擎。

这是我当前的代码:

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 回答