url spider

在实现url的爬虫中,我觉得很难的就是url的筛检,如果可以都在内存中实现(就是假设内存无限大),我觉得可以简单这么做:
把所有url都放在LinkedHashSet(使用link的原因是可以顺序访问,hashset是为了互斥,就是每个url只访问一次),
从一个url开始:
url->linkedhashset->big linkedhashset->bigger linkedhashset->bigggggger linkedhashset...
(解析url和获取这个页面下更多url方法如下:wget url =>parser html=>more urls)
但是linkedhashset肯定会非常大,所以我觉得要使用外排。

要实现以上相同功能,我最后考虑用数据库来实现,如下:
sql> create table urlhash(	order int not null auto_increment,
				url varchar(100) not null unique,
				index(order),index(url)
				);

order设置为自动增长,这样可以顺序访问url(之前访问过的url就不考虑),另一种方法就是按插入时间来排序。
url必须为unique,这样对每个url只分析一次,
对order,url索引是为了访问速度考虑。

模仿hashmap的方法:
/*如果能够获得,返回其order,否则返回-1*/
/*数据库的定义和连接部分:
	protected Connection conn = null;
	protected Statement stmt = null;
	conn = DriverManager.getConnection(Env.JDBCURL);
	stmt = conn.createStatement();
	......
*/
public int get(String url){
		String select = "select order from urlhash where url = " + "\'" + url + "\'";
		int order = 0;
		try {
			state = connection.createStatement();
			ResultSet rs = state.executeQuery(select);
			if(rs.next()){
				return rs.getInt("order");
			}
			resultset.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return -1;	
	}

public boolean put(String url){
		String sqlstring = null;
		if(get(url) == -1){
			sqlstring = "insert into urlhash(url) values("\'" + url + "\'");";
			try {
				state = connection.createStatement();
				state.executeUpdate(sqlstring);	
				state.close();
			}catch (SQLException e) {
				e.printStackTrace();
			}
			return true;
		}else{
			return false;
		}
	}

public boolean isexist(String url){
		if(get(url)>0)
			return true;
		else
			return false;
	}


这样封装了sql的使用,直接把sql的操作形成hashmap的方式。

你可能感兴趣的:(html,sql)