item insert 구조 수정, sort 추가

This commit is contained in:
2016-09-19 07:53:21 +09:00
parent 865e5f7ec9
commit 3b8b8dc4e7
2 changed files with 120 additions and 132 deletions

1
Form1.Designer.cs generated
View File

@@ -67,6 +67,7 @@
this.lvList.TabIndex = 0; this.lvList.TabIndex = 0;
this.lvList.UseCompatibleStateImageBehavior = false; this.lvList.UseCompatibleStateImageBehavior = false;
this.lvList.View = System.Windows.Forms.View.Details; this.lvList.View = System.Windows.Forms.View.Details;
this.lvList.ColumnClick += new System.Windows.Forms.ColumnClickEventHandler(this.lvList_ColumnClick);
this.lvList.SelectedIndexChanged += new System.EventHandler(this.lvList_SelectedIndexChanged); this.lvList.SelectedIndexChanged += new System.EventHandler(this.lvList_SelectedIndexChanged);
// //
// chTime // chTime

247
Form1.cs
View File

@@ -1,4 +1,5 @@
using System; using System;
using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.Data; using System.Data;
@@ -16,36 +17,88 @@ namespace NewsCrawler
{ {
public partial class Form1 : Form public partial class Form1 : Form
{ {
class NEWS_ITEM delegate void InsertListView(bool bInitial, string strTitle, DateTime time, string strURL, string strRef);
{
public string m_strTitle;
public DateTime m_Time;
public string m_strURL;
public string m_strReference;
}
System.Timers.Timer m_CrawlTimer = new System.Timers.Timer(); System.Timers.Timer m_CrawlTimer = new System.Timers.Timer();
int m_iCrawlInterval = 500; int m_iCrawlInterval = 500;
Timer m_UITimer = new Timer();
List<NEWS_ITEM> m_ItemList = new List<NEWS_ITEM>();
int m_iLastItemCnt = 0;
public Form1() public Form1()
{ {
InitializeComponent(); InitializeComponent();
wbView.ScriptErrorsSuppressed = false; wbView.ScriptErrorsSuppressed = false;
m_CrawlTimer.Elapsed+=CrawlTimer_Tick; ReadKIND(true);
m_CrawlTimer.Interval=1000; ReadDart(true);
m_CrawlTimer.Start(); ReadAsiaE(true);
ReadEtoday(true);
m_UITimer.Tick += UITimer_Tick; lvList.ListViewItemSorter = new ListViewItemComparer(0, SortOrder.Ascending);
m_UITimer.Interval = m_iCrawlInterval; lvList.Sorting = SortOrder.Ascending;
m_UITimer.Start(); lvList.Sort();
if(lvList.Items.Count > 0)
{
lvList.Items[lvList.Items.Count - 1].Selected = true;
lvList.Select();
if(lvList.SelectedItems.Count > 0)
lvList.SelectedItems[0].EnsureVisible();
} }
bool ReadAsiaE()
m_CrawlTimer.Elapsed+=CrawlTimer_Tick;
m_CrawlTimer.Interval=m_iCrawlInterval;
m_CrawlTimer.Start();
}
private void InsertItem(bool bInitial, string strTitle, DateTime time, string strURL, string strRef)
{
if(strTitle == "")
Console.WriteLine("break");
try
{
if(this.InvokeRequired)
{
this.Invoke(new InsertListView(InsertItem), bInitial, strTitle, time, strURL, strRef);
}
else
{
//lock(lvList)
{
foreach(ListViewItem item in lvList.Items)
{
if(item.SubItems[chLink.Index].Text == strURL)
return;
}
lvList.Items.Add(new ListViewItem(new string[] { time.ToString("HH:mm:ss"), strTitle, "", "", strRef, strURL }));
if(chAutoSelect.Checked == true)
{
lvList.Items[lvList.Items.Count - 1].Selected = true;
lvList.Select();
if(lvList.SelectedItems.Count > 0)
lvList.SelectedItems[0].EnsureVisible();
}
if(bInitial == false)
{
lvList.Sort();
}
foreach(ColumnHeader col in lvList.Columns)
col.Width = -2;
}
}
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
bool ReadAsiaE(bool bInitial = false)
{ {
bool bHasNew = false; bool bHasNew = false;
@@ -63,6 +116,7 @@ namespace NewsCrawler
using(StreamReader reader = new StreamReader(dataStream, Encoding.GetEncoding("EUC-KR"))) using(StreamReader reader = new StreamReader(dataStream, Encoding.GetEncoding("EUC-KR")))
{ {
string responseFromServer = WebUtility.HtmlDecode(reader.ReadToEnd()); string responseFromServer = WebUtility.HtmlDecode(reader.ReadToEnd());
responseFromServer = responseFromServer.Replace("\"\"", "\"");
HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(responseFromServer); doc.LoadHtml(responseFromServer);
@@ -81,26 +135,7 @@ namespace NewsCrawler
continue; continue;
} }
InsertItem(bInitial, strTitle, DateTime.ParseExact(strTime, "HH:mm", CultureInfo.CurrentCulture), strURL, "아시아경제");
if(m_ItemList.Any(c => c.m_strURL==strURL)==false)
{
NEWS_ITEM news = new NEWS_ITEM();
news.m_strTitle=strTitle;
news.m_Time=DateTime.ParseExact(strTime, "HH:mm", CultureInfo.CurrentCulture);
news.m_strURL=strURL;
news.m_strReference="아시아경제";
lock(m_ItemList)
{
m_ItemList.Add(news);
}
bHasNew=true;
}
else
{
break;
}
} }
} }
@@ -115,7 +150,7 @@ namespace NewsCrawler
return bHasNew; return bHasNew;
} }
bool ReadEtoday() bool ReadEtoday(bool bInitial = false)
{ {
bool bHasNew = false; bool bHasNew = false;
@@ -151,25 +186,7 @@ namespace NewsCrawler
continue; continue;
} }
if(m_ItemList.Any(c => c.m_strURL==strURL)==false) InsertItem(bInitial, strTitle, DateTime.ParseExact(strTime, "HH:mm", CultureInfo.CurrentCulture), strURL, "이투데이");
{
NEWS_ITEM news = new NEWS_ITEM();
news.m_strTitle=strTitle;
news.m_Time=DateTime.ParseExact(strTime, "HH:mm", CultureInfo.CurrentCulture);
news.m_strURL=strURL;
news.m_strReference="이투데이";
lock(m_ItemList)
{
m_ItemList.Add(news);
}
bHasNew=true;
}
else
{
break;
}
} }
} }
} }
@@ -183,7 +200,7 @@ namespace NewsCrawler
return bHasNew; return bHasNew;
} }
bool ReadDart() bool ReadDart(bool bInitial=false)
{ {
bool bHasNew = false; bool bHasNew = false;
@@ -210,6 +227,8 @@ namespace NewsCrawler
foreach(var item in lists) foreach(var item in lists)
{ {
var rows = item.SelectNodes(".//td"); var rows = item.SelectNodes(".//td");
if(rows.Count < 3)
continue;
string strTitle = rows[2].InnerText; string strTitle = rows[2].InnerText;
strTitle=strTitle.Trim(); strTitle=strTitle.Trim();
@@ -225,25 +244,7 @@ namespace NewsCrawler
continue; continue;
} }
if(m_ItemList.Any(c => c.m_strURL==strURL)==false) InsertItem(bInitial, strTitle, DateTime.ParseExact(strTime, "HH:mm", CultureInfo.CurrentCulture), strURL, "DART");
{
NEWS_ITEM news = new NEWS_ITEM();
news.m_strTitle=strTitle;
news.m_Time=DateTime.ParseExact(strTime, "HH:mm", CultureInfo.CurrentCulture);
news.m_strURL=strURL;
news.m_strReference="DART";
lock(m_ItemList)
{
m_ItemList.Add(news);
}
bHasNew=true;
}
else
{
break;
}
} }
} }
} }
@@ -257,7 +258,7 @@ namespace NewsCrawler
return bHasNew; return bHasNew;
} }
bool ReadKIND() bool ReadKIND(bool bInitial=false)
{ {
bool bHasNew = false; bool bHasNew = false;
@@ -282,6 +283,9 @@ namespace NewsCrawler
string strXPath = "//item"; string strXPath = "//item";
var lists = doc.DocumentNode.SelectNodes(strXPath); var lists = doc.DocumentNode.SelectNodes(strXPath);
if(lists == null)
return false;
foreach(var item in lists) foreach(var item in lists)
{ {
string strTitle = item.SelectSingleNode(".//title").InnerText; string strTitle = item.SelectSingleNode(".//title").InnerText;
@@ -298,25 +302,7 @@ namespace NewsCrawler
continue; continue;
} }
if(m_ItemList.Any(c => c.m_strURL==strURL)==false) InsertItem(bInitial, strTitle, DateTime.ParseExact(strTime, "HH:mm", CultureInfo.CurrentCulture), strURL, "KIND");
{
NEWS_ITEM news = new NEWS_ITEM();
news.m_strTitle=strTitle;
news.m_Time=DateTime.ParseExact(strTime, "HH:mm:ss", CultureInfo.CurrentCulture);
news.m_strURL=strURL;
news.m_strReference="KIND";
lock(m_ItemList)
{
m_ItemList.Add(news);
}
bHasNew=true;
}
else
{
break;
}
} }
} }
} }
@@ -346,38 +332,6 @@ namespace NewsCrawler
m_CrawlTimer.Enabled = true; m_CrawlTimer.Enabled = true;
} }
private void UITimer_Tick(object sender, EventArgs e)
{
if (m_iLastItemCnt == m_ItemList.Count)
return;
lock(m_ItemList)
{
m_ItemList.Sort((NEWS_ITEM news1, NEWS_ITEM news2) => news1.m_Time.CompareTo(news2.m_Time));
}
foreach (var item in m_ItemList)
{
string strResult = string.Format("[{0}] {1} ({2})", item.m_Time, item.m_strTitle, item.m_strURL);
lvList.Items.Add(new ListViewItem(new string[] { item.m_Time.ToString("HH:mm:ss"), item.m_strTitle, "", "", item.m_strReference, item.m_strURL }));
//Console.WriteLine(strResult);
//System.IO.File.AppendAllText("output.txt", strResult+"\n", Encoding.GetEncoding("EUC-KR"));
}
if (chAutoSelect.Checked == true)
{
lvList.Items[lvList.Items.Count - 1].Selected = true;
lvList.Select();
lvList.SelectedItems[0].EnsureVisible();
}
foreach (ColumnHeader col in lvList.Columns)
col.Width = -2;
m_iLastItemCnt = m_ItemList.Count;
}
private void lvList_SelectedIndexChanged(object sender, EventArgs e) private void lvList_SelectedIndexChanged(object sender, EventArgs e)
{ {
if (lvList.SelectedItems.Count <= 0) if (lvList.SelectedItems.Count <= 0)
@@ -399,5 +353,38 @@ namespace NewsCrawler
tbInterval.Text = (m_iCrawlInterval / (float)1000).ToString("##0.0") + "초"; tbInterval.Text = (m_iCrawlInterval / (float)1000).ToString("##0.0") + "초";
} }
} }
private void lvList_ColumnClick(object sender, ColumnClickEventArgs e)
{
SortOrder Order = (lvList.Sorting == SortOrder.Descending || lvList.Sorting == SortOrder.None) ? SortOrder.Ascending : SortOrder.Descending;
lvList.ListViewItemSorter = new ListViewItemComparer(e.Column, Order);
lvList.Sorting = Order;
lvList.Sort();
} }
} }
class ListViewItemComparer : IComparer
{
int m_iColumn = 0;
SortOrder m_Order = SortOrder.Ascending;
public ListViewItemComparer(int column, SortOrder Order)
{
m_iColumn = column;
m_Order = Order;
}
public int Compare(object x, object y)
{
ListViewItem item1 = (ListViewItem)x;
ListViewItem item2 = (ListViewItem)y;
if(m_Order == SortOrder.Ascending)
return string.Compare(item1.SubItems[m_iColumn].Text, item2.SubItems[m_iColumn].Text);
else
return string.Compare(item2.SubItems[m_iColumn].Text, item1.SubItems[m_iColumn].Text);
}
}
}