有没有好的开源C#网络爬虫框架?

11

我正在建立一个购物比价引擎,需要构建一个爬虫引擎来执行每日的数据收集过程。

我决定使用C#构建爬虫。我有很多对HttpWebRequest/HttpWebResponse类的糟糕经验,它们被认为是针对大规模爬取高度不稳定和存在bug。因此,我决定不使用这些类。甚至在4.0框架中也有问题。

以上是我个人的经验。

我想听听专家的意见,他们有编写爬虫的经验,是否知道任何像Java的nutch和apache commons这样非常稳定且高度健壮的开源爬虫框架库。

如果已经在C#中存在某些现有的爬虫框架,我将继续在其之上构建我的应用程序。

如果没有,我打算从code project扩展此解决方案。

http://www.codeproject.com/KB/IP/Crawler.aspx

如果有人能给我提供更好的建议,我将非常感谢。

编辑:我要爬取的一些网站是使用非常复杂的JavaScript渲染页面,这增加了我的网络爬虫的复杂性,因为我需要能够爬取由JavaScript呈现的页面。如果有人在C#中使用了任何可以爬取JavaScript渲染的库,请分享一下。我已经使用过watin,但不喜欢它,我也知道selenium。如果您知道其他内容,请与我和社区分享。


9
HttpWebRequest 有哪些缺陷? - SLaks
1
http://htmlagilitypack.codeplex.com/ - Kirk Woll
@Sumit:不存在这样的问题。如果你遇到了麻烦,请提出一个单独的问题。 - SLaks
@slaks,你在微软工作吗?看起来是这样的,错误确实存在,不仅仅是我,整个社区都可以证明这一点。微软在httpwebrequest中编写了很多愚蠢的会话处理代码。 - Sumit Ghosh
你最终是如何实现你的工具的? - Babar
显示剩余4条评论
6个回答

3

关于C#网络爬虫

来自http://code.google.com/p/abot/的描述如下: Abot是一个开源的C#网络爬虫,具有速度和灵活性。它处理底层多线程、HTTP请求、调度、链接解析等方面的工作。你只需钩入关键事件来处理数据或插件您自己的核心接口实现,以完全控制爬行过程。

尽管我们没有使用过。


3

PhantomJS + HtmlAgilityPack

我知道这个话题有点老了,但是我迄今为止最好的结果是使用PhantomJS。它有一个NuGet包,并与HtmlAgilityPack结合使用,可以成为一个相当不错的抓取和爬取工具包。

此示例仅使用了PhantomJS内置的解析功能。这适用于非常旧的库版本;由于它似乎仍在积极开发中,因此可以安全地假定已添加了更多功能。

void Test()
{
    var linkText = @"Help Spread DuckDuckGo!";
    Console.WriteLine(GetHyperlinkUrl("duckduckgo.com", linkText));
    // as of right now, this would print ‘https://duckduckgo.com/spread’
}

/// <summary>
/// Loads pageUrl, finds a hyperlink containing searchLinkText, returns
/// its URL if found, otherwise an empty string.
/// </summary>
public string GetHyperlinkUrl(string pageUrl, string searchLinkText)
{
    using (IWebDriver phantom = new PhantomJSDriver())
    {
        phantom.Navigate.GoToUrl(pageUrl);
        var link = phantom.FindElement(By.PartialLinkText(searchLinkText));
        if(link != null)
            return link.GetAttribute("href");
    }
    return string.Empty;
}

2

arachnode.net可以处理JavaScript。


2

我知道有一个叫做NCrawler的东西,它可以在codeplex上获得。虽然我个人没有使用过,但我的同事说它还不错。


0

Ncrawler不支持Javascript。但如果您不需要Javascript执行,它看起来非常好,并且易于使用的解决方案。


0

我知道这个话题很古老,但我为快速爬虫编写制作了一个解决方案,可能对其他人有用。包的名称是

Laraue.Crawling.Dynamic.PuppeterSharp

首先,您需要描述您想要接收的模型,这是主要的想法。

public class User
{
    string Name { get; set; }
    int Age { get; set; }
    string[] ImageLinks { get; set; }
}

然后编写如何填充它的值

var schema = new PuppeterSharpSchemaBuilder<User>()
    .HasProperty(x => x.Name, ".name")
    .HasProperty(x => x.Age, ".age")
    .HasArrayProperty(
        x => x.ImageLinks,
        ".links a",
        async handle => await handle.GetAttributeValueAsync("href"))
    .Build();

然后可以解析此模式。该库内部使用PuppeterSharp

// Download browser and open the page
await new BrowserFetcher().DownloadAsync();
await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions());
var page = await browser.NewPageAsync();
var response = await page.GoToAsync(link);

// Parse the page using described schema
var parser = new PuppeterSharpParser(new LoggerFactory());
var model = await parser.RunAsync(schema, await page.QuerySelectorAsync("body"));

还支持通过AngleSharp库进行静态爬取,当不需要JS渲染时,可以通过该包实现。

Laraue.Crawling.Static.AngleSharp

模式描述的方式是相同的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接