用HttpClient抓取人人网高校数据库(省,高校,院系三级级联)--更新1

2023-11-02

更新备注:将src文件改成了一个完整的项目,解压后可以直接导入到Eclipse中去,省去大家配置(项目乱码请改项目属性为GBK)。另外,如果你要登陆人人网 的话,需要申请一个人人网账号。这里提供公用的:\

lei.d0809@gmail.com

java123456

请自行修改RenRenNotify.java 对应的东西。


       首先文章有点长,需要点耐心。这里我是一步一步的做的。。。。比较的细,如果你是代码达人,那你就直接下载代码吧。

      有人说图片看不清,我抱歉,第一次咱的图片不完美,你把图片在浏览器上拖动到新窗口,就可以看到你大图了。

 

 


       需求来源,最近学校的课程项目需要一个省,高校,院系的三级级联的东西,这下麻烦了。全国那么多的高校,而且每一个高校的院系设置又不一样,我们小组只有六个人,而且技术都不咋地,要统计那么多的数据,我们估计这学期就别想完成这个项目了。但是我们知道人人网,开心网,腾讯微博上都要高校的数据库,于是想法就产生了:

     1.要么咱拼人品让他们的技术人员给我们他们的数据库,想法是好的,但是人家不肯呀

     2.要么咱通过某种手段获取他们的数据

今天,咱选择第二种。用到工具有:

EditPlus:小巧好用的文本编辑器,是超越的文本编辑器,不解释,用了就知道

Apanta:这个强烈推荐,用它来写Html,Javascript,Css感觉非常好,而且支持各种各样的Javascript的库,如:

               Jquery,但是我想把他集成到MyEclipse上去,出了一点问题,遗憾,弄的我只能同时开启两个。

HttpAnalyzer:这个是用来抓包用的,无论什么包统统抓,不过只能抓Http协议的包,当年傻,分析飞信协议的时候,

                用这个抓,结果只抓了一点东西。如果你想抓取更底层的推荐一个:WireShark,免费的好用的。

MyEclipse:这个不多说了,弄过J2EE的应该都知道的。

另外就是第三Jar包了,HttpClient 4.01 请到:http://hc.apache.org/downloads.cgi 下载,只要是4版本上的都应该可以,如果是3.1版本的估计你要重新写一些代码,因为4较3还是有很大的改进的。

 

      一般来说,一个网站对访问它内部的东西需要权限的验证的,比如你下载某个网站的东西,他会提示说 只有会员才可以下载,于是乎,这里存在一个session,保存了你的登陆信息也就是你的访问网站内部资源的权限了。人人网估计也不是省油的灯(这里有问题,后面解释),于是我们应该登陆它才能获得访问它内部资源的权限。那么我们首先来抓包分析应该怎么用登陆,于是HttpAnalyzer闪亮登场.

打开HttpAnalyzer,让他开始工作,我们打开浏览器,输入renren.com。第一次咱先不急着登陆。我们随便输入一个账号密码看看:

 

 

 

      我们看到当你输入用户名密码后就将你输入的东西post到:http://www.renren.com/PLogin.do,

其中PostData有四个:email,password,origURL,domain。至于后面的数据是我们刚刚在登陆页面上填写的数据。

我们再来看看它登陆页面的源代码:

 

 

      注意我红色标注的地方:我们注意到,除了我们刚刚在上面发送的数据还有其他的隐藏发送的的东西:例如:origURL等等,这里他们是<input type="hidden" />,应该说在form里面的input都应该发送过去,但是这里他只发送了四个。

既然postdata只有那么四个参数,那我们就姑且只用那个四个东西好了。

所以我们用HttpClient构造请求的时候,就应该将这四个参数的给附带进去,部分代码如下:

Java代码   收藏代码
  1. // 将要发送的数据封包  
  2.   List<NameValuePair> params = new ArrayList<NameValuePair>();  
  3.   params.add(new BasicNameValuePair("email"this.email));  
  4.   params.add(new BasicNameValuePair("password"this.password));  
  5.   params.add(new BasicNameValuePair("origURL", origURL));  
  6.   params.add(new BasicNameValuePair("domain", domain));  

 

接下来我们来完整登陆一次:

当输入正确的用户名密码,点击登陆,我们又获得什么样的东西呢?参见如下:

 

 

返回的内容意思大概是 地址转变了要进行跳转,而且返回的相应头是 302,文件修改了。再看一下 返回的消息头:

 

 

       有一个Location,应该是要我们跳转的地址。这样我们应该可以访问人人网的任意连接资源了。

 

登录过程的完整代码(包含读嗅探指定资源的链接):

 

Java代码   收藏代码
  1. import java.io.IOException;  
  2. import java.io.UnsupportedEncodingException;  
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. import org.apache.http.HttpResponse;  
  7. import org.apache.http.NameValuePair;  
  8. import org.apache.http.client.ClientProtocolException;  
  9. import org.apache.http.client.ResponseHandler;  
  10. import org.apache.http.client.entity.UrlEncodedFormEntity;  
  11. import org.apache.http.client.methods.HttpGet;  
  12. import org.apache.http.client.methods.HttpPost;  
  13. import org.apache.http.impl.client.BasicResponseHandler;  
  14. import org.apache.http.impl.client.DefaultHttpClient;  
  15. import org.apache.http.message.BasicNameValuePair;  
  16. import org.apache.http.protocol.HTTP;  
  17.   
  18. /** 
  19.  *  
  20.  *  
  21.  * Author : Saitkey < lei_d@foxmail.com > 
  22.  */  
  23. public class RenRenNotify {  
  24.     private static HttpResponse response;  
  25.     private static DefaultHttpClient httpClient;  
  26.   
  27.     public RenRenNotify(String userName, String password) {  
  28.         this.httpClient = new DefaultHttpClient();  
  29.         String loginForm = "http://www.renren.com/PLogin.do";  
  30.         String origURL = "http://www.renren.com/Home.do";  
  31.         String domain = "renren.com";  
  32.         // 在首页表单上是隐藏的 抓包后分析,并没有发送到服务器  
  33.         // String autoLogin = "true";  
  34.         // 构造一个POST请求,利用Httclient提供的包  
  35.         HttpPost httpPost = new HttpPost(loginForm);  
  36.         // 将要发送的数据封包  
  37.         List<NameValuePair> params = new ArrayList<NameValuePair>();  
  38.         params.add(new BasicNameValuePair("email", userName));  
  39.         params.add(new BasicNameValuePair("password", password));  
  40.         params.add(new BasicNameValuePair("origURL", origURL));  
  41.         params.add(new BasicNameValuePair("domain", domain));  
  42.   
  43.         // 封包添加到Post请求  
  44.         try {  
  45.             httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));  
  46.         } catch (UnsupportedEncodingException e1) {  
  47.             // TODO Auto-generated catch block  
  48.             e1.printStackTrace();  
  49.         }  
  50.         // 将 get 和post 方法包含到一个函数里面去,这里就是登陆过程了。  
  51.         response = postMethod(httpPost);  
  52.         /* 
  53.          * 有跳转 System.out.println(response.getStatusLine());//返回302 
  54.          * Header[]headers=response.getAllHeaders(); for (int i = 0; i < 
  55.          * headers.length; i++) { Header header = headers[i]; 
  56.          * System.out.println(header.getName()+": "+header.getValue()); } 
  57.          */  
  58.         // 读取跳转的地址  
  59.         // String redirectUrl = response.getFirstHeader("Location").getValue();  
  60.         // 查看一下跳转过后,都出现哪些内容.  
  61.         // response=getMethod(redirectUrl);//函数见后面  
  62.         // System.out.println(response.getStatusLine()); // HTTP/1.1 200 OK  
  63.   
  64.         // 读取一下主页都有什么内容 已经登陆进去  
  65.         // System.out.println(readHtml("http://www.renren.com/home"));  
  66.     }  
  67.   
  68.     // 嗅探指定页面的代码  
  69.     public String notify(String url) {  
  70.         HttpGet get = new HttpGet(url);  
  71.         ResponseHandler<String> responseHandler = new BasicResponseHandler();  
  72.         String txt = null;  
  73.         try {  
  74.             txt = httpClient.execute(get, responseHandler);  
  75.         } catch (ClientProtocolException e) {  
  76.             e.printStackTrace();  
  77.         } catch (IOException e) {  
  78.             e.printStackTrace();  
  79.         } finally {  
  80.             get.abort();  
  81.         }  
  82.         return txt;  
  83.     }  
  84.   
  85.     // 用post方法向服务器请求 并获得响应,因为post方法要封装参数,因此在函数外部封装好传参  
  86.     public HttpResponse postMethod(HttpPost post) {  
  87.         HttpResponse resp = null;  
  88.         try {  
  89.             resp = httpClient.execute(post);  
  90.         } catch (ClientProtocolException e) {  
  91.             e.printStackTrace();  
  92.         } catch (IOException e) {  
  93.             e.printStackTrace();  
  94.         } finally {  
  95.             post.abort();  
  96.         }  
  97.         return resp;  
  98.     }  
  99.   
  100.     // 用get方法向服务器请求 并获得响应  
  101.     public HttpResponse getMethod(String url) {  
  102.         HttpGet get = new HttpGet(url);  
  103.         HttpResponse resp = null;  
  104.         try {  
  105.             resp = httpClient.execute(get);  
  106.         } catch (ClientProtocolException e) {  
  107.             e.printStackTrace();  
  108.         } catch (IOException e) {  
  109.             e.printStackTrace();  
  110.         } finally {  
  111.             get.abort();  
  112.         }  
  113.         return resp;  
  114.     }  
  115.   
  116.     public static void main(String[] args) {  
  117.         RenRenNotify notify = new RenRenNotify("[你的用户名]",  
  118.                 "[你的密码]");  
  119.         System.out.println(notify  
  120.                 .notify("http://www.renren.com/home"));  
  121.     }  
  122.   
  123. }  

 

 

        好了,现在登录了。我们去修改自己的教育信息吧,首先自然是进入相应的页面:

 

       当我们进入了修改教育信息的时候,我们发现HttpAnalyzer里面多了如下内容:

 

 

 

   注意红色的内容。这里应该是所有高校的信息。体积也达到了402kb,看一下里面的内容:

 

 

 

        这个里面有个奇怪的东西:\u4e2d\u56fd 这个是 “中国”的意思,经过转码了。用JavaScript 直接 alert('u4e2d\u56fd '),就明了了。

        对于一长串的字符,可以用下面的代码进行回来(code是源):

 

 

Java代码   收藏代码
  1. StringBuffer sb = new StringBuffer(code);  
  2. int pos;  
  3. while ((pos = sb.indexOf("\\u")) > -1) {  
  4.     String tmp = sb.substring(pos, pos + 6);  
  5.     sb.replace(pos, pos + 6, Character.toString((char) Integer  
  6.             .parseInt(tmp.substring(2), 16)));  
  7. }  
  8. code = sb.toString();  

 

 接下来,我们选择一个高校看看,HttpAnalyzer里面出现如下的信息:

 

 

 

 

再来一下:

 

 

 

 

       所以通过上面两次抓取,我们应该得出一个例子,那就是:我们选择好了一个大学,就会相应的得出他的ID,然后这时候会想服务器发送一个请求查询:http://www.renren.com/GetDep.do?id=13003 ,其中id后面的便是高校的代号了。然后返回的是一串html代码,如下:

 

 

 

         这里同样是奇怪的一串数字,这种也是Unicode,不过是十进制的,而且在编码的前后分别加上“&#”和“;”就可以形成Html实体字符,可以在网页上直接显示。

 

 

对于以上的代码,我们也参照上面写一个转换的代码:如下:

 

Java代码   收藏代码
  1. StringBuffer sb=new StringBuffer(code);  
  2. int pos;  
  3. while ((pos=sb.indexOf("&#"))>-1) {  
  4.     String tmp=sb.substring(pos+2, pos+7);  
  5.     sb.replace(pos, pos+8, Character.toString((char)Integer.parseInt(tmp,10)));  
  6. }  
  7. code=sb.toString();  

 

        写到这里,我们的工作也做了一大半了。于是乎,我这里不得不跟大家陈清一个事实,获得

http://s.xnimg.cn/a13819/allunivlist.js

http://www.renren.com/GetDep.do?id=13003

的页面代码,人人网是没有设置 session的权限认证的。直接可以读不信你可以点击上面的两个地址,你就发现,原来可以直接读取的。

 

       也就是说。我们可以另辟路径,不用通过HttpClient去登陆一下在取得数据,这一点很不好意思。我刚开始没有意识到。不过,这里你也还是学会了一种登陆一个服务器的办法,说不定以后你会用到呢。

 

 

好了,下面我们开始另一种方法。

       首先,我们对获取http://s.xnimg.cn/a13819/allunivlist.js的数据进行分析一下:

var allUnivList = [{"id":"00","univs":"","name":"\u4e2d\u56fd","provs":[{............."country_id":0,"name":"\u53f0\u6e7e"}]},{"id":"01","univs"...................

这样的数据类型。我想做过ajax的都知道是json类型的。 但是这里我要用Java的正则表达式进行解析。

 

首先分析数据结构:

[{国家:[{省市区[{高校S}],......}],....},....] 大概就是这样的结构 其中....表示可能有多个 同级机构。如 安徽省呵北京市, 而在北京市下有 清华大学和北京大学 是同级的。以此类推啦。

 

我只需要中国的的大学,所以我首先选出中国这块的数据:用到的正则表达式是:"\"provs\":(.*?)]}"

这里主要对比 在台湾省结束的时候,有]}标志,而且在前面并没有出现,而且用非贪婪模式去批判就能保证是中国的高校了。如图

 

 

取得了中国部分,接下来对中国的省市区进行解析了,同样,我们看到:

[{"id":"00",............"country_id":0,"name":"..........."},这样的结构

 

所以对每一个省我们可以分析到如下的正则表达式:id\":(.*?),\"univs\":(.*?),\"country_id\":0,\"name\":\"(.*?)\"}

       然后对 中国这部分进行一个循环,就可以得到中国所有的省市区了,同样我们对每一个省市,要对他们包含的高校进行选择:

 

       我们很容易就可以看到高校的 结构应该是:{"id":1001,"name":"\u6e05\u534e\u5927\u5b66"} 类似,那么正则表达式应该是:"id\":(.*?),\"name\":\"(.*?)\"";

 

       对于每一个高校,我们可以类似于省市那样处理,用循环匹配,就可以得到这个省市的所以高校。但是对于每一个高校。我们要还需要获得他的院系信息。前文跟大家分分析了,院系信息是通过http://www.renren.com/GetDep.do?id=xxxx来动态获取(xxx代表高校的编号),那么我们在抓取高校的时候,顺带也将他们的院系信息获取了。

写了这么多,咱直接上代码:

      你也可以选择下载下面的代码。里面有一些必要的文件已经jar包,需要自己配置一下。如果不会,请留言吧,我争取重新打包再上传上来。

 

Java代码   收藏代码
  1. import java.io.File;  
  2. import java.io.IOException;  
  3. import java.io.PrintStream;  
  4. import java.util.regex.Matcher;  
  5. import java.util.regex.Pattern;  
  6.   
  7. import org.apache.http.client.ClientProtocolException;  
  8. import org.apache.http.client.HttpClient;  
  9. import org.apache.http.client.ResponseHandler;  
  10. import org.apache.http.client.methods.HttpGet;  
  11. import org.apache.http.impl.client.BasicResponseHandler;  
  12. import org.apache.http.impl.client.DefaultHttpClient;  
  13.   
  14. /** 
  15.  *  
  16.  *  
  17.  * Author : Saitkey < lei_d@foxmail.com > 
  18.  */  
  19. public class GenerateSQL {  
  20.     // 构建省的sql文件  
  21.     private File province = new File("provice.sql");  
  22.     // 构建高校的sql文件  
  23.     private File college = new File("college.sql");  
  24.     // 构建院系的sql文件  
  25.     private File department = new File("department.sql");  
  26.   
  27.     GenerateSQL() throws ClientProtocolException, IOException {  
  28.         HttpClient client = new DefaultHttpClient();  
  29.         ResponseHandler<String> responseHandler = new BasicResponseHandler();  
  30.         String depUrl = "http://www.renren.com/GetDep.do?id=";  
  31.         String allunivs = "http://s.xnimg.cn/a13819/allunivlist.js";  
  32.         HttpGet get = new HttpGet(allunivs);  
  33.         System.out.println("读取高校信息...");  
  34.         StringBuffer sb = new StringBuffer(client.execute(get, responseHandler));  
  35.         System.out.println("读取完成...");  
  36.   
  37.         // 对获取的字符串进行处理截取从"provs":到}]},{"id":"01"部分  
  38.         String alluinvRegex = "\"provs\":(.*?)]}";  
  39.         Pattern pattern = Pattern.compile(alluinvRegex);  
  40.         String chn = "";  
  41.         Matcher matcher = pattern.matcher(sb.toString());  
  42.         matcher.find();  
  43.         chn = matcher.group(1);  
  44.         // System.out.println(convertFromHex(tmp));  
  45.   
  46.         // 对截取的中国部分按照省市区进行匹配"id":1,"univs" ...... "country_id":0,"name":"台湾"  
  47.         String regex2 = "id\":(.*?),\"univs\":(.*?),\"country_id\":0,\"name\":\"(.*?)\"}";  
  48.         Pattern pattern2 = Pattern.compile(regex2);  
  49.         Matcher matcher2 = pattern2.matcher(chn);  
  50.         StringBuilder provsBuilder = new StringBuilder();  
  51.         StringBuilder colBuilder = new StringBuilder();  
  52.         StringBuilder deparBuilder = new StringBuilder();  
  53.         while (matcher2.find()) {  
  54.             // 我们项目的sql语句,如果你们数据库不一样,稍微修改一下拉  
  55.             provsBuilder.append("insert into province(PROID,PRONAME)values('"  
  56.                     + matcher2.group(1) + "','"  
  57.                     + convertFromHex(matcher2.group(3)) + "');\n");  
  58.             System.out.println("生成-" + convertFromHex(matcher2.group(3))  
  59.                     + "-数据库");  
  60.             // 取得学校的ID,还有名字 "id":1001,"name":"\u6e05\u534e\u5927\u5b66"  
  61.             String colRegex = "id\":(.*?),\"name\":\"(.*?)\"";  
  62.             Pattern colPattern = Pattern.compile(colRegex);  
  63.             Matcher colMatcher = colPattern.matcher(matcher2.group(2));  
  64.             while (colMatcher.find()) {  
  65.                 colBuilder  
  66.                         .append("insert into COLLEGE(PROID,COLID,COLNAME)values('"  
  67.                                 + matcher2.group(1)  
  68.                                 + "','"  
  69.                                 + colMatcher.group(1)  
  70.                                 + "','"  
  71.                                 + convertFromHex(colMatcher.group(2)) + "');\n");  
  72.   
  73.                 System.out.println("生成-" + convertFromHex(colMatcher.group(2))  
  74.                         + "-数据库");  
  75.   
  76.                 get = new HttpGet(depUrl + colMatcher.group(1));  
  77.                 ResponseHandler<String> depHandler = new BasicResponseHandler();  
  78.                 generateDepartment(client.execute(get, depHandler), colMatcher  
  79.                         .group(1), deparBuilder);  
  80.             }  
  81.   
  82.         }  
  83.         PrintStream ps = new PrintStream(province);  
  84.         ps.print(provsBuilder.toString());  
  85.         ps.close();  
  86.   
  87.         PrintStream ps2 = new PrintStream(college);  
  88.         ps2.print(colBuilder.toString());  
  89.         ps2.close();  
  90.   
  91.         PrintStream ps3 = new PrintStream(department);  
  92.         ps3.print(deparBuilder.toString());  
  93.         ps3.close();  
  94.         System.err.println("\n\n\n完成数据库生成,请打开项目目录查看!");  
  95.     }  
  96.   
  97.     // 这个函数用来处理行查询到的高校院系 <option  
  98.     // value='&#20013;&#22269;&#35821;&#35328;&#25991;&#23398;&#23398;&#38498;'>&#20013;&#22269;&#35821;&#35328;&#25991;&#23398;&#23398;&#38498;</option>  
  99.     public void generateDepartment(String src, String colid, StringBuilder sb) {  
  100.         String departRegex = "value='(.+?)'>";// 开始用这个正则表达式"value='(.*?)'>";  
  101.         // 后来发现有问题,问题你自己探索吧。  
  102.         Pattern pattern = Pattern.compile(departRegex);  
  103.         Matcher matcher = pattern.matcher(src);  
  104.         while (matcher.find()) {  
  105.             sb.append("insert into DEPARTMENT(COLID,DEPNAME)values('" + colid  
  106.                     + "','" + convertFromDec(matcher.group(1)) + "');\n");  
  107.         }  
  108.     }  
  109.   
  110.     public static String convertDec(String src) {  
  111.         return Character.toString((char) Integer.parseInt(src, 10));  
  112.     }  
  113.   
  114.     public static String convertHex(String src) {  
  115.         return Character  
  116.                 .toString((char) Integer.parseInt(src.substring(2), 16));  
  117.     }  
  118.   
  119.     // 转换&#xxxxx;形式Unicode  
  120.     private String convertFromDec(String code) {  
  121.         StringBuffer sb = new StringBuffer(code);  
  122.         int startPos;  
  123.         int endPos;  
  124.         while ((startPos = sb.indexOf("&#")) > -1) {  
  125.             endPos = sb.indexOf(";");  
  126.             String tmp = sb.substring(startPos + 2, endPos);  
  127.             sb.replace(startPos, endPos + 1, Character.toString((char) Integer  
  128.                     .parseInt(tmp, 10)));  
  129.         }  
  130.         return code = sb.toString();  
  131.     }  
  132.   
  133.     // 转换16进制的Unicode,  
  134.     private String convertFromHex(String code) {  
  135.         StringBuffer sb = new StringBuffer(code);  
  136.         int pos;  
  137.         while ((pos = sb.indexOf("\\u")) > -1) {  
  138.             String tmp = sb.substring(pos, pos + 6);  
  139.             sb.replace(pos, pos + 6, Character.toString((char) Integer  
  140.                     .parseInt(tmp.substring(2), 16)));  
  141.         }  
  142.         return code = sb.toString();  
  143.     }  
  144.   
  145.     public static void main(String[] args) throws ClientProtocolException,  
  146.             IOException {  
  147.         new GenerateSQL();  
  148.     }  
  149. }  

 

      写到这里,基本上完成了高校数据库的抓取工作,现在只需要导入刚刚生成的sql文件就可以了。如果你想抓取其他的信息。原理也应该差不多的吧。只不过要看看他们有没有设置session 的权限认证了。如果有,那你得写一个登陆的东西获得那认证,前面也写了差不多。应该可以看懂的。感谢你花这么长的时间。

       至于标题的 省 高校 院系级联,好吧, 我骗你了。只不过今天就到此了,还有Asp.net的任务。有了数据库了,咱还怕写不出来那个级联么?各位看官,如果你要什么好的级联,可以分享一下吧。


原文地址:http://www.iteye.com/topic/826988




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用HttpClient抓取人人网高校数据库(省,高校,院系三级级联)--更新1 的相关文章

  • Java JNDI 名称 java:/

    我正在遵循教程 https docs oracle com javase tutorial jndi index html https docs oracle com javase tutorial jndi index html 我的冒险
  • 克隆 dom.Document 对象

    我的目的是将xml文件读入Dom对象 编辑dom对象 其中涉及删除一些节点 完成此操作后 我希望将 Dom 恢复到其原始状态 而不实际解析 XML 文件 无论如何 我可以克隆第一次解析 xml 文件后获得的 dom 对象吗 这个想法是避免一
  • java.time.LocalDate 到 java.util.Date

    转换的最佳方式是什么java time LocalDate to java util Date Date from dateToReturn atStartOfDay ZoneId systemDefault toInstant 我一直在尝
  • LibGDX 闪烁

    我已经使用 LibGDX UI 设置来启动一个项目 我在实现 ApplicationListener 中唯一拥有的是 public void create setScreen new LoadingScreen this 这应该会触发 Lo
  • 使用 javascript/jquery 检查 .css 样式表的名称

    我正在尝试为论坛制作一个小 chrome 扩展 但我只希望它在论坛的某个区域中工作 问题是我不能只做 matches subforum 因为该论坛中的线程无法通过 URL 区分它们所在的子论坛 subforum 有自己的 css 样式表 所
  • 如何在不使用反射的情况下查看对象是否是数组?

    在Java中如何在不使用反射的情况下查看对象是否是数组 如何在不使用反射的情况下迭代所有项目 我使用 Google GWT 所以不允许我使用反射 我很想在不使用反射的情况下实现以下方法 private boolean isArray fin
  • 如何使用jdbc驱动编写事务?

    我想使用 jdbc 编写一个事务java 我尝试过这个简单的交易 BEGIN TRANSACTION NL GO NL UPDATE table SET col test where id 1010 NL GO NL COMMIT 我尝试过
  • SQLiteAssetHelper 甚至在从资产文件夹复制数据库之前就导致立即崩溃

    https github com jgilfelt android sqlite asset helper https github com jgilfelt android sqlite asset helper 我要从SQLiteOpe
  • SQLite 64位整数在jooq中被识别为int

    我有一个与 jOOQ 一起使用的 SQLite 数据库 当我使用 jOOQ 的代码生成工具时 它会按预期构建所有表和记录类 然而 所有的 SQLiteINTEGER列变成java lang Integer生成的代码中的字段 问题是 SQLi
  • 如何在 Java 中读取/转换 InputStream 为字符串?

    如果你有一个java io InputStream对象 您应该如何处理该对象并生成一个String 假设我有一个InputStream包含文本数据 我想将其转换为String 例如我可以将其写入日志文件 最简单的方法是什么InputStre
  • 使用 Javascript 编辑和保存用户 HTML - 安全性如何?

    例如我有一个Javascript 支持的表单创建工具 您可以使用链接添加元素的 html 块 如输入字段 并使用 TinyMCE 来编辑文本 这些是通过自动保存功能保存的 该功能在特定事件的后台执行 AJAX 调用 被调用的保存函数负责数据
  • 使用 Jboss7 加载资源返回 null

    如何使用Jboss7 1从java代码中加载图像等资源 这曾经与 Jboss4 一起使用 this getClass getClassLoader getResourceAsStream myapp includes images imag
  • 当 javadoc 未附加到依赖项时,如何将 javadoc 引用到 Maven 的 eclipse 插件中的依赖项

    我在开发中使用 Eclipse Maven 和 Java 我使用 Maven 下载依赖项 jar 文件和 javadoc 如果可用 并使用 Maven 的 eclipse 插件为 Eclipse 生成 project 和 classpath
  • 如何在 iText 7 中创建页面大小不等的文档

    如何在 iText 7 中创建页面大小不等的文档 iText7 可以吗 在iText5中 我使用document setPageSize and document newPage 如果您通过高级 API 添加内容 Document add
  • 如何在 Spring GCP 中订阅多个 Google PubSub 项目?

    我想在 Spring Boot 应用程序中订阅多个 Google Cloud PubSub 项目 阅读完相关问题后如何使用 Spring Cloud 在一个 Spring Boot 应用程序中连接 配置两个 pubsub gcp 项目 ht
  • 如何强制 Spark 执行代码?

    我如何强制 Spark 执行对 map 的调用 即使它认为由于其惰性求值而不需要执行它 我试过把cache 与地图调用 但这仍然没有解决问题 我的地图方法实际上将结果上传到 HDFS 所以 它并非无用 但 Spark 认为它是无用的 简短回
  • 我的代码线程不安全吗?

    我编写了代码来理解 CyclicBarrier 我的应用程序模拟选举 每轮选出得票少的候选人 该候选人从竞争中淘汰以获得胜利 source class ElectoralCommission public volatile boolean
  • 使用 System.out.println 显示特殊字符

    我在将带有特殊字符的文本从网络服务发送或显示到数据库时遇到问题 在我的 Eclipse 上 我已将字符编码设置为 UTF 8 但它仍然不允许我显示字符 例如 像下面的代码一样简单的打印 String test System out prin
  • FocusEvent 没有获取 JFormattedTextField 的最后一个值,我如何获取它?

    我有两个JFormattedTextField我的物体JFrame目的 我想要通过这些值进行基本数学 加法 JFormattedTextField对象 我希望当焦点丢失第一个或第二个文本字段时发生这种情况 但当 focusLost 事件没有
  • 如何在没有消息时隐藏 Bootstrap 警报框

    我用 Bootstrap 做了一个简单的警报框 如下所示 div class alertBox span class alert alert info bag session username span div When there is

随机推荐

  • 怎样用Excel搜索表格内的内容?

    工具 材料 excel表格 1 首先在桌面上找到excel表格 并点击打开此表格 2 进入表格之后 点击表格左上角箭头指向的位置 将整个表格选中 3 然后ctrl f快捷键 将查找和替换功能窗口唤出 4 接着在查找内容的方框里输入需要查找的
  • 百度云智大会:科技与创新的交汇点

    这次的百度云智大会 可谓是亮点云集 发布了包含42个大模型 41个数据集 10个精选应用范式的全新升级千帆大模型平台2 0 发布首个大模型生态伙伴计划 而且也预告了文心大模型4 0的发布 大模型服务的成绩单也非常秀 月活企业数已近万家 覆盖
  • CUDA下载与对应版本查询

    文章目录 1 算力 CUDA Driver Version CUDA Runtime Version 2 显卡型号 3 实操 4 镜像 1 算力 CUDA Driver Version CUDA Runtime Version 比如说我们进
  • pythonmail添加附件_python3 发送邮件添加附件

    from email header import Header from email mime application import MIMEApplication from email mime multipart import MIME
  • 命令行编译WCE6.0 BSP 中 Private目录下的工程

    转载请标明是引用于 http blog csdn net chenyujing1234 参考文章 http social msdn microsoft com Forums en US windowsmobiledev thread 672
  • 漏洞复现之CVE-2015-1635-HTTP.SYS远程执行代码漏洞(ms15-034)

    1 1 1 漏洞描述 在2015年4月安全补丁日 微软发布的众多安全更新中 修复了HTTP sys中一处允许远程执行代码漏洞 编号为 CVE 2015 1635 MS15 034 利用HTTP sys的安全漏洞 攻击者只需要发送恶意的htt
  • 如何判断代码的好坏

    对于代码好坏的判断 是需要一定的标准来衡量 比如可读性 可维护性 可拓展性 简洁性等等 好的代码 无论是对于代码开发者来说 还是对于设备维护者来说都是赏心悦目的 而坏的代码则是让人一头雾水 心生胆怯 甚至在开发和维护阶段 因为修改或者重构代
  • select 语句中 if 的用法

    IF expr1 expr2 expr3 expr1 的值为 TRUE 则返回值为 expr2 expr1 的值为FALSE 则返回值为 expr3 例 SELECT IF TRUE 1 1 1 2 gt 2 SELECT IF FALSE
  • Oracle 高水位(watermark)实验

    oracle 中的高水位标记是 oracle table 中使用的术语 用于显示在 oracle table 的生命周期中曾经使用过的块 当您从表中删除行时 HWM 下面的块可能会变为空 但高水位标记将保持原样 假设您加载了 100 万行的
  • Hololens2开发笔记-Unity项目获取IMU传感器数据

    文章目录 前言 环境 使用指南 运行结果 前言 在仔细捣鼓了 HoloLens2 研究模式的 API 文档后 借鉴了官方案例 SensorVisualization 和这位哥们的代码 HoloLens2 Unity ResearchMode
  • 记一次初学者的spring boot 打包部署

    作为一个前端程序员 好不容易用第一次使用spring boot 写了一个项目 idea里面运行的ok 心里暗自窃喜 但是没想到打包就出现问题 折腾了一天 现在总结一下 先看一下我的项目的结构 这是我的项目 主项目是一个spring boot
  • Java web编写的学生作业管理系统 课程设计 功能齐全、界面漂亮

    8月份由于公司的事情太多 基本上没有更新博客信息 今天稍微空了点 继续为为大家介绍Java web项目 今天要介绍的是一个Java web编写的学生作业管理系统 学生作业管理系统有三种用户类型 学生 老师 系统管理员 学生的主要功能包括 查
  • 多态的定义以及使用

    多态的定义以及使用 package Demo08 代码当中体现多态性 其实就是一句话 父类引用指向子类对象 什么叫多态 左父右子就叫多态 可以通过创建一个对象来调用父类和子类两个 格式 父类名称 对象名 new 子类名称 或者 接口名称 对
  • 区块链二级知识考试

    区块链基础知识二级考试 考试时间30分钟 总分100分 请认真作答 出题人及监考老师 高志豪 请转载者注明 谢谢支持 一 单选题 每题5分 共30分 1 中本聪是哪里人 A 中国人 B 美国人 C 日本人 D 不确定 2 下面哪种共识机制效
  • WPF DataGrid 导出Excel

    region Excel导出 private void btnExportExcel Click object sender RoutedEventArgs e Export this dgvList XX信息查询列表 public voi
  • STM32 F1,F4,CAN多字节发送和接收

    一 简介 CAN的基础知识在这里不做过多介绍 其他网站上讲解的很基础 因为CAN一次性只能接收1字节8位 所以在这里只介绍怎样让CAN能像串口那样一次性接收非常多的位 亲测有效 具体先看效果图 在这里我的实现是通过两块STM32板子 可以是
  • 【mac】mac鼠标指针跟随很慢的问题

    使用时感觉鼠标指针跟随太慢 在系统偏好设置里面将鼠标跟随速度调到最大 还是感觉很慢 后来在网上找到了一个通过命令行改全局配置的方式调快跟随速度 具体方法如下 可以先查看一下当前值 打开终端 输入命令 lcc localhost defaul
  • html的实体字符,h5展示特殊符号<>

    前言 在 HTML 中 某些字符是预留的 不能使用小于号 lt 和大于号 gt 这是因为浏览器会误认为它们是标签 比如 这样是不行的 p lt p 比如用实体字符 p lt p HTML 中有用的字符实体 注释 实体名称对大小写敏感 显示结
  • 单链表的创建、单链表的删除、单链表的插入(数据结构)

    1 创建一个超级简单的单链表 include
  • 用HttpClient抓取人人网高校数据库(省,高校,院系三级级联)--更新1

    更新备注 将src文件改成了一个完整的项目 解压后可以直接导入到Eclipse中去 省去大家配置 项目乱码请改项目属性为GBK 另外 如果你要登陆人人网 的话 需要申请一个人人网账号 这里提供公用的 lei d0809 gmail com