java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台(即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se))的总称。
本文主要介绍了 java 利用 url 实现网页内容抓取的示例。具有很好的参考价值。下面跟着小编一起来看下吧
闲来无事,刚学会把 git 部署到远程服务器,没事做,所以简单做了一个抓取网页信息的小工具,里面的一些数值如果设成参数的话可能扩展性能会更好!希望这是一个好的开始把,也让我对字符串的读取掌握的更加熟练了,值得注意的是 JAVA1.8 里面在使用 String 拼接字符串的时候,会自动把你要拼接的字符串用 StringBulider 来处理,大大优化了 String 的性能,闲话不多说,show my XXX code~
运行效果:
首先打开百度百科,搜索词条,比如 "演员",再按 F12 查看源码
然后抓取你想要的标签,注入 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;
- }
- }
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持 PHPERZ!
来源: http://www.phperz.com/article/17/1220/358023.html