asp.net抓取网页html源代码失败 只因UserAgent作怪

asp.net抓取网页html源代码,我想对于任何一个asp.net程序员来说都不再陌生,这是一个非常简单容易就能实现的功能。下面便是一个通用的asp.net获得网页源代码的程序。

首先引用

using System.Net;

using System.IO;

using System.Text;

程序代码如下:

string szUrl = "http://www.webkaka.com/";

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(szUrl);

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Stream hwStream = response.GetResponseStream();

Encoding eData = Encoding.GetEncoding("utf-8");

StreamReader sData = new StreamReader(hwStream, eData);

string szHTML = sData.ReadToEnd();

szHTML就是抓到的网页html源代码了。得到源代码后,就可以进一步各需所用了。

为什么抓取某些页面失败?

不过,有时候我们会发现,这个程序在抓取某些页面时,是获不到所需的内容的,有时候甚至返回404的错误提示页,这是什么原因呢?

其实,很多人都忽略了一个问题,那就是服务器默认的浏览器问题。有的服务器默认的浏览器是手机浏览器,那么,当我抓取这个服务器下的网页是,就相当于用手机浏览器来打开网页,而如果要抓取的目标网页没有相应的手机网页的话,就会返回意想不到的结果,有的返回404错误提示页,有的返回403错误提示页,有的甚至跳转到其他网页去了。

如何解决这个问题?

要解决这个问题,其实很简单,我们只需要在程序里指定使用的浏览器的即可,即是设置UserAgent的参数值。

改进后的代码如下:

string szUrl = "http://www.webkaka.com/";

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(szUrl);

request.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; .NET CLR 3.5.21022; .NET CLR 1.0.3705; .NET CLR 1.1.4322)";

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Stream hwStream = response.GetResponseStream();

Encoding eData = Encoding.GetEncoding("utf-8");

StreamReader sData = new StreamReader(hwStream, eData);

string szHTML = sData.ReadToEnd();

上述程序粗体字就是指定使用的浏览器来读取网页内容,这样,就不会出现抓取不到目标网页的情况了。