item insert 구조 수정, sort 추가
This commit is contained in:
1
Form1.Designer.cs
generated
1
Form1.Designer.cs
generated
@@ -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
|
||||||
|
|||||||
251
Form1.cs
251
Form1.cs
@@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
m_CrawlTimer.Elapsed+=CrawlTimer_Tick;
|
||||||
|
m_CrawlTimer.Interval=m_iCrawlInterval;
|
||||||
|
m_CrawlTimer.Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ReadAsiaE()
|
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -337,8 +323,8 @@ namespace NewsCrawler
|
|||||||
if(chAutoReload.Checked == true)
|
if(chAutoReload.Checked == true)
|
||||||
{
|
{
|
||||||
ReadKIND();
|
ReadKIND();
|
||||||
ReadDart();
|
ReadDart();
|
||||||
ReadAsiaE();
|
ReadAsiaE();
|
||||||
ReadEtoday();
|
ReadEtoday();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user