zoukankan      html  css  js  c++  java
  • 简单易用粗暴的文章内容采集程序 -【开源项目】

    简单易用粗暴的文章内容采集程序 -【开源项目】

    前言 

    爱学习、爱使用移动设备阅读电子书的朋友,不能不拥有一款属于自己的采集利器。

    而使用此程序即可以简单轻松的实现采集任务。

    采集效果图

    程序介绍

     在程序运行子目录 Config 是程序的配置的保存目录。

    path.txt

    [config]

    ConfigHtmlFormatConfig.xml

    [task]

    Config ask

    config 设置采集内容格式化的配置保存路径

    task 设置任务工作规则保存和加载路径

    采集工作窗体

    起始网址

    采集开始的网址,如果是逐页的模式,则是第一页的地址;

    如果是列表的模式,则是第一个列表页面的地址。

    列表网址

    匹配下一个列表页面地址的正则表达式。

    在逐页模式下,不用填写。

    页面标题

    匹配页面标题的正则表达式 

    页面内容

    匹配页面内容的正则表达式

    页面链接

    匹配内容页面链接的正则表达式

    在逐页模式,采集到一个内容页面之后,可以匹配到下一个页面链接。

    在列表模式,采集到一个列表页面之后,就可以匹配到若干个页面链接。

    分页标识

    识别是否为分页标题的匹配正则表达式

    首页标识

    第一页的标识,比如标题【科技业的员工到底有多年轻 1)】,那么标识可以是(1)

    保存路径

    采集内容的保存目录

    分页处理

    是指采集的文章资料是进行了分页的,那么程序会根据设定的规则,判断是否是分页章节,如果是,则不重复添加标题。

    比如

    科技业的员工到底有多年轻 1

    科技业的员工到底有多年轻 2

    科技业的员工到底有多年轻 3

    那么采集过程中,只会写入一个标题【科技业的员工到底有多年轻】

    保存为一个文件

    如果勾选,则采集到的所有内容都写入到一个文件中

    开始

    开始采集并将内容保存

    测试

    在消息框显示采集的效果

    格式化设置窗体

    左边是匹配到的字符,后边是表示要替换成的字符。

    程序运行时,会将第二行(如果有两行)的字符拷贝一份转换为大写组合在一起,进行格式化。

    换行标签、空白标签、缩进标签

    可以输入包含正则在内的字符进行匹配

    章节标题

    {0}表示采集的序号(采集一个地址则加1),{1}表示采集到的标题。

    辅助功能

    可以将输入的字符进行大小写转换

    编写新规则

    编写采集规则需要有一定的正则表达式的知识,如果不了解阅读这个页面:http://www.jb51.net/tools/zhengze.html

    任务是以xml文件的形式保存,文件名命名格式是:任务名称 - 网站名称.xml

    在任何一个任务状态下,只需要修改任务名称,或者网站名称,再点击保存任务,即可新建一个任务。

    如果名称一样会提示是否覆盖。

    这里以博客园新闻为例

    博客园新闻是一个列表式的采集任务——在一个页面可以匹配得到若干个页面地址

    http://news.cnblogs.com/

    使用firebug或者其它前端调试工具,可以轻松得到采集特征

    比如下图


    点击红框【点击查看页面中的元素】然后在页面的【创业公司如何评估 – 度量公司潜力的方法】位置点下。

    就可以定位到html代码

    这样就可以获取到内容页面的链接特征


    <h2 class="news_entry">
    <target="_blank" href="/n/182026/">创业公司如何估值 — 度量公司潜力的方法</a>
    </h2>

    然后需要观察这个标识是不是唯一特征的,也就是这个特征匹配到的都是自己期望中的内容。否则就需要增加更多的限制特征。

    将特征编写为匹配的正则表达式

    源码说明

    解决方案有3个项目组成

    Forms是视窗程序

    Framework是采集程序

    Helper是辅助程序

    由于考虑到以后会增加不同的采集任务,因此采用MDI窗体。

    Config目录是默认配置

    FrmFormatConfig是内容格式化配置窗体

    FrmGatherWorker是采集工作窗体

    MDIParentMain是窗体容器

    Config是内容格式化配置实体类

    Task是采集任务规则实体类

    Worker是采集工作类

    Worker采集工作类说明

    先看看3个主要事件

    复制代码
    /// <summary>
    /// 错误触发事件,传入参数 引发的异常对象、错误的类型、当前工作的网址
    /// </summary>
    public event Action<Exception, ErrorType, string> OnError;

    /// <summary>
    /// 工作结束触发事件
    /// </summary>
    public event Action OnWorkEnd;

    /// <summary>
    /// 一次/地址采集完成触发事件,传入参数 采集内容的标题、内容、网址
    /// </summary>
    public event Action<stringstringstring> OnWorkItemEnd;
    复制代码

    创建对象

     
    Worker work = new Worker(_httpRequest, _config, _task);
    work.OnError += w_OnError;
    work.OnWorkItemEnd += work_OnWorkItemEnd;
    work.OnWorkEnd += work_OnWorkEnd;

     

    定义内容处理

    复制代码
    /// <summary>
    /// 一次(个网址)采集完成后,执行内容写入文件操作
    /// </summary>
    private void work_OnWorkItemEnd(string curWebTitle, string curWebContent, string curUrl)
    {
        //将采集到的内容写入到文件流中
        byte[] byteWebContent = Encoding.UTF8.GetBytes(curWebContent);
        if (_task.IsSaveOnlyFile)
        {
            //如果当前内容标题为空,则可能分页
            if (!string.IsNullOrEmpty(curWebTitle))
            {
                byte[] byteWebTitle = Encoding.UTF8.GetBytes(curWebTitle);
                _curSavaFile.Write(byteWebTitle, 0, byteWebTitle.Length);
            }
            _curSavaFile.Write(byteWebContent, 0, byteWebContent.Length);
        }
        else
        {
            using (FileStream curSavaFile2 = new FileStream("{0}{1}.txt".FormatWith(_task.SavePath, curWebTitle), FileMode.OpenOrCreate, FileAccess.ReadWrite))
            {
                curSavaFile2.Write(byteWebContent, 0, byteWebContent.Length);
            }
        }
        UpdateWorkMessage(" 已采集:{0},网址:{1}".FormatWith(curWebTitle, curUrl));
        Application.DoEvents();
    }
    复制代码

      

    其它更多,请下载源码查看

    其它

    运行程序下载:http://files.cnblogs.com/yelaiju/NWebGather.rar

    源码下载请到开源地址下载

    开源地址:https://github.com/alifellod/NWebGather

    不了解github下载源码的方式,请看文章:http://www.cnblogs.com/yelaiju/p/3180986.html

    各位朋友对采集有兴趣,可以一起维护和贡献代码,如此大家都可以轻松的共享同一个采集框架。

    QQ群:9524888

    欢迎大家入群交流共享采集任务规则,讨论技术,讨论人生……

    作者: 火地晋 
    出处: http://yelaiju.cnblogs.com/ 
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
     
    分类: C#WinForm
  • 相关阅读:
    HDU4474 Yet Another Multiple Problem BFS搜索
    HDU4473 Exam 数学分析
    2013ACM多校联合(4)
    POJ1273 网络流...
    HDU4472 Count 递推
    POJ1149 PIGS 网络流
    UVA10881 Piotr's Ants 想法题
    javascript js string.Format()收集
    修改 设置 vs.net 网站 调试 设为 起始页
    【转】HTML5杂谈 概念与现行游戏 割绳子 宝石迷阵
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3181809.html
Copyright © 2011-2022 走看看