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

时间:2022-03-11 03:32:49

这篇文章主要是关于如何通过豆瓣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();
//获取输入的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":
{
//获取<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.执行结果例如以下

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvRWFzdG1vdW50/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center">

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

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

三.遇到的问题及总结

由上图能够发现我输入的网址没有包括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. PHP通过ZABBIX API获取主机信息 VS 直接从数据库获取主机信息

    最近项目需要获取linux主机的一些信息,如CPU使用率,内存使用情况等.由于我们本身就装了zabbix系统,所以我只用知道如何获取信息即可,总结有两种方法可以获取. 一.通过ZABBIX API获取 ...

  2. 【Android 应用开发】Android 网络编程 API笔记 - java&period;net 包 权限 地址 套接字 相关类 简介

    Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...

  3. 【Android 应用开发】Android 网络编程 API笔记 - java&period;net 包相关 接口 api

    Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...

  4. Android 网络编程 API笔记 - java&period;net 包 权限 地址 套接字 相关类 简介

    Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...

  5. Android 网络编程 API笔记 - java&period;net 包相关 接口 api

    Android 网络编程相关的包 : 9 包, 20 接口, 103 类, 6 枚举, 14异常; -- Java包 : java.net 包 (6接口, 34类, 2枚举, 12异常); -- An ...

  6. 14Java进阶网络编程API

    1.网络协议的三要素:语义.语法和时序 语义表示要做什么,语法表示要怎么做,时序表示做的顺序. 2.网络OSI七层模型 OSI/RM 模型(Open System Interconnection/Re ...

  7. API更新&num;图书信息查询ISBN2&period;0

    ISBN图书查询     自2019年5月8日公布isbn查询接口1.0至今,该图书数据查询服务已被调用八万余次,查得图书11653本,感谢一直使用和关心这个接口的朋友们! 目前网站域名将于2019年 ...

  8. 通过API获取统计信息时报Access denied错误处理记录

    通过API获取HDFS统计信息时报Access denied错误信息,错误信息如下: org.apache.hadoop.ipc.RemoteException(org.apache.hadoop.s ...

  9. python 面向对象编程、获取对象信息

    面向对象与面向过程 参考链接:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0 ...

随机推荐

  1. 关于springMVC&plus;Mybatis jar包详解

    1.Aopalliance.jar: 这个包是AOP联盟的API包,里面包含了针对面向切面的接口,通常spring等其它具备动态织入功能的框架依赖此包. 2.aspectjweaver-1.7.1.j ...

  2. js的继承

    js要实现继承有很多方法,个人总结大致分为三种: function people(){ this.specials = "人类"; } function p1(name){ thi ...

  3. qq

    引用:http://blog.sina.com.cn/s/blog_9e2e84050101blqz.html 腾讯QQ使用何种开发平台?                   腾讯QQ的开发分客户端软 ...

  4. 判断一个 int 向量里是否有相同的数 并且距离在k之内 (2)

    class Solution { public: bool containsNearbyDuplicate(vector<int>& nums, int k) { map<i ...

  5. 爆料喽!!!开源日志库Logger的剖析分析

    导读 Logger类提供了多种方法来处理日志活动.上一篇介绍了开源日志库Logger的使用,今天我主要来分析Logger实现的原理. 库的整体架构图 详细剖析 我们从使用的角度来对Logger库抽茧剥 ...

  6. &lbrack;WinAPI&rsqb; API 12 &lbrack;获取程序所在的目录、程序模块路径,获取和设置当前目录&rsqb;

    Windows系统提供一组API实现对程序运行时相关目录的获取和设置.用户可以使用GetCurrentDirectory和SetCurrentDirectory获取程序的当前目录,获取模块的路径使用G ...

  7. ASP&period;NET 让无码编程不在是梦 -&period;NET通用平台、通用权限、易扩展、多语言、多平台架构框架

    先拿出我半前年前平台的设计初稿,经过半年的努力我已经完成了该设计稿的所有功能.并且理念已经远远超出该设计稿. 下面是一些博友对我贴子的评价: 1.楼主,想法很美好,现实很骨感,我们公司就有一套你说的这 ...

  8. Js异步级联选择框实践方法

    HTML: <li> <span>所在地区:</span> <select name="prov" id="ddl_prov&q ...

  9. MyEclipse使用经验归纳

  10. WPF 杂谈——开篇简言。

    这俩年多来笔者一直在从事关于WPF的开发.虽然不能说是专家级别的.但是对于WPF的应用还是有一定的了解.论他的灵活性决对不在WinForm之下.WPF的出现更是引发一段热议.他的何去何从更是让很多人感 ...