Đọc báo và lọc keywords với C#
C#
26
linq
2
White

Rice viết ngày 14/11/2018

Mục tiêu

Mình muốn làm một chương trình:

  • Đọc rss (definition and usage of rss :arrow_right: 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" :two_hearts:)
  • 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# :arrow_right: 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
alt text

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

alt text

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. :smile:. Để 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);
                }
            }

alt text

Ok, vậy là chương trình đã hoàn thành rồi. Cảm ơn các bạn đã theo dõi :smile:

Full github repo: ~> https://github.com/PhiHuyHoang/NewsReader

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

Rice

10 bài viết.
25 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
15 8
Sản phẩm sau khi làm http://coffeetube.herokuapp.com/ Yêu cầu Nói chung thì giờ download nhạc từ youtube thì nó có vô số cách rồi. Nhưng tự mình...
Rice viết 1 năm trước
15 8
White
9 4
Trước giờ logic code của mình vẫn luôn dễ dãi như gái làng chơi nên đôi khi nó đã support thêm cho mình cái đức tính càng lúc càng không (thèm) kiê...
Rice viết 1 năm trước
9 4
White
7 3
Description Mình là một thằng thích đọc sách. Nhưng lúc nào cũng bận (lười) nên cũng mấy tháng rồi chưa hoàn thành được quyển sách nào. Mình đa số...
Rice viết 9 tháng trước
7 3
Bài viết liên quan
White
0 0
Mình khá là lười, nên mình sẽ không đưa định nghĩa hay usage của reflection vào đây. Vì dù sao mình cũng sẽ chỉ copy thôi :smile:. Vậy nên chúng ta...
Rice viết 1 năm trước
0 0
White
25 4
Tạo dummy data với Faker và Mockaroo – Xa rồi những ngày nhập tay nhàm chán Cuộc đời một thằng developer có rất nhiều việc rất chán nhưng phải làm...
Huy Hoàng Phạm viết 4 năm trước
25 4
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
10 bài viết.
25 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!