1、网上有很多的开源爬虫机器人。这里从网上找了一个简单在爬虫机器人代码。使用到了以下jar包:
commons-httpclient-3.0.1.jar
commons-logging-1.1.1.jar
htmlparser.jar
代码如下:
LinkQueue类:定义已访问队列,待访问队列和爬取得URL的哈希表,包括出队列,入队列,判断队列是否空等操作。
package webspider;
import java.util.HashSet;
import java.util.PriorityQueue;
import java.util.Set;
import java.util.Queue;
/**
* 定义已访问队列,待访问队列和爬取得URL的哈希表,包括出队列,入队列,判断队列是否空等操作。
* @author yang.chao3
*
*/
public class LinkQueue
{
// 已访问的 url 集合
private static Set<String> visitedUrl = new HashSet<String>();
// 待访问的 url 集合
private static Queue<String> unVisitedUrl = new PriorityQueue<String>();
// 获得URL队列
public static Queue<String> getUnVisitedUrl()
{
return unVisitedUrl;
}
// 添加到访问过的URL队列中
public static void addVisitedUrl(String url)
{
visitedUrl.add(url);
}
// 移除访问过的URL
public static void removeVisitedUrl(String url) {
visitedUrl.remove(url);
}
// 未访问的URL出队列
public static Object unVisitedUrlDeQueue() {
return unVisitedUrl.poll();
}
// 保证每个 url 只被访问一次:如果URL既不在已访问的队列,又不在未访问的对列,说明此url未访问过。
public static void addUnvisitedUrl(String url)
{
if (url != null && !url.trim().equals("") && !visitedUrl.contains(url)
&& !unVisitedUrl.contains(url))
{
unVisitedUrl.add(url);
}
}
// 获得已经访问的URL数目
public static int getVisitedUrlNum()
{
return visitedUrl.size();
}
// 判断未访问的URL队列中是否为空
public static boolean unVisitedUrlsEmpty()
{
return unVisitedUrl.isEmpty();
}
}
HtmlParserTool类:用来获得网页中的超链接(包括a标签,frame中的src等等),即为了得到子节点的URL。
package webspider;
import java.util.HashSet;
import java.util.Set;
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
/**
* 定义HtmlParserTool类,用来获得网页中的超链接(包括a标签,frame中的src等等),即为了得到子节点的URL
* @author yang.chao3
*
*/
public class HtmlParserTool
{
// 获取一个网站上的链接,filter 用来过滤链接
public static Set<String> extracLinks(String url, LinkFilter filter)
{
Set<String> links = new HashSet<String>();
try
{
Parser parser = new Parser(url);
parser.setEncoding("UTF-8");
// parser.setEncoding("gb2312");
// 过滤 <frame >标签的 filter,用来提取 frame 标签里的 src 属性所表示的链接
NodeFilter frameFilter = new NodeFilter()
{
public boolean accept(Node node)
{
if (node.getText().startsWith("frame src="))
{
return true;