当前,信息技术领域的知识在飞速的更新。作为一个程序爱好者,或者说已经超过 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-1
、3287-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+C
和Ctrl+V
的尴尬,提升了工作效率。
是不是很有趣,你也来试试吧!See You!
参考图文:
经过8年多的发展,LSGO软件技术团队在「地理信息系统」、「数据统计分析」、「计算机视觉」等领域积累了丰富的研发经验,也建立了人才培养的完备体系,欢迎对计算机技术感兴趣的同学加入,与我们共同成长进步。