.Net开源的跨平台爬虫框架 DotnetSpider

项目详细介绍

 

DotnetSpider是开源的.NET跨平台数据采集爬虫框架。需要 Scheduler,Downloader ,Processor,Pipeline 四部分。

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

  public static void Main()

    {

        HttpClientDownloader downloader = new HttpClientDownloader();

 

        Core.Spider spider = Core.Spider.Create(new MyPageProcessor(), new QueueDuplicateRemovedScheduler()).AddPipeline(new MyPipeline()).SetThreadNum(1);

        var site = new Site() { EncodingName = "UTF-8" };

        for (int i = 1; i < 5; ++i)

        {

            site.AddStartUrl("http://www.youku.com/v_olist/c_97_g__a__sg__mt__lg__q__s_1_r_0_u_0_pt_0_av_0_ag_0_sg__pr__h__d_1_p_1.html");

        }

        spider.Site = site;

        spider.Start();

    }

 

    private class MyPipeline : IPipeline

    {

        public void Process(ResultItems resultItems, ISpider spider)

        {

            foreach (YoukuVideo entry in resultItems.Results["VideoResult"])

            {

                Console.WriteLine($"{entry.Name}:{entry.Click}");

            }

 

            //May be you want to save to database

            // 

        }

 

        public void Dispose()

        {

        }

    }

 

    private class MyPageProcessor : IPageProcessor

    {

        public void Process(Page page)

        {

            var totalVideoElements = page.Selectable.SelectList(Selectors.XPath("//div[@class='yk-col3']")).Nodes();

            List<YoukuVideo> results = new List<YoukuVideo>();

            foreach (var videoElement in totalVideoElements)

            {

                var video = new YoukuVideo();

                video.Name = videoElement.Select(Selectors.XPath("/div[4]/div[1]/a")).Value;

                video.Click = int.Parse(videoElement.Select(Selectors.Css("p-num")).Value.ToString());

                results.Add(video);

            }

            page.AddResultItem("VideoResult", results);

        }

 

        public Site Site => new Site { SleepTime = 0 };

    }

 

    public class YoukuVideo

    {

        public string Name { getset; }

        public string Click { getset; }

    }

 

  

添加config 文件: 

app.conf to your project 

 

1

2

redisServer:your redis server 

redisPassword:your redis password

 

添加爬虫上下文类:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

public class JdSkuSpider : ISpiderContext

{

    public SpiderContextBuilder GetBuilder()

    {

        Log.TaskId = "JD SKU Weekly";

        SpiderContext context = new SpiderContext

        {

            SpiderName = "JD SKU " + DateTimeUtils.MONDAY_RUN_ID,

            CachedSize = 1,

            ThreadNum = 8,

            Site = new Site

            {

                EncodingName = "UTF-8"

            },

            Scheduler = new RedisScheduler()

            {

                Host = "redis",

                Port = 6379,

                Password = ""

            },

            StartUrls=new Dictionary<string, Dictionary<stringobject>> {

                "http://list.jd.com/list.html?cat=9987,653,655&page=1&go=0&JL=6_0_0&ms=5"new Dictionary<stringobject> { { "name","手机" }, { "cat3","9987" } } },

            },

            Pipeline = new MysqlPipeline()

            {

                ConnectString = ""

            },

            Downloader = new HttpDownloader()

        };

        return new SpiderContextBuilder(context, typeof(Product));

    }

 

    [Schema("jd""sku_v2", Suffix = TableSuffix.Monday)]

    [TargetUrl(new[] { @"page=[0-9]+" }, "//*[@id=\"J_bottomPage\"]")]

    [TypeExtractBy(Expression = "//div[contains(@class,'j-sku-item')]", Multi = true)]

    [Indexes(Primary = "sku")]

    public class Product : ISpiderEntity

    {

        private static readonly DateTime runId;

 

        static Product()

        {

            DateTime dt = DateTime.Now;

            runId = new DateTime(dt.Year, dt.Month, 1);

        }

 

        [StoredAs("category", DataType.String, 20)]

        [PropertyExtractBy(Expression = "name", Type = ExtractType.Enviroment)]

        public string CategoryName { getset; }

 

        [StoredAs("cat3", DataType.String, 20)]

        [PropertyExtractBy(Expression = "cat3", Type = ExtractType.Enviroment)]

        public int CategoryId { getset; }

 

        [StoredAs("url", DataType.Text)]

        [PropertyExtractBy(Expression = "./div[1]/a/@href")]

        public string Url { getset; }

 

        [StoredAs("sku", DataType.String, 25)]

        [PropertyExtractBy(Expression = "./@data-sku")]

        public string Sku { getset; }

 

        [StoredAs("commentscount", DataType.String, 20)]

        [PropertyExtractBy(Expression = "./div[@class='p-commit']/strong/a")]

        public long CommentsCount { getset; }

 

        [StoredAs("shopname", DataType.String, 100)]

        [PropertyExtractBy(Expression = "./div[@class='p-shop hide']/span[1]/a[1]")]

        public string ShopName { getset; }

 

        [StoredAs("name", DataType.String, 50)]

        [PropertyExtractBy(Expression = "./div[@class='p-name']/a/em")]

        public string Name { getset; }

 

        [StoredAs("shopid", DataType.String, 25)]

        public string ShopId { getset; }

 

        [StoredAs("venderid", DataType.String, 25)]

        [PropertyExtractBy(Expression = "./@venderid")]

        public string VenderId { getset; }

 

        [StoredAs("jdzy_shop_id", DataType.String, 25)]

        [PropertyExtractBy(Expression = "./@jdzy_shop_id")]

        public string JdzyShopId { getset; }

 

        [StoredAs("cdate", DataType.Time)]

        [PropertyExtractBy(Expression = "now", Type = ExtractType.Enviroment)]

        public DateTime CDate => DateTime.Now;

    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438853.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源干货!.NET Core + Vue.js通用动态权限(RBAC)管理系统框架[DncZeus]开源

DncZeus 前言 关于 DncZeus DncZeus Dnc Zeus "Dnc"--.Net Core 的缩写&#xff1b; "Zeus"--中文译为宙斯&#xff0c;是古希腊神话中的众神之王&#xff0c;奥林匹斯十二主神之首&#xff0c;统治宇宙万物的至高无上的主神&#xff08;在古希腊神…

浏览器使用java_java如何调用本地的浏览器

1.调用本地的浏览器 import java.io.IOException;import java.net.MalformedURLException;import java.net.URL;public class UseBrowser {public static void main(String[] args) {URL url null;try {url new URL("http://www.baidu.com");} catch (MalformedURL…

java input函数怎么用_Java函数习惯用法详解

在Java编程中&#xff0c;有些知识 并不能仅通过语言规范或者标准API文档就能学到的。在本文中&#xff0c;我会尽量收集一些最常用的习惯用法&#xff0c;特别是很难猜到的用法。我把本文的所有代码都放在公共场所里。你可以根据自己的喜好去复制和修改任意的代码片段&#xf…

十大开源的.NET用户界面框架 让GUI设计不再犯难

选择一款合适的GUI框架是.NET开发中比较重要但又很棘手的问题&#xff0c;因为用户界面相当于一款应用的"门面"&#xff0c;直接面向用户。好的UI更能吸引用户&#xff0c;有时甚至成为决定一款应用成败的关键。下面小编整理出十大应用最广泛.NET开源用户界面框架&am…

mysql一对一级联_MySQL 表的一对一、一对多、多对多问题

将实体与实体的关系&#xff0c;反应到最终数据库表的设计上&#xff0c;将关系分为三种&#xff1a;一对一&#xff0c;一对多(多对一)和多对多&#xff0c;所有的关系都是表与表之间的关系;一对一一对一&#xff1a;一张表的一条记录只能与另外一条记录进行对应&#xff0c;反…

.Net开源框架列表

API 框架 NancyFx&#xff1a;轻量、用于构建 HTTP 基础服务的非正式&#xff08;low-ceremony&#xff09;框架&#xff0c;基于.Net 及 Mono 平台。官网ASP.NET WebAPI&#xff1a;快捷创建 HTTP 服务的框架&#xff0c;可以广泛用于多种不同的客户端&#xff0c;包括浏览器…

java的基础类型和字节大小_java的基础类型和字节大小

学习c语言的时候&#xff0c;这些个东西起码还是很明确的&#xff0c;因为上课的时候&#xff0c;老师经常问&#xff0c;现在时间久了&#xff0c;见的语言多了&#xff0c;也就有点乱了&#xff0c;也没怎么在意过。(武藏) 既然你诚心诚意的发问了&#xff0c;(小次郎) 我…

python flv转mp4_ffmpeg将多个flv文件合成为mp4(python版)

需求直播生成的flv片段需要做个归档&#xff0c;把指定的文件夹中的flv合并成一个mp4&#xff0c;简单的转码合并操作直接用命令行调用来实现。注意事项flv文件直接合并生成mp4的话只有第一个flv的内容才能播放&#xff0c;需要先转换成ts再合成mp4使用的第三方库ffmpy&#xf…

多租户技术

本词条由“科普中国”科学百科词条编写与应用工作项目 审核 。 多租户技术&#xff08;英语&#xff1a;multi-tenancy technology&#xff09;或称多重租赁技术&#xff0c;是一种软件架构技术&#xff0c;它是在探讨与实现如何于多用户的环境下共用相同的系统或程序组件&…

使用开源工具ELK可视化 Azure NSG日志

国内的Azure最近上线了网络观察程序服务&#xff0c;可以帮助用户监控和分析VNET虚拟网络。其中一个很重要的功能就是可以记录NSG的安全访问日志了。但是如果用户设置了NSG流日志&#xff0c;并下载日志想要分析一下的话&#xff0c;会发现日志其实并不是很友好&#xff0c;NSG…

pythoncad二次开发视频_AutoCAD ObjectARX 二次开发(2020版)--4,使用ARX向导创建CAD二次开发项目(编程框架)--...

手动创建ObjectARX应用程序非常麻烦&#xff0c;在此步骤中&#xff0c;将介绍ObjectARX向导。在这里&#xff0c;我们将使用ObjectARX向导创建我们的ObjectARX应用程序。本节的程序的需求是&#xff0c;接收CAD用户的输入。首先&#xff0c;打开VS2017&#xff0c;新建项目在左…

Azure Data Explorer(Kusto)学习笔记

Azure Data Explorer 指南 Azure在2018年推出了Data Explorer产品&#xff0c;提供实时海量流数据的分析服务&#xff08;非流计算&#xff09;&#xff0c;面向应用、网站、移动端等设备。 用户可以查询&#xff0c;并交互式地对结果进行分析&#xff0c;以达到提升产品、增…

python将一列数据转换成向量_python读取csv和txt数据转换成向量的实例

最近写程序需要从文件中读取数据&#xff0c;并把读取的数据转换成向量。查阅资料之后找到了读取csv文件和txt文件两种方式&#xff0c;下面结合自己的实验过程&#xff0c;做简要记录&#xff0c;供大家参考&#xff1a;1、读取csv文件的数据import csvfiltpath "data_t…

Iaas,Paas,Saas三者的区别联系是什么?

本词条由“科普中国”科学百科词条编写与应用工作项目 审核 。 多租户技术&#xff08;英语&#xff1a;multi-tenancy technology&#xff09;或称多重租赁技术&#xff0c;是一种软件架构技术&#xff0c;它是在探讨与实现如何于多用户的环境下共用相同的系统或程序组件&…

.NET开源的背后:是无奈,还是顺应潮流?

摘要&#xff1a;微软.NET的开源&#xff0c;让许多开发人员欣喜若狂&#xff0c;同时也有许多人好奇其背后的故事&#xff0c;过去视开源为癌症的微软为什么会突然有这一举措&#xff0c;是出于无奈&#xff0c;还是顺应潮流&#xff0c;而这其中的种种或许可以用文中的六个观…

r.java没有生成_R.java文件没有生成

01R.java是ADT工具产生的新创建Android工程R.java文件并没有产生&#xff0c;必须先运行Bulid或RUN(运行)程序&#xff0c;才会产生。02 R.java文件丢失&#xff0c;必要急&#xff0c;修复很简单方法&#xff1a;右击你的工程(项目)——>Android Tools——>Fix P…

什么是ASP.NET Boilerplate Project(ABP)框架

使用.NET技术进行开发已经多年&#xff0c;偶尔一次网络上搜索.NET开发框架&#xff0c;看到了ABP这个框架&#xff0c;引起了我极大的兴趣&#xff0c;于是决定对该框架进行深入学习和研究&#xff0c;并将过程全部记录如下&#xff0c;对自己也是一次学习和总结&#xff0c;同…

使用ABP打造SAAS系统(2)——前端框架选择

一、流行框架比较 作者用过的前端框架不少&#xff0c;曾经还在一个项目中同时使用两套框架控件&#xff08;年少无知、效率特慢&#xff09;&#xff0c;所以可供选择的前端框架有不少&#xff1a; easyui&#xff1a; 优点&#xff1a;非常成熟的框架&#xff0c;基于iframe…

java中针对数字怎么判断_java如何对输入的数字进行判断

java如何对输入的数字进行判断发布时间&#xff1a;2020-06-19 13:19:58来源&#xff1a;亿速云阅读&#xff1a;99作者&#xff1a;鸽子java的Scanner类提供了nextInt、nexFloat、nextDouble等方法&#xff0c;可以像类似C语言的scanf那样读取指定类型的数字。首先定义一个Sca…

java tostring 库_java重寫toString()方法

toString()方法是Object類的方法&#xff0c;調用toString()會返回對象的描述信息。1)為什么重寫toString()方法呢&#xff1f;如果不重寫&#xff0c;直接調用Object類的toString()方法&#xff0c;打印的是該對象的內存地址(類名哈希碼值)。如下代碼所示&#xff1a;classPer…