using AnfleCrawler.Common;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks; namespace AnfleCrawler.DataAnalyzer
{
internal class Soufun_News : AnalyzerBase
{
private enum Kind
{
[Description("市场")]
Market = ,
[Description("政策")]
Policy = ,
[Description("公司")]
Company = ,
} private static readonly string[] FilterTags = new string[] { "script", "iframe" }; public override void Init(PageCrawler crawler)
{
string exp = string.Format("http://news.sh.soufun.com/more/[{0}]/[1-50].html", string.Join(",", Enum.GetValues(typeof(Kind)).Cast<int>()));
crawler.PushUrl(new StringPatternGenerator(exp), );
base.Init(crawler);
} protected override void AnalyzeInternal(PageLandEntity current)
{
var lander = Crawler.Lander;
dynamic repository = Repository;
var pHandler = CreateContentHandler(current);
switch (current.Depth)
{
case :
{
var dom = lander.GetDocument(pHandler);
foreach (var node in QueryNodes(dom.DocumentNode, ".contenttext"))
{
var linkNode = QueryNode(node, "a.link_01");
string url = GetHref(linkNode, current.Url).OriginalString;
int i = url.LastIndexOf(".");
Crawler.PushUrl(new Uri(url.Insert(i, "_all")), );
}
}
break;
case :
{
var dom = lander.GetDocument(pHandler);
var hackNode = QueryNode(dom.DocumentNode, "#newxq_B01_26");
string kind = QueryNodes(hackNode, "a").Last().InnerText;
string title = QueryNode(dom.DocumentNode, "h1").InnerText;
var contentNode = QueryNode(dom.DocumentNode, "#news_body");
foreach (string tag in FilterTags)
{
foreach (var node in QueryNodes(contentNode, tag, false).ToArray())
{
node.Remove();
}
}
var set = QueryNodes(dom.DocumentNode, "#newxq_B01_27 span").Take().ToArray();
string source = null;
DateTime publishDate;
DateTime.TryParse(set[].InnerText, out publishDate);
if (set.Length == )
{
source = set[].InnerText;
}
repository.SaveNews(current.Url, kind, source, title, contentNode.InnerHtml, publishDate);
Crawler.OutWrite("保存新闻 {0}", title);
}
break;
}
}
}
}
        public void SaveNews(Uri pageUrl, string kind, string source, string title, string content, DateTime publishDate)
{
Guid rowID = CryptoManaged.MD5Hash(pageUrl.OriginalString);
using (var db = Create())
{
var q = from t in db.News
where t.RowID == rowID
select t;
var news = q.SingleOrDefault();
if (news == null)
{
db.News.Add(news = new News()
{
RowID = rowID,
SiteID = pageUrl.Authority,
});
}
news.Kind = kind;
news.Source = source;
news.Title = title;
news.Content = content;
news.PublishDate = publishDate;
db._SaveChanges();
}
}

Soufun_News的更多相关文章

随机推荐

  1. 自定义AlertView实现模态对话框

    在Windows应用程序中,经常使用模态(Model)对话框来和用户进行简单的交互,比如登录框.在IOS应用程序中,有时我们也希望做同样的事情.但IOS的UI库中,没有模态对话框,最接近那个样子的应该 ...

  2. redmine设置

    接上篇. 1.redmine新版本已经比较强大了,可以定制所有字段(含标准字段和自定义字段)的读写属性.这里为了避免字段过多影响用户感受,希望增加功能将不相关的字段屏蔽,下载插件Workflow Hi ...

  3. 机器人操作系统(ROS)教程4:ROS的框架【转】

    转自:http://www.arduino.cn/thread-11351-1-1.html 在进行ROS的代码开发前,有必要了解一些ROS的概念.首先,ROS的系统代码分为两部分:main和univ ...

  4. Dynamics AX 2012 R2 耗尽用户

    有时,你想执行一些操作,但是这些操作必须让所有用户都登出后才能执行,例如加强安全设置,创建虚拟公司等.这时,你可以使用系统的耗尽用户(Darin Users)功能.下面跟随Reinhard一起,设置耗 ...

  5. 本地yum库制作及本地安装Docker

    生产环境中,我们总是会遇到服务器无法连接外网的情况,这样,如果想安装某个应用,而这个应用依赖的其他类库又特别多,就很痛苦了.这个时候,就需要自己制作个本地的yum库,进行本地安装.本文将以Docker ...

  6. Iptables防火墙

    1 位置 使用vim /usr/sysconfig/iptables 2 启动.关闭.保存 service iptables stop service iptables start service i ...

  7. (1) 第一章 Java体系结构介绍

    1.网络带来的挑战和机遇 (1).挑战一: 网络包含的设备越来越广泛, 硬件体系不同, 操作系统不同,用途不同. java解决办法: 通过创建与平台无关的程序来解决这个问题.一个java程序可以不需要 ...

  8. bat 命令分行写

    myprog parameter parameter parameter parameter parameter parameter parameter parameter parameter par ...

  9. SQL LOADER 的用法 TXT文件导入非常之快

    前提,需要本地安装ORACLE 客户端 控制文件 cms.ctl load dataCHARACTERSET UTF8infile 'oracle.txt'APPEND INTO TABLE JR f ...

  10. C语言细节——献给入门者(三)

    C语言细节——献给入门者(三) >>主题:关于强制类型转换 先来瞎扯下强制类型转换,c语言有很多数据类型,long,short,int,float,double,bool,char等等.当 ...