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

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

作者: 老马的程序人生 | 来源:发表于2019-03-04 19:14 被阅读0次

    前段时间我们介绍了如何利用 C# 语言来爬取“京东 - 计算机与互联网图书销量榜” 网页的方法,通过该方法,我们能够获得“京东”的图书销售排行榜数据。

    可是,读书相当于给我们的大脑喂料,只有输入的是精华,才会有更好的输出。所以,仅仅有“京东”的数据还是不够的,或者说是片面的。我们需要扩展数据源,而说到图书购买,我们自然会想起“当当网”。今天我就带着大家来爬取“当当 - 计算机与互联网图书销量榜”的数据。


    爬取数据之前,我们先来分析一下原网页,网址如下:

    http://bang.dangdang.com/books/bestsellers/01.54.00.00.00.00-recent7-0-0-1-1

    当当网页

    当我们点击“第2页”时,网址变化为:

    http://bang.dangdang.com/books/bestsellers/01.54.00.00.00.00-recent7-0-0-1-2

    对比两个请求的 URL,发现变化的仅仅是最后一位的数字,这样我们就得到了爬取榜单的网络地址。

    接下来,我们看一下网页对应的源代码:

    当当源代码

    从源代码中我们发现所要的数据存放在 .bang_list > li 内的 .class > a.publisher_info > a 标签中。只要通过“选择器”找到这两个标签,就可以得到我们所要的数据。


    通过上面的分析,我们只要通过给定的 URL 得到“当当 - 计算机与互联网图书销量榜”网页的 HTML DOM TREE,然后进行解析找到对应的数据就可以了。这里,我们推荐一套处理HTML DOM TREE的开源工具 Jumony,可以在 Github 上下载。

    Jumony下载

    下载地址为:

    https://github.com/Ivony/Jumony

    这里对 Jumony 就不做过多介绍了,要是大家感兴趣,可以在图文下方留言,我后面再写几篇图文来介绍这个工具。


    到此为止,网页分析、所用工具已经介绍完了,下面介绍一下我们写的代码。

    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>
        /// 获取或设置 来源
        /// </summary>
        public string Source { 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 DOM TREE

    public static IHtmlDocument GetHtmlDocumentDd(int page)
    {
        string url = "http://bang.dangdang.com/books/bestsellers/"
            + "01.54.00.00.00.00-"
            + "recent7-0-0-1-"
            + page;
        IHtmlDocument document;
        try
        {
            document = new JumonyParser().LoadDocument(url);
        }
        catch
        {
            document = null;
        }
        return document;
    }
    

    3. 解析HTML DOM TREE得到存储图书的链表List<Book>

    public static List<Book> GetBooksDd(int page)
    {
        IHtmlDocument doc = GetHtmlDocumentDd(page);
        if (doc == null)
            return null;
    
        List<Book> result = new List<Book>();
        List<IHtmlElement> lists = doc.Find(".bang_list > li").ToList();
    
        for (int i = 0; i < lists.Count; i++)
        {
            Book book = new Book();
            book.Num = i + 1;
            book.Source = "当当网";
    
            List<IHtmlElement> s = lists[i].Find(".name > a").ToList();
            //得到书的名字
            book.Title = s[0].Attribute("title").AttributeValue.Trim(); 
    
            List<IHtmlElement> infor 
                    = lists[i].Find(".publisher_info > a").ToList();
            //得到作者的名字
            book.Author = infor[0].Attribute("title").AttributeValue.Trim(); 
            //得到出版者的名字
            book.Press = infor[infor.Count-1].InnerHtml().Trim(); 
            
            result.Add(book);
        }
        return result;
    }
    

    4. Markdown格式化输出存储图书的链表。

    private string GetReport(string name, List<Book> lst)
    {
        string result = Environment.NewLine + "---" + Environment.NewLine
                        + "### " + name + Environment.NewLine;
    
        for (int i = 0; i < lst.Count; i++)
        {
            result += Environment.NewLine + lst[i] + Environment.NewLine;
        }
        return result;
    }
    

    5. Markdown文本格式渲染。

    当当结果

    最后,我们再来总结一下。

    通过对“当当 - 计算机与互联网图书销量榜”的网页分析,我们确定了爬取网页的 URL 地址结构,利用 Jumony 开源工具得到该网页的 HTML DOM TREE,使用选择器得到对应的图书数据集合,最后格式化输出为 Markdwon 文本。经过渲染可以构成我们每周推荐的 计算机书籍每周销量排行榜 的“当当网”部分。怎么样,是不是很有趣。大家来试试看,今天就到这里吧, See You!


    参考阅读

    相关文章

      网友评论

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

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