如何在C#中捕获代理错误(返回HTML页面)



我正在用C#编写一个小程序来解析URL列表。主要目标是确定哪些可以通过代理,哪些不能。我相信我已经做到了。现在我正试图确定一个网站被代理阻止的原因。最终,这些数据将被导出到.csv中以生成报告。为了简洁起见,我省略了一些关于我为什么这么做的细节。

我正在使用WebClient测试每个站点。如果代理拒绝连接,我的程序将失败,出现以下异常:

远程服务器返回错误:(403)Forbidden。

我可以很容易地捕捉到异常并记录下来。然而,代理返回的HTML页面(如果我使用的是web浏览器)有很多我想捕获的信息(例如,网站的信誉、被屏蔽的类别等)。我想将其捕获为字符串,并用正则表达式进行解析。我一直在尝试将这个HTML转换成字符串。

换言之,对于未被阻止的URL,我可以很容易地将该页面的HTML捕获为字符串并进行解析。然而,对于被阻止的网址,我的程序会抛出一个异常。我已经浏览了异常,但我找不到代理在发生阻塞时通常会返回到web浏览器的HTML。

下面是我的一些代码。我才刚刚开始,在完成之前还有一段时间,哈哈。谢谢!

int counter = 0;
string line; //Store each line of a text file (a URL)
WebClient client = new WebClient();
// Read the file line by line.
System.IO.StreamReader file =
new System.IO.StreamReader(txtPath.Text); //path to file with list of URLs
while ((line = file.ReadLine()) != null)
{
Console.WriteLine(line); //for testing
counter++;                
string downloadString = client.DownloadString(line);
Console.WriteLine(downloadString); //for testing
}

经过一段时间的尝试和反复查找,我想我得到了这个。

当然,除了我们想要捕获的任何异常,在相关代码周围都需要一个try/catch块。在这种情况下:

string downloadString = client.DownloadString(line);

一旦我发现错误为"WebException ex",我就可以解析响应流:

string resp = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();
StringReader reader = new StringReader(resp);

在这一点上,我需要将HTML作为字符串进行操作,以满足我的需求。在任何情况下,关键是将错误捕获为WebException并解析响应流。