zoukankan      html  css  js  c++  java
  • 简陋的信息采集方式

    以前因工作需求,制作过新闻采集器,因为没有系统学习过这方面,故而只是使用自己掌握的基础和现学了一点正则表达式来制作了一个匹配个别网站新闻栏目的特殊字符后采集文章内容的小程序。写出来主要是将采集的方法留备以后查看,也可以给初入门的一个参考(但愿不会误导吧)。

    例:www.whhouse.com里的大部分新闻和房产信息均是采集的其他网站(实际工作人员不超过5人,普通维护人员1名,租的服务器,成本非常低)。

    先说说这样做的缺点,再次声明,只是提供参考,这是我刚从培训班出来时独立完成的,可以想象代码和逻辑的水平~,~!!

    1.只能针对提供的页面连接。

    2.需要采集的信息,必须格式统一。

    3.采集后的格式效果不理想。


    代码直接贴出来的话,乱七八糟的你也没时间看和分析,只挑部分重要代码拿出来。

    首先列出2个最常用的,其他未列出的还有转换字符之类的。        

    /// <summary>        
    /// 正则表达式取值        
    /// </summary>        
    /// <param name="HtmlCode">源码</param>        
    /// <param name="RegexString">正则表达式</param>        
    /// <param name="GroupKey">正则表达式分组关键字</param>        
    /// <param name="RightToLeft">是否从右往左</param>        
    /// <returns>返回匹配的到数据</returns>       
    ///这个函数是使用最多的,通过此函数匹配来查找页面中需要的内容        
    
    public string[] GetRegValue(string HtmlCode, string RegexString, string GroupKey, bool RightToLeft)        
    {            
    MatchCollection m;            
    Regex r;           
     if (RightToLeft == true)            
    {                
    r = new Regex(RegexString, RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.RightToLeft);            
    }            
    else            
    {                
    r = new Regex(RegexString, RegexOptions.IgnoreCase | RegexOptions.Singleline);            
    }            
    m = r.Matches(HtmlCode);            
    string[] MatchValue = new string[m.Count];            
    for (int i = 0; i < m.Count; i++)            
    {                
    MatchValue[i] = m[i].Groups[GroupKey].Value;            
    }            
    return MatchValue;        
    }
    ///这里是读取页面中的所有源代码
    public string getHtml(string url, Encoding coding)        
    {            
    try            
    {                
    HttpWebRequest myRequest;                
    HttpWebResponse myResp = null;                
    System.IO.StreamReader myReader = null;                
    myRequest = (HttpWebRequest)WebRequest.Create(url);                myRequest.ReadWriteTimeout = 60 * 1000;                
    myRequest.Timeout = 30 * 1000;                
    myRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";                
    myRequest.KeepAlive = true;                
    myResp = (HttpWebResponse)myRequest.GetResponse();                
    myReader = new System.IO.StreamReader(myResp.GetResponseStream(), coding, true);                
    string html = myReader.ReadToEnd();                
    myReader.Close();                
    myResp.Close();                
    return html;            
    }            
    catch (Exception e)            
    {                
    return "";            
    }        
    }
    


    然后正式开始采集,一般网站的新闻栏目是多个类别,进入某个类别后,会有个列表显示该类的新闻,然后不断翻页,连接都是固定在网站同一目录下,页面由数字递增的文件名。这样就可以传入类别页面的链接后,循环匹配类别中的所有新闻,之后通过新闻链接,读取每条新闻的源文件并采集出自己想要的内容。可以设定条件判断控制采集的数量,顺序等。

    建议将文章的内容分为多个元素进行匹配后储存到数据库中的单独字段,方便以自己网站的格式输出。下面是在获取页面源代码的情况下,匹配源代码的文章文本部分内容,这里就近取材以博客园新闻为例吧,呵呵(如有违例,请屏蔽下面代码后给我发个消息,我重写,谢谢村长)

    public void getContent(string html, news n)        
    {            
    //前面得到http://news.cnblogs.com/n/83321/ 的html源代码.            
    //<!--end: news_info -->在博客园新闻内容的起始位置之前            
    //<!--end: come_from -->在博客园新闻内容的结束位置之后            
    string RegexString = "<!--end: news_info -->(?<content>[^<].*?)<!--end: come_from -->";            
    string[] articlebody = tool.GetRegValue(html, RegexString, "content", false);//内容            
    if (articlebody.Length > 0)            
    {
    //获取成功,得到需要的新闻内容            
    }            
    else            
    {                
    return;            
    }        
    }
    

    午休时间短,上班不能浏览网站,所以赶时间。RegexString 字符串正确与否没有验证,代码也删除了大部分,实在不好意思。

  • 相关阅读:
    Elasticsearch Query DSL 整理总结(三)—— Match Phrase Query 和 Match Phrase Prefix Query
    Elasticsearch Query DSL 整理总结(二)—— 要搞懂 Match Query,看这篇就够了
    Elasticsearch Query DSL 整理总结(一)—— Query DSL 概要,MatchAllQuery,全文查询简述
    Elasticsearch Java Rest Client API 整理总结 (三)——Building Queries
    Elasticsearch date 类型详解
    python 历险记(五)— python 中的模块
    python 历险记(四)— python 中常用的 json 操作
    python 历险记(三)— python 的常用文件操作
    Elasticsearch Java Rest Client API 整理总结 (二) —— SearchAPI
    Elasticsearch Java Rest Client API 整理总结 (一)——Document API
  • 原文地址:https://www.cnblogs.com/21xz/p/1895372.html
Copyright © 2011-2022 走看看