url spider

在实现url的爬虫中,我觉得很难的就是url的筛检,如果可以都在内存中实现(就是假设内存无限大),我觉得可以简单这么做:
把所有url都放在LinkedHashSet(使用link的原因是可以顺序访问,hashset是为了互斥,就是每个url只访问一次),
从一个url开始:
[color=darkred]url->linkedhashset->big linkedhashset->bigger linkedhashset->bigggggger linkedhashset...[/color]
[color=gray](解析url和获取这个页面下更多url方法如下:wget url =>parser html=>more urls)[/color]
但是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;
}


[color=black]这样封装了sql的使用,直接把sql的操作形成hashmap的方式。[/color]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值