如何利用 C# 爬取「当当 - 计算机与互联网图书销量榜」!
前段时间我们介绍了如何利用 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 上下载。
下载地址为:
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!
参考阅读