dotNetSpider 手记

news/2024/7/19 11:50:34 标签: 爬虫

准备工作:

  从github上download工程。

  安装VS2017。

  安装 .net core 2.0。

  编译通过。

 

基础架构:

  调度器 Scheduler 从根site开始,向 Downloader 分配请求任务。

  Downloader 根据分配到的请求任务,向目标site 下载 page,并交由 PageProcessor 进行页面处理。

  PageProcessor 将处理的结果推入 Pipeline,将解析出的新的链接,推入 Scheduler。

  循环直至 Scheduler 没有新的请求可以处理。

 

Spider.Create:

  设定根访问节点、唯一身份标识、请求调度器 Scheduler,页面处理器 PageProcessor。

  以给出的 Sample 样例中,遍历 cnblog 站点为例进行解析:

    Scheduler 是 QueueDuplicateRemovedScheduler。就是一个存放 Request 的队列。

    PageProcessor 是默认的 DefaultPageProcessor。

    这里涉及到 XPath 的知识,需要快速了解。

 

  XPath:XPath 使用路径表达式在 XML 文档中进行导航,选取 XML 文档中的节点或者节点集。

  主要知识点见:http://www.runoob.com/xpath/xpath-syntax.html

 

页面处理流程 BasePageProcessor.Process:

        public void Process(Page page)
        {
            bool isTarget = true;

            if (_targetUrlPatterns.Count > 0 && !_targetUrlPatterns.Contains(null))
            {
                foreach (var regex in _targetUrlPatterns)
                {
                    isTarget = regex.IsMatch(page.Url);
                    if (isTarget)
                    {
                        break;
                    }
                }
            }

            if (!isTarget)
            {
                return;
            }

            Handle(page);

            page.ResultItems.IsSkip = page.ResultItems.Results.Count == 0;

            if (!page.SkipExtractTargetUrls)
            {
                ExtractUrls(page);
            }
        }

 

  在 Sample 中,调用的是 DefaultPageProcessor 提供的 hanlde:

            page.AddResultItem("title", page.Selectable.XPath("//title").GetValue());
            page.AddResultItem("html", page.Content);

  默认的页面处理,是找出 “title” 元素,以及整个 html 内容。

  接着在下载好的页面内容中,查找更多的 url。

 

  由此可见,实现自定义爬虫的关键,则是定义对页面的处理得到结果,以及对结果的处理。

  

  

      

 

转载于:https://www.cnblogs.com/Daniel-Liang/p/7458528.html


http://www.niftyadmin.cn/n/1110433.html

相关文章

UItextView 设置为不可以复制粘贴

1. 实现UITextView delegate 2. 设置 textView.editable YES; 3. 实现代理协议方法 #pragma textView deletate -(BOOL)textViewShouldBeginEditing:(UITextView *)textView { return NO; }转载于:https://www.cnblogs.com/tom2015010203/p/5198139.html

linux下双网卡双网关配置

要求: eth0:192.168.100.203 连接内网,网关为192.168.100.1。需要和192.168.10.0、192.168.12.0、192.168.100.0、10.2.2.0、10.2.1.0网段通信。 eth1:172.16.0.203 连接外网,网关为172.16.0.254。需要访问外网。 配置思路&#x…

求助,星际译霸装不了(转)

求助,星际译霸装不了(转)[more]红旗 4。1系统安装星际译霸时出现下面的提示是咱回事啊请高手教我,谢谢~mainwin.h: In static member function static gbooleanAppCore::vKeyPressReleaseCallback(GtkWidget*, GdkEventKey*, AppCore*):mainwin.h:70: st…

Go linux 实践3

Go 的灵魂-goroutine(协程), channel(渠道) 看看吧&#xff0c;不多说了 ************************************************ package main import ( "fmt" "sync" "time") func say(s string) { for i : 0; i < 5; i { time.Sleep(100 * tim…

eval解析JSON字符串的一个小问题

之前写过一篇 关于 JSON 的介绍文章&#xff0c;里面谈到了 JSON 的解析。我们都知道&#xff0c;高级浏览器可以用 JSON.parse() API 将一个 JSON 字符串解析成 JSON 数据&#xff0c;稍微欠妥点的做法&#xff0c;我们可以用eval() 函数。 var str {"name": "…

BigDecimal类的用法

&#xff08;一&#xff09;BigDecimal类的常用的几个构造方法 BigDecimal(int)&#xff1a;将int表示形式转换为BigDecimal对象   BigDecimal(String)&#xff1a;将字符串表示形式转换为BigDecimal对象   BigDecimal(double)&#xff1a;将double表示形式转换为BigDecima…

XP的DEP防毒技术揭秘(转)

XP的DEP防毒技术揭秘(转)[more]众所周知&#xff0c;Windows XP SP2中增加了一项安全新功能??DEP(Date Execution Prevention数据执行保护)&#xff0c;可以保护计算机免受病毒的破坏。为了配合微软的DEP技术&#xff0c;Intel和AMD都开发了相应的防病毒CPU。 DEP的防病毒原理…

JS开发中的一些小技巧和方法

生成指定范围内的随机数 当我们需要获取指定范围(min,max)内的整数的时候&#xff0c;下面的代码非常适合&#xff1b;这段代码用的还挺多的。 function setRadomNum(min,max){return Math.floor(Math.random() * (max - min 1)) min; } json转url参数 当我们进行http请求时…