webcrawler 网页爬虫

Life is short , play more!
本文来自lihao's Blog,转载请注明。

想实现一个简单的网页爬虫, 利用selenium(htmlunit), 可以解析javascript. (本以为selenium 2.0 也就是webdriver ,非调用浏览器的api则底层实际使用了htmlunit, 可以解析javascript,但经过尝试没有成功, 如果有读者有高见请赐教。  所以本人之后直接使用htmlunit了。)

大概的流程(已经搜索过url仍未进行比对剔除) .

代码已经做了优化,最新的内容请点击webcrawler-网页爬虫(二)

=================以下陈旧代码已经废弃==========================
初始网页, 目标深度 , 当达到了目标深度后, 不再继续深度爬.

4个类.

SplitToLines

该类,主要实现, 将html 页面放到数组, 未考虑性能优化. 放入数组后,便于遍历搜索所有的url.

GetUrls

获取该html中所有的url , 用于下一级的搜索. 不搜集非html的url链接. 例如js,css, exe,等.

GetObjectTagText

这个为要抓取的内容的实现,根据你需要抓取的内容,自行补充完成实现. 这段代码用来捕捉object 视频标签的内容..

为什么没有使用webdriver.findelement by tag, 是因为目前发现经常无法获得tag标签的value, 一直为空. 相关的问题可以搜索google, group里有人碰到同样的问题.

Entry

爬虫的入口类, 利用递归算法, 逐渐的深度的爬网页. 达到自己的目标深度后, 退出程序.

该类,主要实现, 将html 页面放到数组, 未考虑性能优化. 放入数组后,便于遍历搜索所有的url.

public class SplitToLines {

	public static String[] getSplitLines(String pageSource)

	{
		pageSource.replaceAll("\r\n", "\n");

		String[] lines = pageSource.split("\n");

		return lines;

	}

}

============================================================

获取该html中所有的url , 用于下一级的搜索.   不搜集非html的url链接.  例如js,css, exe,等. 

public class GetUrls {

	public static List getUrls(String[] lines, String hostUrl) {

		List urls = new ArrayList();

		String myHostName = getHost(hostUrl);

		Pattern pattern1 = Pattern.compile("http://.*/");
		Matcher matcher1 = pattern1.matcher(hostUrl);

		if (!matcher1.find()) {
			hostUrl += "/";

		}

		String getPattern = "";

		for (String line : lines) {

			// System.out.println(line);

			Pattern pattern = Pattern.compile("href=\"(.*?)\"");
			Matcher matcher = pattern.matcher(line);

			while (matcher.find()) {

				getPattern = matcher.group(1);

				if (getPattern.startsWith("http://" + myHostName)) {

					urls.add(getPattern);
				}

				else if (getPattern.startsWith("http://")) {

				}

				else if (getPattern.startsWith("/")) {
					urls.add("http://" + myHostName + getPattern);
				}

				else if (getPattern.startsWith("mailto")
						|| getPattern.startsWith("#")
						|| getPattern.endsWith(".exe")
						|| getPattern.endsWith(".msi")
						|| getPattern.endsWith("rpm")
						|| getPattern.endsWith("doc")
						|| getPattern.endsWith("ppt")
						|| getPattern.endsWith("xls")
						|| getPattern.endsWith(".css")
						|| getPattern.endsWith(".xml")) {

				}

				else {

					int index = getLastCharactorLocation(hostUrl, '/');
					// System.out.println(hostUrl.substring(0,
					// index+1)+getPattern);
					urls.add(hostUrl.substring(0, index + 1) + getPattern);

				}

			}

		}

		return urls;
	}

	private static int getLastCharactorLocation(String sequence, char charactor) {

		int length = sequence.length();

		for (int i = length - 1; i >= 0; i--)

		{

			if (sequence.charAt(i) == charactor) {
				return i;
			}

		}

		return -1;
	}

	private static String getHost(String hostUrl) {

		String myurl = hostUrl;

		if (!myurl.endsWith("/"))
			myurl += "/";

		Pattern pattern = Pattern.compile("http://(.*?)/");

		Matcher matcher = pattern.matcher(myurl);

		if (matcher.find()) {

			return matcher.group(1);

		}

		return null;

	}

}

==============================================

这个为要抓取的内容的实现,根据你需要抓取的内容,自行补充完成实现. 这段代码用来捕捉object 视频标签的内容..

为什么没有使用webdriver.findelement by tag, 是因为目前发现经常无法获得tag标签的value, 一直为空. 相关的问题可以搜索google, group里有人碰到同样的问题.

package com.whoistester.webcrawler;

public class GetObjectTagText {

/**
*
* @param page
* @return
*/

public static String getObjectTest(String[] lines) {

StringBuilder objectText = new StringBuilder();

boolean flag = false;

for (String line : lines) {

// System.out.println(line);

if (line.contains(” flag = true;
objectText.append(line);
} else if (line.contains(”

flag = false;
objectText.append(line);
}

else if (flag)
objectText.append(line);
}

return objectText.toString();

}

}

=====================================================

爬虫的入口类, 利用递归算法, 逐渐的深度的爬网页. 达到自己的目标深度后, 退出程序.

package com.whoistester.webcrawler;

import java.util.List;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.htmlunit.HtmlUnitDriver;

public class Entry {

private static void searchUrl(String firsturl, int targetdepth, int nowdepth) {

if (targetdepth == nowdepth)
return;

nowdepth++;

// And now use this to visit Google

String[] lines = parseHtml(firsturl);

List urls = GetUrls.getUrls(lines, firsturl);

System.out.println(“===========================” + nowdepth + “====”
+ targetdepth);

for (String innerurl : urls)

{
// System.out.println(innerurl);
searchUrl(innerurl, targetdepth, nowdepth);

}

}

private static String[] parseHtml(String url) {

WebDriver driver = new HtmlUnitDriver();
// And now use this to visit Google
driver.get(url);

String pageSource = driver.getPageSource();

String[] lines = SplitToLines.getSplitLines(pageSource);

// System.out.println(“=============================================”);

String objectText = GetObjectTagText.getObjectTest(lines);

System.out.println(url + “===============” + driver.getTitle()
+ “=====” + objectText);

return SplitToLines.getSplitLines(pageSource);

}

public static void main(String[] args) {
Entry.searchUrl(“http://www.dhfun.cn/html/18757.html”, 2, 0);

}

}


发表评论

电子邮件地址不会被公开。 必填项已用*标注