多谢Arias的建议.
    我的网站的内容都是动态的,我考虑使用下面这种方法:
    首先得到网站的首页,然后分析页面内的链接,再根据链接得到下一层的页面内容,依次得到网站内所有的动态内容(如果层数太多,则只取4层以内),将查到的页面放入数据库中。需要检索时在数据库中检索内容即可,数据库隔一段时间更新一次。
    我的思路就是这些,只是对网页内链接的分析不会,这个问题太麻烦。
    请大家多多指教。

解决方案 »

  1.   

    看看lucene和weblech/jspider的内容吧,链接的处理应该不是想象中的麻烦。不过我觉得动态网页的分析会有很多问题。我也是初学,共同进步!
      

  2.   

    这些代码可以找出html文件中的链接,
    可以分析<a href="xxxxxxxx">xxx</a>
    /**
     * <a 开头输入
     * return hrefValue
     */
    char* parsetaga(char* strtag)
    {
    const char tokseps[] = " >\"\t\r\n";
    char* t;
    t = strtok(strtag,tokseps);
    // printf("%s",t);
    while(t){
    // printf("%s\n",t);

    if(strlen(t)>4){
    if(!strncmp("href=",t,5)){/* href= */
    if(strlen(t)>5){/*href=http://... || /index.html... */
    t+=5;
    }else{/*href=[]http://... || href= []/index.html... */
    t = strtok(NULL,tokseps);
    }
    // printf("$%s$\n",t);
    return t;
    }
    }else{
    if(!strncmp("href",t,4)){/*href =http://... || /index.html... */
    t = strtok(NULL,tokseps);
    if(strlen(t)>1) {/* =http */
    t+=1;
    }else{/* = */
    t = strtok(NULL,tokseps);/* url*/
    }
    // printf("$%s$\n",t);
    return t;
    }
    }
    t = strtok(NULL,tokseps);
    }
    return NULL;}void thread_write(void*){
    for(;;){
    if(mbuf->lock!=1){/* if mbuf->data not filld then wait*/
    for(;;){
    if(mbuf->lock == 1)break;
    _sleep(1);
    }/*for*/
    }/*if*/
    mbuf->lock = 0;
    {
    char * c;
    char * p = mbuf->data;
    char * e;
    char buf[2048];
    for(;;){/*parse doc*/
    memset(buf,0,2048);
    if((p = strchr(p,'<'))){
    if((e = strstr(p,"</"))){
    strncpy(buf,p,e-p+1);
    if(c = parsetaga(buf)){
    printf("%s\n",c);
    }
    p = e+1;
    }else {
    break;
    }
    }else{
    break;
    }
    }
    }
    mbuf->lock = -1;/* mbuf->data isused */
    }
    }
    void thread_read(void*){
    char buff[BUF_SIZE];
    mbuf = (BUF)malloc(sizeof(BUF));
    FILE *fp;
    size_t read = 0;
    fp = fopen("c:\\index.htm","r");
    mbuf->lock = -1;
    for(;;){
    memset(buff,0,BUF_SIZE);
    read = fread(buff,sizeof(char),BUF_SIZE,fp);
    if(read>0){
    // printf("%s",buff);
    if(mbuf->lock != -1)/* if mbuf->data not isused then wait*/
    for(;;){
    if(mbuf->lock == -1){
    _sleep(1);
    break;
    }
    }
    mbuf->lock = 0;
    mbuf->data = strdup(buff);
    mbuf->lock = 1;
    }else{
    break;
    }
    } fclose(fp);
    }int main(int argc, char* argv[])
    {
    _beginthread((void(__cdecl*)(void*))thread_read,0,NULL);
    _beginthread((void(__cdecl*)(void*))thread_write,0,NULL);
    _endthread();
    // while(mbuf->data != NULL){
    // _sleep(1);
    // }
    //<br> <a href></a> <br/>
    // char* tag = (char*)malloc(BUF_SIZE);
    // memset(tag,0,BUF_SIZE);
    // strcpy(tag,"adfsad<a href= >a< / a>");
    // printf(endTag(tag));
    return 0;
    }