6
回答
网络爬虫需求分析:获取一个指定URI下的所有的同域名下的所有的子URI
终于搞明白,存储TCO原来是这样算的>>>   
功能描述:

获取一个指定URI下的所有的同域名下的所有的子URI

功能分解:
1、获取uri响应回的内容即html源代码: HTML getHTMLFromURI(uti)
2、从html源代码中提取uri : uris getURISFromHTML(html)
3、将该uri下的所有的子uri提取出来

看看你的实现过程,练练手吧,不限语言!!

<无标签>
举报
666B
发帖于3年前 6回/1K+阅

以下是问题补充:

  • @666B :要点提示: 从String中获取超链接的正则表达式是: “(<a[\\s+]*([^>h]|h(?!ref\b))*href[\\s+]*=[\\s+]*[('|\")]?)([^(\\s+|'|\")]*)([^>]*>)” (3年前)
共有6个答案 最后回答: 3年前


那我自己先写点:

获取uri响应回的内容即html源代码

public  String GetHTMLFromURI(String url, String param) {
		//21从你的url中取吧
		String domain = url.substring(0, 21);
		//获取同一域名下的html文件,外部链接的就不获取了,你懂的!
		if ("http://www.XXX.com".equals(domain)) {
			StringBuffer result = new StringBuffer();
			BufferedReader in = null;
			String html = null;
			RandomAccessFile afile = null;
			try {
				String urlName = url + "?" + param;
				URL realUrl = new URL(urlName);
				URLConnection conn = realUrl.openConnection();
				conn.setRequestProperty("accept", "*/*");
				conn.setRequestProperty("connection", "Keep-Alive");
				conn.setRequestProperty(
						"user-agent",
						"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.154 Safari/537.36");
				conn.connect();
				in = new BufferedReader(new InputStreamReader(
						conn.getInputStream()));
				String line;
				while ((line = in.readLine()) != null) {
					result.append(line);
				}
				html = new String(result);

			} catch (MalformedURLException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} finally {

				try {
					if (in != null) {
						in.close();
					}
				} catch (IOException e) {
					e.printStackTrace();
				}
			}

			return html;
		} else {
			return null;
		}

	}





html源代码中提取uri

public HashSet<String> getURIFromString(String html) {
		HashSet<String> uris = new HashSet<String>();
		if (html != null) {
			// 字符串的类型:<a href=""></a>
			// 正则表达式:
			// Pattern apattern = Pattern
			// .compile("(?is)(?<URL><a\\s*href=\"[^\"]*\"[^>]*>.*?</a>)");
			Pattern apattern = Pattern
					.compile("(<a[\\s+]*([^>h]|h(?!ref\b))*href[\\s+]*=[\\s+]*[('|\")]?)([^(\\s+|'|\")]*)([^>]*>)");

			Matcher matcher = apattern.matcher(html);
			// 如果找到了超链接的话,就递归调用
			while (matcher.find()) {
				// System.out.println(matcher.group());
				//这里会用到一个jar包:jsoup-1.7.3.jar 来从String 中提取href=""中的值
				Document doc = Jsoup.parseBodyFragment(matcher.group());
				Elements achors = doc.select("a");
				Element a = achors.first();
				String href = a.attr("href");

				//约定:该url所对应的网站的链接是采用相对路径的,也就是没有域名的,以下情况不全,请自行考虑
				if (href.startsWith("tel:")) {//

				} else if (href.startsWith("http://")) {//别的域名的超链接

				} else if (href.contains("javascript:void(0)")) {//<a href="javscript:void(0)"></a>

				} else if (href.contains("history.go(-1);")) {//...

				} else {
					// 当是该域名下的链接时,就递归调用
					String href2 = "http://www.XXX.com" + href;
					// getURIFromString(GetDataFromURL.sendGet(href2, null));
					if (!uris.contains(href2)) {
						uris.add(href2);
					}

				}
			}
		}
		return uris;

	}



功能不全,仅供参考



接下来就是就是将从指定的url中提取出所有的链接


如上图所示,现在的问题是遍历并将其保存,现在还没有实现出来,好有点小问题,实现后了再贴代码


顶部