我正在尝试创建一个Proxy Scraper。对于我拥有的每个网站,我都试图抓住代理。每个网站的scrape代码都在一个带有网站名称的类中。
例如:
我有网站" wwww.proxy.com和www.moreproxy.com"
我有两个类:Proxy和MoreProxy的功能" scrape"因两者而异(因为它们是不同的网站)。
要获得列表,我会这样做:
//The below code doesn't exist, but just to get my point across
//Each datagrid.Add is in a separate thread
datagrid.Add(new Proxy().scrape());
datagrid.Add(new MoreProxy().scrape());
datagrid.Add(...);
datagrid.Add(...);
//And so on for all the other websites I might add...
现在有办法循环吗?我正在尝试这样的东西,但它不起作用:
List<object> objects = new List<object>();
objects.Add(new Proxy(), new MoreProxy(), ..., ...); //I can update this each time I add a new website
foreach(object o in objects)
{
datagrid.Add(o.scrape());
}
scrape函数看起来像这样:
public List<string[]> scrape()
{
HtmlDocument PageContent = new HtmlWeb().Load("https://free-proxy-list.net/");
HtmlNode[] nodes = PageContent.DocumentNode.SelectNodes("//td").ToArray();
List<string[]> proxies = new List<string[]>();
for (int i = 0; i < nodes.Length; i += 8)
{
string[] proxy = { nodes[i].InnerHtml, nodes[i + 1].InnerHtml };
proxies.Add(proxy);
}
return proxies;
}
这样的事情存在吗?基本上我有几个类具有共同的功能刮。我想创建一个所有这些类的列表作为对象,并执行函数scrape。我该怎么做(解决方案需要线程安全)
答案 0 :(得分:0)
设置界面:
public interface IScrape()
{
object Scrape();
}
让你的代理类实现接口:
// repeat for Proxy
public class MyProxy : IScrape{
object Scrape()
{
return something;
}
}
然后
List<IScrape> objects = new List<IScrape>();
objects.Add(new Proxy(), new MoreProxy(), ..., ...); //I can update this each time I add a new website
foreach(IScrape o in objects)
{
datagrid.Add(o.Scrape());
}
答案 1 :(得分:0)
接口是问题的解决方案。
像这样:
public interface IScrapable {
void Scrape();
}
public class Proxy : IScrapeable {
public void Scrape() { ...}
}
现在你可以循环并刮擦你的物体了。
List<IScrapable> objects = new List<IScrapable>();
objects.Add(new Proxy(), new MoreProxy(), ..., ...); //I can update this each time I add a new website
foreach(IScrapable o in objects)
{
datagrid.Add(o.scrape());
}
这应该做你想要的。