这篇文章主要是关于如何通过豆瓣API获取信息的书籍,起初,我看到了原来的想法的内容是"C# 网络编程之网页简单下载实现"中通过HttpWebResponse类下载源代码,再通过正則表達式分析获取结点标签得到信息.但后来发现能够通过豆瓣API提供的编程接口实现.
该文章仅是基础性C#网络编程文章,尝试測试了下豆瓣API,并没什么高深的内容.但希望对大家有所帮助,仅供学习.
(警告:文章仅供參考,提供一种想法,否则訪问多次-10次被403 forbidden莫怪.建议认证使用豆瓣API)

一.豆瓣API介绍

在开发之前你须要申请创建一个应用,从而获取一个新的API Key(唯一标识你的Connect网站和API使用者).
正如豆瓣API高速入门(http://www.douban.com/service/apidoc/guide)中样例:这个演示样例中展示了使用API获得ID为1220562的书的信息, 请求的url例如以下(注意将{yourapikey}替换为你的API Key).
http://api.douban.com/book/subject/1220562?apikey={yourkeyapi}
返回的XML文档例如以下所看到的:

<?xml version="1.0" encoding="UTF-8"?>
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:db="http://www.douban.com/xmlns/"
xmlns:gd="http://schemas.google.com/g/2005"
xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/"
xmlns:opensearch="http://a9.com/-/spec/opensearchrss/1.0/"><id>http://api.douban.com/book/subject/1220562</id><title>满月之夜白鲸现</title><category scheme="http://www.douban.com/2007#kind" term="http://www.douban.com/2007#book"/><author><name>[日] 片山恭一</name></author><link href="http://api.douban.com/book/subject/1220562" rel="self"/><link href="http://book.douban.com/subject/1220562/" rel="alternate"/><link href="http://img3.douban.com/spic/s1747553.jpg" rel="image"/><link href="http://m.douban.com/book/subject/1220562/" rel="mobile"/><summary>那一年,是听莫扎特、钓鲈鱼和家庭破裂的一年。说到家庭破裂,母亲怪自己当初没有找到好男人。父亲则觉得当时是被狐狸精迷住了眼,失常的是母亲,但出问题的是父亲……。</summary><db:attribute name="isbn10">7543632608</db:attribute><db:attribute name="isbn13">9787543632608</db:attribute><db:attribute name="title">满月之夜白鲸现</db:attribute><db:attribute name="pages">180</db:attribute><db:attribute name="translator">豫人</db:attribute><db:attribute name="author">[日] 片山恭一</db:attribute><db:attribute name="price">15.00元</db:attribute><db:attribute name="publisher">青岛出版社</db:attribute><db:attribute name="binding">平装</db:attribute><db:attribute name="pubdate">2005-1</db:attribute><db:tag count="125" name="片山恭一"/><db:tag count="59" name="日本"/><db:tag count="53" name="日本文学"/><db:tag count="36" name="小说"/><db:tag count="31" name="满月之夜白鲸现"/><db:tag count="14" name="爱情"/><db:tag count="8" name="純愛"/><db:tag count="8" name="外国文学"/><gd:rating average="7.0" max="10" min="0" numRaters="322"/>
</entry>

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

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

1.加入命名空间

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

2.加入button点击事件

//点击按钮"获取信息"
private void button1_Click(object sender, EventArgs e)
{richTextBox1.Clear();//获取输入的URLstring 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":{ //获取<db:attribute name="XXX">的属性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路径 <link rel="image" href="http://xxx.jpg"/> 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点 原创:http://blog.csdn.net/eastmount)
參考资料:
1.豆瓣API高速入门
http://www.douban.com/service/apidoc/guide
2.c#使用豆瓣API-sun8134
这里很感谢该文章,在解析XML中我使用SelectSingleNodes方法失败后,參考了他的方法,也推荐大家去阅读
http://www.cnblogs.com/sun8134/archive/2010/12/15/1906879.html
3.豆瓣client-zh19900207 该文章仅有界面,但也是我想实现的功能描写叙述
http://blog.csdn.net/zh19900207/article/details/8586000
4.XmlNode.SelectNodes 方法
http://msdn.microsoft.com/zh-cn/library/4bektfx9.aspx

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

C# 通过豆瓣网络编程API获取图书信息相关推荐

  1. Android复习05【网络编程---WebView获取文章信息、保存用户名与密码、设置菜单样式、收藏文章列表】

    2020-04-02-星期四[源码可私聊我,QQ:386335886] 写篇文章不容易,点个赞再走吧,求求了~  目   录 网络访问-思维导图 玩Android网站---查看登录Cookie 适配器 ...

  2. 通过豆瓣Api,输入ISBN获取图书信息

    在本篇文章中,主要是通过豆瓣API实现获取图书信息的小功能. 一. 豆瓣API能干什么?   参考链接:[url]http://www.douban.com/service/ [/url] 豆瓣API ...

  3. python 实现用ISBN从豆瓣获取图书信息

    今天写了一个从豆瓣获取图书信息并返回json数据的小程序,记录一下. 豆瓣API有一个地址https://api.douban.com/v2/book/isbn/9787115404831 可以通过更 ...

  4. php获得注册信息,PHP网络编程:获取用户的注册信息[2]

    PHP网络编程:获取用户的注册信息[2]以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!     --此文章摘自<P ...

  5. java获取主机信息大全,网络编程:Java获取网络主机信息

    java.net.InetAddress类表示互联网协议 (IP) 地址. 有两个子类:Inet4Address, Inet6Address 通过 InetAddress可以方便获取一个域名下的IP, ...

  6. 开发实战分享|小程序扫码获取图书信息(内附详细教程)

    作者:祈澈姑娘 小程序扫码实现读取isbn,获取图书的各种信息 接触到云函数已经有一段时间了,之前一直在看api,现在自己跟着网络上的资料和视频学习,受到豆瓣读书系列的启发,决定用云函数做一个项目,获 ...

  7. 微信小程序使用百度api获取天气信息 —— 微信小程序教程系列(16)

    之前已经介绍过,如何使用百度地图api来获取地理位置信息 微信小程序的百度地图获取地理位置 -- 微信小程序教程系列(15) 下面介绍使用百度api来获取天气信息. 1> 第一步:先到百度开放平 ...

  8. 抓取在线书店信息:从在线书店获取图书信息及价格

    目录 1. 准备工作 2. 分析目标网站 3. 编写爬虫 4. 优化和扩展 5. 总结 在线书店通常提供了海量的图书信息,如书名.作者.出版社.价格等.这些信息对于分析图书市场.了解读者喜好具有重要价 ...

  9. android调用在线天气服务,android通过google api获取天气信息示例

    android通过google API获取天气信息 复制代码 代码如下: public class WeatherActivity extends Activity { private TextVie ...

最新文章

  1. Leetcode62 DP
  2. kvm直通sata_基于KVM的SRIOV直通配置及性能测试
  3. python:how does subclass call baseclass's __init__()
  4. 操作系统概述 操作系统第一章知识点归纳总结
  5. 英特尔 AI 芯片业务的现状与未来
  6. windows下安装php5.5的redis扩展
  7. Service Mesh-Linkerd安装与使用
  8. 1、CSS 盒子模型,2、边框样式,3、CSS 轮廓(outline),
  9. 服装CAD计算机试衣的好处,浅议服装CAD三维试衣探究及创新.doc
  10. Kibana启动报错 server is not ready yet的解决方案
  11. Rxjava Subject分析
  12. better-scroll实现滚动效果
  13. JS中alert的三种使用方式
  14. m4a转mp3方法,m4a转mp3步骤
  15. 工作10个月,做地图插件的感悟——理论篇
  16. 详解自监督发展趋势! 何恺明连获三年CVPR最高引用的秘诀是?
  17. 程序员代码面试指南第二版 4.猫狗队列
  18. Java 基本数据类型 编码方式(小记1.7)
  19. LeetCode:剑指 Offer 58 - II. 左旋转字符串
  20. [笔记分享] [Hardware] MSM8x60 User Guide study report

热门文章

  1. 多回路配电监控装置在数据中心精密配电柜中的应用
  2. 〖产品思维训练白宝书 - 产品思维认知篇②〗- 破局高手都具备的一种底层认知 - 产品思维
  3. 初探ASP.NET Web API
  4. 脑网络阈值选择参考文献
  5. mongodb数据库定时任务自动备份
  6. android app存活时间长,app 在后台时间过长被杀死,及时重启
  7. 一个超厉害的智能小程序:可接收你的小程序客服消息,无需开发,自动接入。
  8. 5-羟色胺(serotonin)
  9. jmeter——BeanShell 预处理程序
  10. 2023年中国政法大学法硕(非法学)考研上岸前辈备考经验