欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

url spider

程序员文章站 2022-05-05 15:06:13
...
在实现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]
相关标签: SQL HTML