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. property attribute: assign, strong, weak, unsafe_unretain and copy

    assign:用于“纯量类型”(如CGFloat 或 NSInteger等): strong:用于“对象类型”,定义了一种“拥有关系”(owning relationship),为这种属性设置新值时, ...

  2. fgets函数

    打开文件 fopen("需要打开的路径") 然后使用fgets函数读取行 #include <stdio.h> #include <stdlib.h> #i ...

  3. [课程设计]Scrum 1. 8多鱼点餐系统开发进度(完善整个订餐页面工作)

    [课程设计]Scrum 1. 8多鱼点餐系统开发进度(完善整个订餐页面工作) 1.团队名称:重案组 2.团队目标:长期经营,积累客户充分准备,伺机而行 3.团队口号:矢志不渝,追求完美 4.团队选题: ...

  4. "Unity测试系列"文章索引

    对Unity各种API的细节进行测试 Common 一些Unity基础操作的性能测试 Animation/Animator Animation Play/Stop测试 关于Animation动画事件的 ...

  5. iframe显示错误页面

    当系统出现异常时,ifrme中显示的内容为错也页面,而不是罪顶层的框架显示错误内容,此时的解决办法是在错误页面或相关的登录页面中加入 错误页面加载的JS如下 <script type=" ...

  6. noi 9268 酒鬼

    题目链接:http://noi.openjudge.cn/ch0206/9268/ 题意:有N瓶酒,不能连续喝>=3瓶的酒,问能喝的最大的酒量. f[i][j] 前 I 瓶中连续喝了 j 瓶的最 ...

  7. 修改linux下某一个文件夹下所有文件内容

    find /data/app_resource -type f |xargs sed -i 's/192.168.220.126/192.168.221.160/g'

  8. fidder 使用教程

    fidder 使用教程 1. Fiddler 是什么? Fiddler是用C#编写的一个免费的HTTP/HTTPS网络调试器.英语中Fiddler是小提琴的意思,Fiddler Web Debugge ...

  9. [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:MVC程序中实体框架的连接恢复和命令拦截

    这是微软官方教程Getting Started with Entity Framework 6 Code First using MVC 5 系列的翻译,这里是第四篇:MVC程序中实体框架的连接恢复和 ...

  10. 【转】Image Cyborg 一键下载存储网页所有图片

    下午仿照网上例子写了个抓取网页中图片并保存到本地的Python的例子,好奇就google了下是否有类似的在线抓取图片的外挂工具. 接着就找到了Pseric写的这篇文章 - Image Cyborg 一 ...