webcrawler 网页爬虫
想实现一个简单的网页爬虫, 利用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);
}
}
此篇文章已被阅读3294 次