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

当前,信息技术领域的知识在飞速的更新。作为一个程序爱好者,或者说已经超过 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!


参考图文:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,539评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,594评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,871评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,963评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,984评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,763评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,468评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,357评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,850评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,002评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,144评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,823评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,483评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,026评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,150评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,415评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,092评论 2 355

推荐阅读更多精彩内容