您的位置:程序门 -> .net技术 -> c#



抓网页的小程序,为什么只能取到比较少的一部分网页代码?


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


抓网页的小程序,为什么只能取到比较少的一部分网页代码?[已结贴,结贴人:qiangrentian]
发表于:2007-08-21 18:45:33 楼主
private   void   button1_click(object   sender,   eventargs   e)
                {
                        string   str   =   " ";
                        string   filetxt   =   " ";
                        int     count   =   0;
                        filetxt   =   this.filetxt.text;
                        if   (filetxt== " ")
                        {   filetxt   =   "html.txt ";   }
                        int   begindex   =   0;
                        int   endindex   =   0;
                        string   num   =   " ";
                        byte[]   buf   =   new   byte[38192000];
                 
                                num   =   this.tb1.text.tostring();
                                string   keyword   =   this.keyword.text;
                                string   kwend   =   this.kwend.text;
                                int   index   =   num.indexof(keyword);
                                int   indexend   =   num.indexof(kwend);
                                int   start=0;
                                index=   index   +   keyword.length;
                                                    begindex   =   convert.toint32(num.substring(index,   indexend-index));
                                endindex   =   convert.toint32(this.tb2.text);

                                for   (;   begindex   <=   endindex;   begindex++)
                                {
                                        string   page   =   tb1.text.substring(0,   index   -   1)   +   begindex   +   tb1.text.substring(indexend);
                                        httpwebrequest   request   =   (httpwebrequest)
                                          webrequest.create(page);
                                        httpwebresponse   response   =   (httpwebresponse)
                                        request.getresponse();
                                        stream   resstream   =   response.getresponsestream();
                                                count   =   resstream.read(buf,   0,   buf.length);                                
                                                str   =   str   +   encoding.default.getstring(buf,   0,   count);
                               
                                                                    resstream.close();
                                }
                                this.loadtotext(str,   filetxt);

                        }


当点击抓取按钮时,程序根网页url(123.asp?id=456&page=1)里   id的范围抓取网页html源码,所有的网页能全部抓到了,但都不全,是   byte[]错了吗?高手指教!

发表于:2007-08-21 19:23:211楼 得分:0
好心的帮忙看看啊
发表于:2007-08-21 20:35:492楼 得分:0
有没考虑用   xmlhttp来抓呢?
发表于:2007-08-22 10:58:593楼 得分:0
ding     这个错在哪呢?
发表于:2007-08-22 11:07:074楼 得分:15
count   =   resstream.read(buf,   0,   buf.length);                                

这个地方要分几次读,   你的缓冲区new   byte[38192000]   太大了,
,内部socket的缓冲区一次根本读不下那么多,     所以你得循环几次来读取。

你不考虑下,你的内存么
发表于:2007-08-22 11:18:405楼 得分:5
使用下边这个通用获取远程web函数来试验,专门使用streamreader实例来获取流比较稳当点


///   <summary>
///   判断页面是否存在,并返回页面快照信息
///   </summary>
///   <param   name= "urlstr "> 远程地址 </param>
///   <param   name= "strencoding "> 编码格式 </param>
///   <returns> 获取的数据,没有则返回空 </returns>
private   stringbuilder   fvalidandgeturl(string   urlstr,string   strencoding)  
{
//lock_getpageinfo.waitone();   //线程加锁
webresponse   response   =   null;
stream   stream   =   null;
streamreader   reader   =   null;

try
{
httpwebrequest   request   =   (httpwebrequest)webrequest.create(@urlstr.trim());

request.timeout=60000;

request.method= "get ";
request.allowautoredirect=true;
request.useragent= "mozilla/4.0   (compatible;   msie   6.0;   windows   nt   5.2;   sv1;   .net   clr   1.1.4322;   .net   clr   2.0.50727) ";
request.accept=@ "*/* ";
//request.cookiecontainer=this.get_cookiecontainer(urlstr.trim());

response   =   request.getresponse();

if   (!response.contenttype.tolower().startswith( "text/ "))
{
//savebinaryfile(response);
messagebox.show( "获取的不是web信息: "   +   response.contenttype.trim());
return   null;
}

                                stream   =   response.getresponsestream();

system.text.encoding   encoding;

switch(strencoding.trim().toupper())
{
case   "utf-8 ":
{
encoding   =   encoding.utf8;
break;
}
case   "utf-7 ":
{
encoding   =   encoding.utf7;
break;
}
case   "unicode ":
{
encoding   =   encoding.unicode;
break;
}
default:
{
encoding   =   encoding.default;
break;
}
}

reader   =   new   streamreader(stream,   encoding);

stringbuilder   buffer=new   stringbuilder();

buffer.append(reader.readtoend());                                

reader.close();
stream.close();
response.close();
return   buffer;
}
catch   (webexception   e)
{
messagebox.show(e.message);
return   null;
}
catch   (ioexception   e)
{
messagebox.show(e.message);
return   null;
}
finally
{
if   (reader   !=   null)
{
reader.close();
}

if   (stream   !=   null)
{
stream.close();
}

if   (response   !=   null)
{
response.close();
}
}

//lock_getpageinfo.releasemutex();//线程解锁

}


快速检索

最新资讯
热门点击