Bạn có chắc chắn muốn xóa bài viết này không ?
Bạn có chắc chắn muốn xóa bình luận này không ?
Đọc báo và lọc keywords với C#
Mục tiêu
Mình muốn làm một chương trình:
- Đọc rss (definition and usage of rss
https://en.wikipedia.org/wiki/RSS)
- Lựa chọn những bài viết hay mà mình thích thông qua keyword nhất định (Example: Chỉ tìm những bài có chứa keyword "tình"
)
- Mở url trong browser.
Tiến hành
Tổng hợp RSS
Đầu tiên thông qua google, mình lượm nhặt được vài bé rss của mấy trang báo mạng, sau đó mình tống hết vài một cái array. Mình cũng tiện tay làm một cái array keywords luôn.
string[] sources =
{
"https://dantri.com.vn/trangchu.rss",
"https://www.24h.com.vn/upload/rss/trangchu24h.rss",
"http://vietnamnet.vn/rss/home.rss",
"http://gamek.vn/trang-chu.rss"
};
string[] keywords = { "tình" };
Phân tích RSS
Mình tạo một class mang tên RssAnalyzer để phân tích rss.
Mình sử dụng Thread để chạy đa luồng (definition and usage of Thread in C# https://o7planning.org/vi/10553/huong-dan-lap-trinh-da-luong-trong-csharp#a2160088), Xdocument để phân tích file XML (RSS) và Linq để lọc (Thay vì dùng 2 vòng lặp foreach).
Bạn có thể tham khảo về rss tree để hiểu rõ hơn về cách lọc của mình
class RssAnalyzer
{
string[] keywords;
string url;
Thread thread;
//List của những url thỏa mãn điều kiện
public List<string> Links { get; private set; }
public RssAnalyzer(string url, string[] keywords)
{
this.url = url;
this.keywords = keywords;
thread = new Thread(GetLink);
thread.Start();
}
//Chặn luồng
public void Join()
{
thread.Join(); // Blocking method - Wait until the previous thread fullfill
}
//Lọc qua keyword
public void GetLink()
{
XDocument document = XDocument.Load(url);
var items = document.Element("rss").Element("channel").Elements("item");
var neededItem = items.Where(
item => keywords.All(
word => item.Element("description").Value.ToLower().Contains(word)));
Links = neededItem.Select(node => node.Element("link").Value).ToList();
}
}
Hoàn thành main Program
Mình cho class RssAnalyzer vào một list, với mỗi url trong sources thì lại phân tích, đợi đến khi xong luồng thì get link trong List Links rồi in ra màn hình.
class Program
{
static void Main(string[] args)
{
string[] sources =
{
"https://dantri.com.vn/trangchu.rss",
"https://www.24h.com.vn/upload/rss/trangchu24h.rss",
"http://vietnamnet.vn/rss/home.rss",
"http://gamek.vn/trang-chu.rss"
};
string[] keywords = { "tình" };
List<RssAnalyzer> analyzers = new List<RssAnalyzer>();
foreach (string url in sources)
{
analyzers.Add(new RssAnalyzer(url, keywords));
}
//WAIT
foreach (var item in analyzers)
{
item.Join();
}
//WRITE
foreach (var item in analyzers)
{
foreach (string url in item.Links)
{
Console.WriteLine(url);
Thread.Sleep(500);
}
}
Console.WriteLine("END");
Console.ReadLine();
}
}
Test
Nhìn có vẻ ổn rồi ha? Chỉ cần với mỗi url lại mở 1 tab mới trong browser là xong. . Để làm điều đó chỉ cần thêm một dòng Process.Start(url) là được.
//WRITE
foreach (var item in analyzers)
{
foreach (string url in item.Links)
{
Console.WriteLine(url);
Process.Start(url);
Thread.Sleep(500);
}
}
Ok, vậy là chương trình đã hoàn thành rồi. Cảm ơn các bạn đã theo dõi
Full github repo: ~> https://github.com/PhiHuyHoang/NewsReader







