网络爬虫需求分析:获取一个指定URI下的所有的同域名下的所有的子URI

666B 发布于 2014/04/23 10:52
阅读 1K+
收藏 2
功能描述:

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

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

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

以下是问题补充:

@666B:要点提示: 从String中获取超链接的正则表达式是: “(<a[\\s+]*([^>h]|h(?!ref\b))*href[\\s+]*=[\\s+]*[('|\")]?)([^(\\s+|'|\")]*)([^>]*>)” (2014/04/23 11:00)
加载中
0
666B
666B

怎么就没有人回答??

0
666B
666B


那我自己先写点:

获取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;
		}

	}




0
666B
666B


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;

	}



功能不全,仅供参考


0
666B
666B


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


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


0
红薯说愿闻其翔
红薯说愿闻其翔
不算难吧,抓取后正则表达式?
返回顶部
顶部