美文网首页
如何利用 C# 爬取「京东 - 计算机与互联网图书销量榜」!

如何利用 C# 爬取「京东 - 计算机与互联网图书销量榜」!

作者: 老马的程序人生 | 来源:发表于2019-02-26 17:11 被阅读0次

    当前,信息技术领域的知识在飞速的更新。作为一个程序爱好者,或者说已经超过 10年 的老码农,稍有懈怠就会被落下!跟踪当前信息技术领域的畅销书,结合自己所做的事情买来阅读,以便提升技能,就显得非常重要了。

    今天我就为大家介绍如何利用 C# 语言来爬取“京东 - 计算机与互联网图书销量榜”。


    我们先来看一下这个网页:

    https://book.jd.com/booktop/0-0-0.html?category=3287-0-0-0-1002-1#comfort

    网页

    当我们点击“第2页”时,我们发现URL变成:

    https://book.jd.com/booktop/0-0-0.html?category=3287-0-0-0-1002-2#comfort

    以此类推,页码的变化会导致客户端请求参数category的变化,即3287-0-0-0-1002-13287-0-0-0-1002-2……,这样我们就找到了要爬取网页的规律。

    我们再来看一下,网页的源代码:

    源代码

    可以发现,我们所要的数据全部在li标签中的class='p-detail'中,我们只要把这个网页的HTML DOM节点得到,在用“选择器”把对应的部分提取出来就可以了。

    这里推荐一个处理HTML DOM的开源工具:Jumony,可以在 Github 上下载。

    Jumony下载

    下载地址为:

    https://github.com/Ivony/Jumony

    这里对HTML DOM开源工具不做过多介绍,要是大家感兴趣,我后面再写几篇图文来介绍这个工具。


    网页分析部分介绍完了,下面我们介绍代码部分。

    1. 定义存储图书的结构 Book,代码如下:

    public class Book
    {
        /// <summary>
        /// 获取或设置 销量排名
        /// </summary>
        public int Num { get; set; }
        /// <summary>
        /// 获取或设置 书名
        /// </summary>
        public string Title { get; set; }
    
        /// <summary>
        /// 获取或设置 作者
        /// </summary>
        public string Author { get; set; }
    
        /// <summary>
        /// 获取或设置 出版社
        /// </summary>
        public string Press { get; set; }
    
        /// <summary>
        /// Book实例的格式化输出
        /// </summary>
        /// <returns>Markdown格式文本</returns>
        public override string ToString()
        {
            string num = Num.ToString().PadLeft(2, '0');
            string temp = "**Top" + num + ":" + Title.Trim() + "**" 
                    + Environment.NewLine
                    + "- 作 者:" + Author + Environment.NewLine
                    + "- 出版社:"+Press;
            return temp;
        }
    }
    

    2. 获取“京东 - 计算机与互联网图书销量榜”网页的 HTML结构 的代码如下:

    public static IHtmlDocument GetHtmlDocumentJd(int page)
    {
        string url = "https://book.jd.com/booktop/0-0-0.html?"
                        + "category=3287-0-0-0-1002-"
                        + page
                        + "#comfort";
        IHtmlDocument document;
        try
        {
            document = new JumonyParser().LoadDocument(url);
        }
        catch
        {
            document = null;
        }
        return document;
    }
    

    3. 获取“京东 - 计算机与互联网图书销量榜”内容的代码如下:

    public static List<Book> GetBooksJd(int page)
    {
        IHtmlDocument doc = GetHtmlDocumentJd(page);
        if (doc == null)
            return null;
    
        List<Book> result = new List<Book>();
        List<IHtmlElement> lists = doc.Find(".p-detail").ToList();
    
        for (int i = 0; i < lists.Count; i++)
        {
            Book book = new Book();
            book.Num = i + 1;
            List<IHtmlElement> s = lists[i].Find("a").ToList();
            //得到书的名字
            book.Title = s[0].InnerHtml().Trim(); 
    
            List<IHtmlElement> infor = lists[i].Find("dl dd").ToList();
    
            List<IHtmlElement> authors = infor[0].Find("a").ToList();
            if (authors.Count > 1)
            {
                string temp = infor[0].InnerHtml().Remove(0, 2).Trim();
                int index = temp.IndexOf("<a", StringComparison.Ordinal);
                string country = temp.Substring(0, index).Trim();
                string author1 = authors[0].InnerHtml().Trim(); // 著
                string author2 = authors[1].InnerHtml().Trim(); //译
                book.Author = country + " " + author1 + " 著 " 
                              + author2 + " 译";
            }
            else
            {
                book.Author = authors[0].InnerHtml().Trim() + " 著"; //得到作者的名字
            }
            
            //得到出版者的名字
            book.Press = infor[1].Find("a").ToList()[0].InnerHtml().Trim();
            result.Add(book);
        }
        return result;
    }
    

    4. 获得 Markdown 格式的字符串方法如下:

    private void btnSpider_Click(object sender, EventArgs e)
    {
        List<Book> books = BooksHtmlDocument.GetBooksJd(1);
    
        string str = "---" + Environment.NewLine + "### 京东"+Environment.NewLine;
        for (int i = 0; i < books.Count; i++)
        {
            str += Environment.NewLine+books[i] + Environment.NewLine;
        }
    }
    

    5. 解析Markdown格式的文本为HTML格式文本的结果如下:

    Markdown格式文本解析

    好了,到这里就基本介绍完毕了。

    我在图文 计算机书籍每周销量排行榜 中的“京东”部分就是这样完成的,避免了Ctrl+CCtrl+V的尴尬,提升了工作效率。

    是不是很有趣,你也来试试吧!See You!


    参考图文:

    相关文章

      网友评论

          本文标题:如何利用 C# 爬取「京东 - 计算机与互联网图书销量榜」!

          本文链接:https://www.haomeiwen.com/subject/qtczyqtx.html