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

2019-03-04  本文已影响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!


参考阅读

上一篇下一篇

猜你喜欢

热点阅读