




已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
微信开发纪实之数字图书馆服务最近在做微信的后台开发,看到有些高校的微信公众平台上有查询借阅和续借的功能,自己闲来无事也瞎鼓捣了一个,现在把成果贴出来和大家一起分享。由于本人在武汉大学,故以武汉大学图书馆为例。思路:1. 模拟登陆2. 抓取数据语言:java代码:DigitalLibraryService.javapackage com.wdyx.weixin.service;import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Set;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.NameValuePair;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.entity.UrlEncodedFormEntity;import org.apache.http.client.methods.HttpPost;import org.apache.http.entity.BufferedHttpEntity;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.message.BasicNameValuePair;import org.apache.http.util.EntityUtils;import org.jsoup.Jsoup;import org.jsoup.nodes.Document;import org.jsoup.nodes.Element;import org.jsoup.select.Elements;/* * 数字图书馆服务 * 功能:查询个人信息、借阅信息、借阅历史,以及进行续借操作* author 帮杰 */ public class DigitalLibraryService /主机地址public static final String HOST = ;/登陆页面地址public static final String LOGIN_URL = /web/login.asp;/表单post地址public static final String POST_URL = :80/pds;/借阅者信息private String borrowerInfo = null;/借阅信息private String borrowInfo = null;/借阅历史private String borrowHistory = null;/储存登录页,以备续借之需private String renewPage = null;/每一个客户即为一个HttpClient对象private CloseableHttpClient httpclient = null;/构造函数,以用户名和密码作为参数public DigitalLibraryService(String username,String password) throws ClientProtocolException, IOException/初始化HttpClient对象httpclient = HttpClients.createDefault();/解析登录页Document doc = Jsoup.parse(login(username, password, httpclient);/“我的借阅信息”所对应的urlString BorrowerInfoUrl = doc.getElementsContainingOwnText(我的借阅信息).first().attr(href);/据观察有重定向;获得重定向地址String RelocatedBorrowerInfoUrl = HttpUtil.getHtml(BorrowerInfoUrl,httpclient).split()1;/重定向页String RelocatedBorrowerInfoHtml = HttpUtil.getHtml(RelocatedBorrowerInfoUrl,httpclient);/借阅者信息页String BorrowerInfoHtml = HttpUtil.getHtml(HOST + HtmlUtil.getLinks(RelocatedBorrowerInfoHtml).get(0), httpclient);/通过抓取获得借阅者信息borrowerInfo = getBorrowerInfo(BorrowerInfoHtml);doc = Jsoup.parse(BorrowerInfoHtml);/当前借阅数:后面的数字链接指向借阅信息页,故此处取得该链接String BorrowInfoUrl = doc.getElementsContainingOwnText(当前借阅数:).parents().select(a).attr(href).split()1;/借阅历史页面链接String BorrowHistoryUrl = doc.getElementsContainingOwnText(借阅历史).attr(href);/借阅信息页String BorrowInfoHtml = HttpUtil.getHtml(BorrowInfoUrl, httpclient);/借阅历史页String BorrowHistoryHtml = HttpUtil.getHtml(BorrowHistoryUrl, httpclient);/借阅信息borrowInfo = getBorrowInfo(BorrowInfoHtml);/借阅历史borrowHistory = getBorrowHistory(BorrowHistoryHtml);/借阅信息即为能进行续借操作的页面renewPage = BorrowInfoHtml;/得到借阅者信息public String getBorrowerInfo()return borrowerInfo;/得到借阅信息public String getBorrowInfo()return borrowInfo;/得到借阅历史public String getBorrowHistory()return borrowHistory;/续借,返回续借结果public String renew()return renewBook(renewPage, httpclient); /* * 初始化POST表单参数 * * param username * param password * return List * throws IOException * throws ClientProtocolException */ private static List initialLoginFormData(String username, String password) throws ClientProtocolException, IOException List nvps = new ArrayList(); HashMap parmasMap = HtmlUtil.getLoginFormData(LOGIN_URL); Set keySet = parmasMap.keySet(); for (String temp : keySet) if (temp.contains(bor_id) parmasMap.put(temp, username); else if (temp.contains(bor_verification) parmasMap.put(temp, password); nvps.add(new BasicNameValuePair(temp, parmasMap.get(temp); return nvps; /* * 登陆图书馆主页 * * param username * param password * param post_url * return 登陆后的图书馆主页 * throws IOException * throws ClientProtocolException */ private static String login(String username,String password,CloseableHttpClient httpclient) String html = ; try List nvps = initialLoginFormData(username, password); HttpPost post = new HttpPost(POST_URL); post.setEntity(new UrlEncodedFormEntity(nvps); HttpResponse response = httpclient.execute(post); HttpEntity entity = new BufferedHttpEntity(response.getEntity(); html = EntityUtils.toString(entity,HtmlUtil.getCharset(EntityUtils.toString(entity); String mainUrl = HOST + HtmlUtil.getLinks(html).get(0); html = HttpUtil.getHtml(mainUrl,httpclient); catch(ClientProtocolException e) e.printStackTrace(); catch(IOException e) e.printStackTrace(); return html; /*抽取数据*/ /* * 抽取 借阅者信息 * param BorrowerInfoHtml * return BorrowerInfo */private static String getBorrowerInfo(String BorrowerInfoHtml)StringBuffer buffer = new StringBuffer();tryList key = new ArrayList();List val = new ArrayList();Document doc = Jsoup.parse(BorrowerInfoHtml);Elements elements = doc.select(table).select(tr);Elements col1 = elements.select(td.td4);Elements col2 = elements.select(td.td1);for(Element tmp : col1)key.add(tmp.text();for(Element tmp : col2)val.add(tmp.text();buffer.append(-您的个人信息-nn);for(int i=0;ikey.size();i+)if(i != 3)buffer.append(key.get(i).append(val.get(i).append(nn);catch(Exception e)e.printStackTrace();return (null = buffer) ? null : buffer.substring(0, buffer.lastIndexOf(nn);/* * 抽取 借阅信息 * param username * param password * param login_url * return */private static String getBorrowInfo(String BorrowInfoHtml)StringBuffer buffer = new StringBuffer();tryList key = new ArrayList();List val = new ArrayList();Document doc = Jsoup.parse(BorrowInfoHtml);Elements th = doc.select(th.text3);Elements td = doc.select(td.td1);for(Element tmp : th)key.add(tmp.text();for(Element tmp : td)val.add(tmp.text();buffer.append(-您的借阅信息-nn);int itemCounts = key.size();int groupCounts = val.size()/itemCounts;for(int i=0;igroupCounts;i+)for(int j=0;jitemCounts;j+)if(j!=1)buffer.append(key.get(j)+(j=0?:).append(val.get(i*itemCounts+j).append(nn);buffer.append(-nn);catch(Exception e)e.printStackTrace();return (buffer = null)?null:buffer.substring(0, buffer.lastIndexOf(-nn);/* * 抽取 借阅历史 * param username * param password * param login_url * return */private static String getBorrowHistory(String BorrowHistoryHtml)StringBuffer buffer = new StringBuffer();tryList key = new ArrayList();List val = new ArrayList();Document doc = Jsoup.parse(BorrowHistoryHtml);Elements th = doc.select(th.text3);Elements td = doc.select(td.td1);for(Element tmp : th)key.add(tmp.text();for(Element tmp : td)val.add(tmp.text();buffer.append(-您的借阅历史-nn);val.remove(0);int itemCounts = key.size();int groupCounts = val.size()/itemCounts;for(int i=0;igroupCounts;i+)for(int j=0;jitemCounts;j+)buffer.append(key.get(j)+(j=0?:).append(val.get(i*itemCounts+j).append(nn);buffer.append(-nn);catch(Exception e)e.printStackTrace();return (buffer = null)?null:buffer.substring(0, buffer.lastIndexOf(-nn);/* * 续借 * param renewHtml * param httpclient * return 续借结果 */private static String renewBook(String renewHtml,CloseableHttpClient httpclient)StringBuffer buffer = new StringBuffer();tryDocument doc = Jsoup.parse(renewHtml);String url = doc.getElementsContainingOwnText(全部续借).attr(href).split()1;String resultPage = HttpUtil.getHtml(url,httpclient);doc = Jsoup.parse(resultPage);Elements th = doc.select(tr.tr1).select(th);Elements td = doc.select(td.td1);List key = new ArrayList();List val = new ArrayList();for(Element tmp : th)key.add(tmp.text();for(Element tmp : td)val.add(tmp.text();buffer.append(-您的续借结果-nn);int itemCounts = key.size();int groupCounts = val.size()/itemCounts;for(int i=0;igroupCounts;i+)for(int j=0;jitemCounts;j+)buffer.append(key.get(j)+:).append(val.get(i*itemCounts+j).append(nn);buffer.append(-nn);catch(Exception e)e.printStackTrace();return (buffer = null)?null:buffer.substring(0, buffer.lastIndexOf(-nn);/测试public static void main(String args) throws Exception String username = *;String password = *;DigitalLibraryService myDigitalLibraryService = new DigitalLibraryService(username,password);/System.out.println(-个人信息-);System.out.println(myDigitalLibraryService.getBorrowerInfo();/System.out.println(-借阅信息-);System.out.println(myDigitalLibraryService.getBorrowInfo();/System.out.println(-借阅历史-);System.out.println(myDigitalLibraryService.getBorrowHistory();/System.out.println(-续借结果-);System.out.println(myDigitalLibraryService.renew();测试效果如下:由于截图显示不全,我把结果贴在下面:-您的个人信息-姓?名:? 莫帮杰读者证号:?2013301200227有效期:?20170630当前借阅数:1预约请求数:0现金记录:0.00-您的借阅信息-No.1著者:郭珍题名:JSP程序设计教程出版年:2012应还日期:20150311应还时间:22:00罚款:分馆:总馆图书借阅区A2-A5索书号:TP393.092/G591c2单册描述:SFX:-您的借阅历史-No.1著者:郭珍题名:JSP程序设计教程年:2012应还日期:20141229应还时间:22:00归还日期:20141221归还时间:19:11罚款:分馆:总馆图书借阅区A2-A5-No.2著者:IBMG国际商业管理集团题名:榜样的力量 :连锁零售企业背后的故事 :the stories of the retailers年:2012应还日期:20141210应还时间:22:00归还日期:20141124归还时间:19:10罚款:分馆:总馆图书借阅区A2-A5-No.3著者:周星潼题名:芝麻开门 :成就阿里巴巴网络帝国的13个管理法则年:2012应还日期:20141210应还时间:22:00归还日期:20141124归还时间:19:10罚款:分馆:总馆图书借阅区A2-A5-No.4著者:赖利题名:乐享Arduino+Android+PC创意制作年:2014应还日期:20141202应还时间:22:00归还日期:20141102归还时间:10:42罚款:分馆:总馆图书借阅区A2-A5-No.5著者:赖利题名:乐享Arduino+Android+PC创意制作年:2014应还日期:20141202应还时间:22:00归还日期:20141124归还时间:19:10罚款:分馆:总馆图书借阅区A2-A5-No.6著者:威尔弗雷德题名:PHP专业项目实例开发年:2003应还日期:20141115应还时间:22:00归还日期:20141108归还时间:09:51罚款:分馆:总馆图书借阅区A2-A5-No.7著者:潘凯华题名:PHP求职宝典年:2012应还日期:20141114应还时间:22:00归还日期:20141108归还时间:09:51罚款:分馆:总馆图书借阅区A2-A5-No.8著者:赖利题名:乐享Arduino+Android+PC创意制作年:2014应还日期:20141020应还时间:22:00归还日期:20141012归还时间:15:14罚款:分馆:总馆图书借阅区A2-A5-No.9著者:叶青题名:网页开发手记 :HTML+CSS+JavaScript实战详解年:2011应还日期:20141020应还时间:22:00归还日期:20141012归还时间:15:15罚款:分馆:总馆图书借阅区A2-A5-No.10著者:叶青题名:网页开发手记 :HTML+CSS+JavaScript实战详解年:2011应还日期:20140929应还时间:22:00归还日期:20140920归还时间:18:31罚款:分馆:总馆图书借阅区A2-A5-No.11著者:赖利题名:乐享Arduino+Android+PC创意制作年:2014应还日期:20140929应还时间:22:00归还日期:20140920归还时间:18:31罚款:分馆:总馆图书借阅区A2-A5-No.12著者:刘剑题名:51单片机开发与应用基础教程 :C语言版年:2012应还日期:20140911应还时间:22:00归还日期:20140701归还时间:14:16罚款:分馆:总馆图书借阅区A2-A5-No.13著者:熊斌题名:Android多媒体开发技术实战详解年:2012应还日期:20140911应还时间:22:00归还日期:20140830归还时间:19:00罚款:分馆:总馆图书借阅区A2-A5-No.14著者:贝内特题名:Objective-C初学者指南年:2012应还日期:20140911应还时间:22:00归还日期:20140830归还时间:19:01罚款:分馆:总馆图书借阅区A2-A5-No.15著者:张海霞题名:奇思妙想的物联网 :2012年中国大学生物联网创新创业大赛获奖作品集锦年:2013应还日期:20140911应还时间:22:00归还日期:20140830归还时间:19:01罚款:分馆:总馆图书借阅区A2-A5-No.16著者:赖利题名:乐享Arduino+Android+PC创意制作年:2014应还日期:20140911应还时间:22:00归还日期:20140830归还时间:19:02罚款:分馆:总馆图书借阅区A2-A5-No.17著者:叶青题名:网页开发手记 :HTML+CSS+JavaScript实战详解年:2011应还日期:20140911应还时间:22:00归还日期:20140830归还时间:19:02罚款:分馆:总馆图书借阅区A2-A5-您的续借结果-序号:1描述:JSP程序设计教程单册状态:已借出应还日期:20150311应还时间:22:00分馆:总馆图书借阅区A2-A5条码:101101630602单册描述:未能续借的原因:不能再续借 (还书日期没改变)。我把代码中的HttpUtil.java也贴出来:package com.wdyx.weixin.service;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import .HttpURLConnection;import .URL;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.methods.HttpGet;import org.apache.http.entity.BufferedHttpEntity;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.util.EntityUtils;/* * HTTP小工具 * author 帮杰 * */public class HttpUtil /* * 判断是否有重定向 * param response * return boolean */public static boolean isRedirected(HttpResponse response)int code = response.getStatusLine().getStatusCode();return (code=301|code=302)?true:false;/* * 得到重定向Location * param response * return String */public static String getLocation(HttpResponse response)return response.getHeaders(Location)0.toString();/* * 处理重定向 * param response * param httpclient * return HttpResponse */public static HttpResponse handleRedirect(HttpResponse response,CloseableHttpClient httpclient)if(isRedirected(response)try String location = getLocation(response);HttpGet httpget = new HttpGet(location);response = httpclient.execute(httpget); catch (ClientProtocolException e) / TODO Auto-generated catch blocke.printStackTrace(); catch (IOException e) / TODO Auto-generated catch blocke.printStackTrace();return response;/* * 新请求一个页面 * * param url * return HTML * throws IOException * throws ClientProtocolException * return String */public static String getHtml(String url) throws ClientProtocolException, IOException String html = ;HttpGet httpget = new HttpGet(url);HttpResponse response = HttpClients.createDefault().execute(httpget);HttpEntity entity = new BufferedHttpEntity(response.getEntity();String charset = HtmlUtil.getCharset(EntityUtils.toString(entity); html = EntityUtils.toString(entity,charset);return html;/* * 新请求一个页面,自动处理重定向 * * param url * return HTML * throws IOException * throws ClientProtocolException * return String */public static String getHtml3xx(String url) throws ClientProtocolException, IOException String html = ;HttpGet httpget = new HttpGet(url);CloseableHttpClient httpclient = HttpClients.createDefault();HttpResponse response = handleRedirect(httpclient.execute(httpget),httpclient);HttpEntity entity = new BufferedHttpEntity(response.getEntity();String charset = HtmlUtil.getCharset(EntityUtils.toString(entity); html = EntityUtils.toString(entity,charset);return html;/* * 指定client请求页面 * * param url * param httpclient * return HTML * throws IOException * throws ClientProtocolException * return String */public static String getHtml(String url,CloseableHttpClient httpclient) throws ClientProtocolException, IOException String html = ;HttpGet httpget = new HttpGet(url);HttpResponse response = httpclient.execute(h
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 水(油)压机锻造工岗位操作规程考核试卷及答案
- 空气呼吸器培训考核试题及答案
- 换罐清渣工综合考核试卷及答案
- 幼儿园保健医考核试题及答案
- 卫生法律法规试题(附答案)
- 铸管备品工三级安全教育(车间级)考核试卷及答案
- 电解精炼工技术考核试卷及答案
- 井下采煤机司机转正考核试卷及答案
- 铁合金炉外法冶炼工工艺考核试卷及答案
- 电解液制作工岗位操作技能考核试卷及答案
- 医院检验科质量手册
- 小学数学课标培训课件:“数与代数”版块内容分析及教学建议
- 东方插花-盘插(花艺及插花技能)
- 教育行政学课件
- 30题工程造价岗位常见面试问题含HR问题考察点及参考回答
- 安全挂梯施工方案
- 产品研发管理手册:免修版模板范本
- 高速铁路接触网运行维修规则
- 易制爆化学品危险物品单位治安防范情况检查评估表
- 【高中班会】鸣警钟勿忘国耻+悼先烈砥砺前行+课件+高一上学期爱国主义教育主题班会
- 资源调查与评价-课件
评论
0/150
提交评论