• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#实现百度网站收录和排名查询功能思路及实例

C#实现百度网站收录和排名查询功能思路及实例

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c#设计思路,c#编程思路,c#俄罗斯方块思路,c#网站开发实例,c#web网站开发实例等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

一、前言

偶然一次在vs2012默认的项目文件夹里发现了以前自己做的一个关于SEO的类库,主要是用来查询某个网址的收录次数还有网站的排行数,后来重构了下,今天拿出来写篇文章,说说自己是如何思考的并完成的。

二、问题描述

首先需要考虑的是能够支持哪些搜索引擎的查询,首先是百度,然后是必应、搜狗、搜搜、360。本来想支持Google但是一想不对,根本不好访问的,所以暂时不算在内。而我们实际要做的就是根据一个网址能够检索出这个网址的在各个搜索引擎的收录次数以及在不同关键词下的网址排行,这里出入的只有网址还有若干的关键词,而输出则是该网址在不同搜索引擎下的收录次数以及在各个关键词下的排行数。

但是这里有个问题,就是排行数,如果检索的网址在前100还好,如果排名很后面,那么问题就来了,那样会让用户等待很长时间才能看到结果,但是用户可能只想知道排行前100的具体排名,而那些超过的则只要显示100以后就可以了,而这些就需要我们前期考虑好,这样后面的程序才好做。

三、解决思路

相信很多人都能够想到,就是利用WebClient将将需要的页面下载下来,然后用正则从中获取我们感兴趣的部分,然后利用程序去处理。而关键难度就是在这个正则的编写,首先我们先从简单的开始。

四、收录次数

首先是网站的收录次数,我们可以在百度中输入site:www.cnblogs.com/然后我们就可以看到如下的页面:

而我们所需要的收录次数就是 5,280,000 这段数字,我们接着查看页面元素:

接着我们再观察其他的搜索引擎可以发现都是类似的,所以我们的思路这个时候应该就得出了,最后就是如何组织网址,这部分我们看地址栏?wd=site%3Awww.cnblogs.com%2F这段就知道怎么写了。

稍等这个时候我们可能心急一个一个实现,这样后面我们就没法集中的调用,同时也会影响以后的新增,所以我们要规定一个要实现收录数功能的抽象类,这样就能够在不知晓具体实现的情况统一使用,并且还能够在以后轻松的新增新的搜索引擎,而这种方式属于策略模式(Stategry),下面我们来慢慢分析出这个抽象类的具体内容。

首先每个实现这个抽象类的具体类都应该是对应某个搜索引擎,那么就需要有一个基本网址,同时还要留下占位符,比如根据上面百度的这个我们就得出这样一个字符串

http://www.baidu.com/s?wd=site%3A{0}

其中{0}就是为真正需要检索网址的占位符,获取下载页面的路径是所有具体类都需要的所以我们直接将实现放在抽象类中,比如下面的代码:

/// <summary>
        /// 服务提供者
        /// </summary>
        protected String SearchProvider { get; set; }

        /// <summary>
        /// 需要检索的网址
        /// </summary>
        protected String SiteUrl { get; set; }

        /// <summary>
        /// 搜索服务提供网址
        /// </summary>
        protected String BaseUrl { get; set; }

        /// <summary>
        /// 后页面网址
        /// </summary>
        /// <param name="site">需要查询的网址</param>
        /// <returns>拼接后的网址</returns>
        protected String GetDownUrl(string site)
        {
            return string.Format(BaseUrl, HttpUtility.UrlEncode(site));
        }
</div>

其中SiteUrl和SearchProvider是用来保存检索网址和搜索引擎名称。

上面我们说了将会利用WebClient来下载页面,所以初始化WebClient的工作也在抽象类中完成,尽可能的减少重复代码,而为了防止阻塞当前线程所以我们采用了Async方法。

具体代码如下所示:
/// <summary>
        /// 查询在该搜索引擎中的收录次数
        /// </summary>
        /// <param name="siteurl">网站URL</param>
        public void SearchIncludeCount(string siteurl)
        {
            SiteUrl = siteurl;
            WebClient client = new WebClient();
            client.Encoding = Encoding.UTF8;
            client.DownloadStringCompleted += DownloadStringCompleted;
            client.DownloadStringAsync(new Uri(GetDownUrl(siteurl)));
        }

        /// <summary>
        /// 检索收录次数的具体实现
        /// 子类必须要实现该方法
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected abstract void DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e);
</div>

当WebClient完成下载后将会回调DownloadStringCompleted方法,而这个方法的是抽象方法也就意味着具体类必须要实现这个方法。

虽然我们内部的实现是异步的但是对于其他开发者调用这个方法还是同步的,所以我们就需要借助委托因此我们还要新建一个委托类型:
/// <summary>
        /// 当完成一个网站的收录查询后回调
        /// </summary>
        public Action<SiteIncludeCountResult> OnComplatedOneSite { get; set; }
</div>

其中SiteIncludeCountResult的结构如下所示:

/// <summary>
    /// 用于网站收录中委托的参数
    /// </summary>
    public class SiteIncludeCountResult
    {
        /// <summary>
        /// 收录次数
        /// </summary>
        public long IncludeCount { get; set; }

&nb

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#实现百度网站收录和排名查询功能思路及实例
  • C#生成防伪码的思路及源码分享
  • C#读写注册表的思路及代码

相关文章

  • 2017-05-28C#使用Dispose模式实现手动对资源的释放
  • 2017-05-28C#线程池操作方法
  • 2017-05-28详解StackExchange.Redis通用封装类分享
  • 2017-05-28C#中反射和扩展方法如何运用
  • 2017-05-28用序列化实现List<T> 实例的深复制(推荐)
  • 2017-05-28雅虎公司C#笔试题(后半部份才是)
  • 2017-05-28c#深拷贝文件夹示例
  • 2017-05-28C#实现让窗体永远在窗体最前面显示的实例
  • 2017-05-28C#读写文件的方法汇总
  • 2017-05-28C#利用子线程刷新主线程分享教程

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 枚举的用法详细总结
    • C#中的delegate委托类型基本学习教程
    • C#递归遍历窗体所有textbox控件并设置textbox事件的方法
    • DevExpress实现GridView当无数据行时提示消息
    • 深入委托与多播委托的详解
    • C#特性 迭代器(下) yield以及流的延迟计算
    • C#使用LINQ查询表达式的基本子句总结
    • C# List 排序各种用法与比较
    • c# 备忘录模式
    • C#判断当前程序是否通过管理员运行的方法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有