今天在做一个简单的Web爬虫,用.Net的HttpWebRequest获取页面信息,然后通过Regex获取页面上的连接,进行递归爬取,开始对http://blog.sunmast.com(Encoding为UTF-8)进行爬去的时候没有发现任何错误。爬取的东西显示正常,结果对其他一些中文网站(Encoding为GB2312)进行爬去的时候,获得的都为乱码,这也是必然,于是修改代码为: HttpWebRequest req = (HttpWebRequest) WebRequest.Create("http://www.163.com");
req.AllowAutoRedirect = true;
req.MaximumAutomaticRedirections = 3;
req.UserAgent = "Mozilla/6.0 (MSIE 6.0; Windows NT 5.1; Natas.Robot)";
req.KeepAlive = true;
req.Timeout = 4000;
// Get the stream from the returned web response
HttpWebResponse webresponse = null;
try
{
webresponse = (HttpWebResponse) req.GetResponse();
}
catch(System.Net.WebException ex)
{
string message = "error response exception:" + ex.Message;
Console.WriteLine(message);
}
if (webresponse != null)
{
StreamReader stream = new StreamReader
(webresponse.GetResponseStream(), Encoding.GetEncoding("GB2312") );
// TODO...
}但是,用这样的程序来获取utf-8编码的中文网站,同时又会变成乱码。查看MSDN,看到HttpWebResponse有 ContentEncoding 和 CharacterSet,于是希望根据获得的网页的编码类型来进行StreamReader的编码。于是编码测试,可是却发现测试了很多网站(包括Microsoft,Sina)等,却都无法获取这两个参数,输出的结果均为string.Empty。在Google和Baidu上搜索不到此类问题的解决方案,在CodeProject找到两篇Article,却都是通过HttpWebResponse.ContentEncoding 属性获取页面的编码,可是我获取的为什么都是空字符串?
req.AllowAutoRedirect = true;
req.MaximumAutomaticRedirections = 3;
req.UserAgent = "Mozilla/6.0 (MSIE 6.0; Windows NT 5.1; Natas.Robot)";
req.KeepAlive = true;
req.Timeout = 4000;
// Get the stream from the returned web response
HttpWebResponse webresponse = null;
try
{
webresponse = (HttpWebResponse) req.GetResponse();
}
catch(System.Net.WebException ex)
{
string message = "error response exception:" + ex.Message;
Console.WriteLine(message);
}
if (webresponse != null)
{
StreamReader stream = new StreamReader
(webresponse.GetResponseStream(), Encoding.GetEncoding("GB2312") );
// TODO...
}但是,用这样的程序来获取utf-8编码的中文网站,同时又会变成乱码。查看MSDN,看到HttpWebResponse有 ContentEncoding 和 CharacterSet,于是希望根据获得的网页的编码类型来进行StreamReader的编码。于是编码测试,可是却发现测试了很多网站(包括Microsoft,Sina)等,却都无法获取这两个参数,输出的结果均为string.Empty。在Google和Baidu上搜索不到此类问题的解决方案,在CodeProject找到两篇Article,却都是通过HttpWebResponse.ContentEncoding 属性获取页面的编码,可是我获取的为什么都是空字符串?
解决方案 »
- 想用C#实现以下功能,大家帮忙指点指点
- 系统启动后把鼠标键盘锁死直到指定的软件运行好后才解锁
- 如何在页面向定义的类中的方法传递值?具体描述如下
- 各位大侠,请帮帮忙,急!!!
- 能匹配单行内各种方法或者类定义的正则表达式有哪些写法?
- datagrid里,哪个才是数据更改的事件?
- 如何在.net中修改ActiveX控件属性?
- 批量插入数据库,用sqlDataAdapter.update快还是oledbDataAdapter.update快
- 请问从windows窗体中拖此人意思他crystalreportviewer组件时出错
- 菜鸟问题,大家一般用什么编译c# ?
- 做个作品去应聘,一定要面向对象思想的吗?我做了一个直接操作数据库的不知道可不可以?
- 说说大家平时开发项目都使用哪些工具?我先来.
我自己写的是下载网页然后在从下载好的网页上面找连接.
最初写的下载网页的也是用的streamreader,在dotnet下面需要用coding,但是无论任何coding好像都不太好用.我就用了另外一种方法,就不用去管coding是什么了.
code如下:
----------------------------------
string dir = "D:\\SelfPre\\Test\\Download"; //directory you wanna create the file
String fileName = dir + "\\" + URLfileName + ".html";
string URL = URLadd.Text.Trim();
string URLfileName = "PreCode"; System.Net.HttpWebRequest URLReq;
System.Net.HttpWebResponse URLRes;
byte[] bBuffer = new byte[999];
int iBytesRead = 0;
try
{
FileStream FS = new FileStream(fileName,FileMode.Create);
System.IO.Stream sChunks;
URLReq = (HttpWebRequest)WebRequest.Create(URL);
URLRes = (HttpWebResponse)URLReq.GetResponse(); sChunks = URLRes.GetResponseStream();
do
{
iBytesRead = sChunks.Read(bBuffer,0,999);
FS.Write(bBuffer,0,iBytesRead);
}while(iBytesRead>0);
sChunks.Close();
FS.Close();
}
catch(Exception err)
{
MessageBox.Show(err.Message);
}
//string URLfileName = "PreCode"; 这一行应该比String fileName = dir + "\\" + URLfileName + ".html";早.
不过该下载程序可以用于下载其他其他文件,测试过的有jpg为后缀的图片,或者swf为后缀的flash.
streamreader这个是不好用,还是FileStream比较智能啊 ̄
"泡泡免费手机网" >>>泡泡免费手机网
http://community.csdn.net/Expert/topic/4530/4530153.xml?temp=.2030451
private string AmpToUnicode(string expression, string delimiter)
{
string result="";
if(null == expression)
{
return result;
}
foreach(string s in expression.Split(delimiter.ToCharArray()))
{
if(s != string.Empty)
{
string tem = "0x"+s.Replace(";","");
result += (char)Convert.ToUInt32(tem,16);
}
}
return result;
}Example:
string str = AmpToUnicode("泡泡免费手机网","&#x");
不知(夜雨)在吗,你说用FileStream把抓到下为的文件保存下来是可以了,可是我怎么用FileStream方法把这个保存下来的文件读取 到一个string字符串中呢~
没有试过用filestream读到一个string里面,我以前写的那个就是读完,和你那个差不多吧.
StreamReader readStream = new StreamReader(sChunks,Encoding.UTF8);
String loadcontent = readStream.ReadToEnd();//完整string
FileInfo htmlfile = new FileInfo(fileName);
StreamWriter writeFile = htmlfile.CreateText();
writeFile.WriteLine(loadcontent);
sChunks.Close();2.utf-8的编码在C#中转成中文.
成片的编码没有遇到过,只是有时候处理过一点点的中文换成编码,还有就是将encoding不同的文件换成另外的coding,比如中文网页是GB2312的,现在可以换成unicode了.
我想可以先设置设置byte[],将所有的utf-8的编码安装顺序读出来,然后encode成string就可以了吧.
我用filestream是读一点写一点,直到完全写完.
觉得读到一整个string里面也是需要把文件全部下载下来,这个过程也可以由创建一个临时文件来解决.
没错啊,我就是用filestream把文件 下载下来了,所以这个文件 是你本地是已经存在了,我现在是如果用StreamReader来读的话,又要指明是用什么编码(utf-8或gb2312),这样又回到了下载时的问题了,读出来的文件又有乱码了(因为我们不知道该文件是什么编码,所以也不知道该用什么编码方式进行读取),因为我要以文件中的内容进行分析,取出符合条件的内容,有没有一个方法能读取文件到一个string字符串中,且不用考虑要用什么编码一的读的,就像下载的那个方式一样,读到缓冲区,再写到文件中,这各地可以应用到我们读文件中就好了,这样我好方便进行分析,
不知道这种方法可以不.
Encoding EC = System.Text.Encoding.GetEncoding("gb2312");
StreamReader readStream = new StreamReader(filePath,EC);
但如果用:
Encoding EC = System.Text.Encoding.GetEncoding("utf8");
StreamReader readStream = new StreamReader(filePath,EC);
这样读取出来的数据,如果是utf8的页面就正常了,但是如果是gb2312的话就又是乱码了,就是说两咱编码要用两种方式读取,我现在就是找不到一个统一的方法可以去读不管是gb2312还是utf8的页面都不会乱码的方法~~
无论是gateway problem还是protocol problem等等造成exception的,文件创建出来的大小都是0kb,里面是空白的.这个读取文件的时候是没有问题的.
catch(WebException e)
{
return null;
}
因为这个程序是要返回一个值,这个值就是整个页面的内容 ̄因为我下一步还要去这个页面中的所有链接进行分析,然后再抓取 ̄ ̄