• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

jxnkwlp/DotnetSpiderLite: 轻量级爬虫框架。源于DotnetSpider

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称:

jxnkwlp/DotnetSpiderLite

开源软件地址:

https://github.com/jxnkwlp/DotnetSpiderLite

开源编程语言:

C# 99.9%

开源软件介绍:

DotnetSpiderLite

轻量级 dotnet 爬虫。复刻自 DotnetSpider

造这个轮子的原因是, DotnetSpider各个之间依赖太强了,本来想简单的采集一些东西,安装后却来了一个全家桶... 我的期望是各个组件之间尽可能的解耦,但需要的时候就安装这个组件。

Build Status

名词

  1. Downloader : 下载器
  2. PageProcessor : 页面下载器
  3. Pipeline : 数据管道
  4. Scheduler : 队列

TODO

  1. 完善注释
  2. UI管理界面
  3. 使用 Redis 作为队列
  4. 数据库 支持
  5. 支持使用代理
  6. 注解模式

安装

i. 安装包 DotnetSpiderLite.Core

PM> install-package DotnetSpiderLite.Core

ii. 安装html解析扩展包(可选,如果需求解析html,则需要安装) 目前实现了 HtmlAgilityPackAngleSharp

PM> install-package DotnetSpiderLite.HtmlAgilityPack

使用

Spider spider = SpiderBuilder.CreateBuilder()
    .AddRequest("https://www.cnblogs.com/")
    .AddPageProcessor(new CNBlogProcessor())
    .Buid();

spider.Run();
public class CNBlogProcessor : BasePageProcessor
{
    public override void HandlePage(Page page)
    {
        var listEle = page.Selector.SelectorAll(".post_item", HtmlSelectorPathType.Css);

        // 列表页面 
        if (listEle != null && listEle.Count > 0)
        {
            foreach (var item in listEle)
            {
                var title = item.Selector(".titlelnk", HtmlSelectorPathType.Css);
                var href = title.Attributes["href"];

                Console.WriteLine($"列表:{title.InnerHtml} {href}");

                page.AddTargetRequest(href);
            }
        }
        else
        {
            Console.WriteLine(page.Response.Request.Uri);

            var title = page.Selector.Selector(".postTitle a", HtmlSelectorPathType.Css);
            var body = page.Selector.Selector("#cnblogs_post_body", HtmlSelectorPathType.Css);

            page.AddResultItem("title", title?.InnerText?.Trim());
            //page.AddResultItem("content", body?.InnerHtml?.Trim());
        }
    }

}

使用redis作为队列程序

安装包 DotnetSpiderLite.Scheduler.StackExchange.Redis, 这个默认为使用 StackExchange.Redis 组件。

Spider spider = SpiderBuilder.CreateBuilder()
    .AddRequest("https://www.cnblogs.com/")
    .AddPageProcessor(new CNBlogProcessor())
    .Buid();
// ...
spider.UseRedisScheduler("localhost");
// ...
spider.Run();

如果需要使用其他 redis 组件,可安装包 DotnetSpiderLite.Scheduler.Redis , 然后实现 IRedisStore 接口。

Spider spider = SpiderBuilder.CreateBuilder()
    .AddRequest("https://www.cnblogs.com/")
    .AddPageProcessor(new CNBlogProcessor())
    .Buid();
// ...

IRedisStore myRedisStore = [YOU REDISSTORE];
spider.UseRedisScheduler(myRedisStore);

// ...
spider.Run();

使用代理

在一些场景下,可能需要使用代理,有3种形式可以配置。

i. 单个代理。 只指定一个代理,适合用在稳定的代理场景

spider.SetDownloaderProxy(new WebProxy("127.0.0.1", 1080)
{
    // Credentials = new NetworkCredential("[USERNAME]", "[PASSWORD]")
});

ii. 多个代理。指定多个代理,每次请求前挑选一个使用。同样,适合在有稳定的代理场景。因为不会有失败检测。

spider.SetDownloaderProxy(new SimpleDownloaderProxyPools(
    new WebProxy("127.0.0.1", 1080),
    new WebProxy("192.168.1.1", 1080),
    new WebProxy("192.168.1.2", 1080)
    ));

iii. 使用默认实现的代理池。有失败检测,适合有很多个代理的场景下

安装包 DotnetSpiderLite.ProxyPools , 实现 IHttpProxyFinder 接口。

var finder = [HttpProxyFinder];
spider.UseHttpProxyPools(finder);



鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap