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);
}
}
此篇文章已被阅读3606 次