欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

java利用url实现网页内容的抓取

程序员文章站 2024-03-04 10:55:05
闲来无事,刚学会把git部署到远程服务器,没事做,所以简单做了一个抓取网页信息的小工具,里面的一些数值如果设成参数的话可能扩展性能会更好!希望这是一个好的开始把,也让我对字...

闲来无事,刚学会把git部署到远程服务器,没事做,所以简单做了一个抓取网页信息的小工具,里面的一些数值如果设成参数的话可能扩展性能会更好!希望这是一个好的开始把,也让我对字符串的读取掌握的更加熟练了,值得注意的是java1.8 里面在使用string拼接字符串的时候,会自动把你要拼接的字符串用stringbulider来处理,大大优化了string 的性能,闲话不多说,show my xxx code~

运行效果:

java利用url实现网页内容的抓取

首先打开百度百科,搜索词条,比如“演员”,再按f12查看源码

java利用url实现网页内容的抓取

然后抓取你想要的标签,注入linkedhashmap里面就ok了,很简单是吧!看看代码罗

import java.io.bufferedreader;
import java.io.ioexception;
import java.io.inputstreamreader;
import java.net.httpurlconnection;
import java.net.url;
import java.util.*;
/**
 * created by chunmiao on 17-3-10.
 */
public class readbaidusearch {
 //储存返回结果
 private linkedhashmap<string,string> mapofbaike;
 //获取搜索信息
 public linkedhashmap<string,string> getinfomationofbaike(string infomationwords) throws ioexception {
  mapofbaike = getresult(infomationwords);
  return mapofbaike;
 }
 //通过网络链接获取信息
 private static linkedhashmap<string, string> getresult(string keywords) throws ioexception {
  //搜索的url
  string keyurl = "http://baike.baidu.com/search?word=" + keywords;
  //搜索词条的节点
  string startnode = "<dl class=\"search-list\">";
  //词条的链接关键字
  string keyofhref = "href=\"";
  //词条的标题关键字
  string keyoftitle = "target=\"_blank\">";
  string endnode = "</dl>";
  boolean isnode = false;
  string title;
  string href;
  string rline;
  linkedhashmap<string,string> keymap = new linkedhashmap<string,string>();
  //开始网络请求
  url url = new url(keyurl);
  httpurlconnection urlconnection = (httpurlconnection) url.openconnection();
  inputstreamreader inputstreamreader = new inputstreamreader(urlconnection.getinputstream(),"utf-8");
  bufferedreader bufferedreader = new bufferedreader(inputstreamreader);
  //读取网页内容
  while ((rline = bufferedreader.readline()) != null){
   //判断目标节点是否出现
   if(rline.contains(startnode)){
    isnode = true;
   }
   //若目标节点出现,则开始抓取数据
   if (isnode){
    //若目标结束节点出现,则结束读取,节省读取时间
    if (rline.contains(endnode)) {
     //关闭读取流
     bufferedreader.close();
     inputstreamreader.close();
     break;
    }
    //若值为空则不读取
    if (((title = getname(rline,keyoftitle)) != "") && ((href = gethref(rline,keyofhref)) != "")){
     keymap.put(title,href);
    }
   }
  }
  return keymap;
 }
 //获取词条对应的url
 private static string gethref(string rline,string keyofhref){
  string baikeurl = "http://baike.baidu.com";
  string result = "";
  if(rline.contains(keyofhref)){
   //获取url
   for (int j = rline.indexof(keyofhref) + keyofhref.length();j < rline.length()&&(rline.charat(j) != '\"');j ++){
    result += rline.charat(j);
   }
   //获取的url中可能不含baikeurl,如果没有则在头部添加一个
   if(!result.contains(baikeurl)){
    result = baikeurl + result;
   }
  }
  return result;
 }
 //获取词条对应的名称
 private static string getname(string rline,string keyoftitle){
  string result = "";
  //获取标题内容
  if(rline.contains(keyoftitle)){
   result = rline.substring(rline.indexof(keyoftitle) + keyoftitle.length(),rline.length());
   //将标题中的内容含有的标签去掉
   result = result.replaceall("<em>|</em>|</a>|<a>","");
  }
  return result;
 }
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!