博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 通过豆瓣网络编程API获取图书信息
阅读量:6151 次
发布时间:2019-06-21

本文共 6997 字,大约阅读时间需要 23 分钟。

这篇文章主要是关于如何通过豆瓣API获取信息的书籍,起初,我看到了原来的想法的内容是""中通过HttpWebResponse类下载源代码,再通过正則表達式分析获取结点标签得到信息.但后来发现能够通过提供的编程接口实现.

该文章仅是基础性C#网络编程文章,尝试測试了下豆瓣API,并没什么高深的内容.但希望对大家有所帮助,仅供学习.
(警告:文章仅供參考,提供一种想法,否则訪问多次-10次被403 forbidden莫怪.建议认证使用豆瓣API)

一.豆瓣API介绍

在开发之前你须要申请创建一个应用,从而获取一个新的API Key(唯一标识你的Connect网站和API使用者).

正如豆瓣API高速入门()中样例:这个演示样例中展示了使用API获得ID为1220562的书的信息, 请求的url例如以下(注意将{yourapikey}替换为你的API Key).
http://api.douban.com/book/subject/1220562?apikey={yourkeyapi}
返回的XML文档例如以下所看到的:

http://api.douban.com/book/subject/1220562
满月之夜白鲸现
[日] 片山恭一
那一年,是听莫扎特、钓鲈鱼和家庭破裂的一年。说到家庭破裂,母亲怪自己当初没有找到好男人。父亲则觉得当时是被狐狸精迷住了眼,失常的是母亲,但出问题的是父亲……。
7543632608
9787543632608
满月之夜白鲸现
180
豫人
[日] 片山恭一
15.00元
青岛出版社
平装
2005-1

此时,我须要做的就是通过输入的URL获取返回的XML中的数据,通过HttpWebRequest和HttpWebResponse获取HTTP请求和应答,并解析XML中的信息(较难).后来我才发现假设想试验下API,豆瓣是同意在不申请API Key情况下进行API调用(每分钟请求不超过10次).也就是说我在程序中输入网址例如以下就可以返回XML.

http://api.douban.com/book/subject/1220562

二.C#获取豆瓣书籍信息

1.加入命名空间

using System.Net;                      //HTTPusing System.IO;                       //文件 流操作using System.Text.RegularExpressions;  //正則表達式using System.Xml;                      //Xml文档

2.加入button点击事件

//点击按钮"获取信息"private void button1_Click(object sender, EventArgs e){    richTextBox1.Clear();    //获取输入的URL    string url = textBox1.Text.ToString();    //HttpWebRequest对象实例:该类用于获取和操作HTTP请求 创建WebRequest对象    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);    //HttpWebResponse对象实例:该类用于获取和操作HTTP应答     HttpWebResponse response = (HttpWebResponse)request.GetResponse();    //构造字节流    StreamReader reader = new StreamReader(response.GetResponseStream());    //流从头读至尾    string xmlUrl = reader.ReadToEnd();    reader.Close();    response.Close();    //调用自己定义函数获取XML信息    GetInfoXML(xmlUrl);}

3.自己定义函数获取书籍信息

//获取豆瓣XML内容并显示private void GetInfoXML(string xmlUrl){    try    {        //实例Xml文档        XmlDocument xmlDoc = new XmlDocument();        //从指定字符串载入xml文档         xmlDoc.LoadXml(xmlUrl);                               //实例解析、加入并移除集合的命名空间及范围管理        XmlNamespaceManager xmlNM = new XmlNamespaceManager(xmlDoc.NameTable);        //将给定命名空间加入到集合         xmlNM.AddNamespace("db", "http://www.w3.org/2005/Atom");        //获取文档根元素        XmlElement root = xmlDoc.DocumentElement;        //选择匹配Xpath(内容)表达式的结点列表         //函数原型:SelectNodes(string xpath,XmlNamespaceManger nsmgr)        XmlNodeList nodes = root.SelectNodes("/db:entry", xmlNM);        //获取子节点信息        foreach (XmlNode nodeData in nodes)        {            foreach (XmlNode childnode in nodeData.ChildNodes)            {                string str = childnode.Name;                switch (str)                {                    case "title":                        string name = "标题名称:" + childnode.InnerText + "\r\n\r\n";                        richTextBox1.AppendText(name);                        break;                                        case "author":                        string author = "作者:" + childnode.InnerText + "\r\n\r\n";                        richTextBox1.AppendText(author);                        break;                    case "db:attribute":                        {                             //获取
的属性 switch (childnode.Attributes[0].Value) { case "pages": string pages="总页数:"+childnode.InnerText+"\r\n\r\n"; richTextBox1.AppendText(pages); break; case "price": string price="价格:"+childnode.InnerText+"\r\n\r\n"; richTextBox1.AppendText(price); break; case "publisher": string publisher="出版社:"+childnode.InnerText+"\r\n\r\n"; richTextBox1.AppendText(publisher); break; case "pubdate": string pubdate="出版日期:"+childnode.InnerText+"\r\n\r\n"; richTextBox1.AppendText(pubdate); break; } break; } case "summary": //显示内容 WordWrap设置为true自己主动换行(无需调用Split函数或求字符长度) string summary="内容:"+childnode.InnerText+"\r\n\r\n"; richTextBox1.AppendText(summary); break; case "link": //结点属性是Attributes[0]却失败,不能获取 if (childnode.Attributes[1].Value == "image") { //获取image路径
string imagePath = childnode.Attributes[0].Value; //下载图片 string imageName = "local.jpg"; System.Net.WebClient client = new System.Net.WebClient(); //下载指定URL资源到本地目录 //函数原型 DownloadFile(string address,string fileName) client.DownloadFile(imagePath,imageName); //从本地文件里载入图片 this.pictureBox1.Image = Image.FromFile(imageName); //图像原图大小 this.pictureBox1.SizeMode = PictureBoxSizeMode.Zoom; //下载第二张图片时总是出现"WebClient请求期间发生异常" } break; } //switch } //foreach } //foreach } catch (Exception msg) //异常处理 { MessageBox.Show(msg.Message); }} //GetInfoXML

4.执行结果例如以下

源网址中的书籍信息介绍例如以下图所看到的:

三.遇到的问题及总结

由上图能够发现我输入的网址没有包括API key也能获取,但我在測试时总是使用的.然后同一时候我也遇到了一些问题:

1.豆瓣API获取书籍信息接口,须要传subjectID或isbnID(国际标准书号),但我想实现的是只知道书名,就能获取书籍的信息,而不是只传入一串URL,这些分析都让程序内容实现,这是接下来须要做的.
2.在使用WebClient和DownloadFile(string address,string fileName)下载图片时,当获取第二张图片总会提示错误"WebClient请求期间发生异常",不知道为啥,但不想使用stream或并发获取图片,仅想知道这是为啥?
3.这不过一篇基础性的介绍使用豆瓣API的文章,眼下豆瓣针对已经授权用户(开发API採用OAuth协议进行鉴权)能够实现非常多功能,后面假设有时间能够写些“查看用户信息、用户友邻信息、增删改查用户收藏、查看评论”的文章.
最后希望该文章对大家有所帮助,假设文章中有错误或不足之处,还请海涵.同一时候文章也參考了一些资料,感谢这些作者.
(By:Eastmount 2014-5-2 下午3点 原创:)
參考资料:
1.豆瓣API高速入门
2.c#使用豆瓣API-sun8134
这里很感谢该文章,在解析XML中我使用SelectSingleNodes方法失败后,參考了他的方法,也推荐大家去阅读
3.豆瓣client-zh19900207 该文章仅有界面,但也是我想实现的功能描写叙述
4.XmlNode.SelectNodes 方法

版权声明:本文博主原创文章。博客,未经同意不得转载。

你可能感兴趣的文章
PCS子层有什么用?
查看>>
查看端口,关闭端口
查看>>
linux:yum和apt-get的区别
查看>>
Sentinel 1.5.0 正式发布,引入 Reactive 支持
查看>>
数据库之MySQL
查看>>
2019/1/15 批量删除数据库相关数据
查看>>
数据类型的一些方法
查看>>
Mindjet MindManager 2019使用教程:
查看>>
详解 CSS 绝对定位
查看>>
AOP
查看>>
NGUI Label Color Code
查看>>
vue组件开发练习--焦点图切换
查看>>
浅谈OSI七层模型
查看>>
Webpack 2 中一些常见的优化措施
查看>>
移动端响应式
查看>>
js中var、let、const的区别
查看>>
简洁优雅地实现夜间模式
查看>>
react学习总结
查看>>
在soapui上踩过的坑
查看>>
MySQL的字符集和字符编码笔记
查看>>