使用WebClient进行Web Scrapping时间歇性中止连接

时间:2015-06-04 12:17:42

标签: c# webclient streamreader

有时我会收到错误,有时我会从网站获取数据

错误:

Wyjątek nieobsłużony: System.Net.WebException: Żądanie zostało przerwane: Połączenie zostało nieoczekiwanie zakończone.
       w System.Net.ConnectStream.Read(Byte[] buffer, Int32 offset, Int32 size)
       w System.IO.StreamReader.ReadBuffer()
       w System.IO.StreamReader.ReadLine()
       w ConsoleApplication3.Download.getUrlData() w c:\Users\user\Documents\Visual
    Studio 2013\Projects\ConsoleApplication3\ConsoleApplication3\Program.cs:wiersz 4
    1
       w ConsoleApplication3.Program.Main(String[] args) w c:\Users\user\Documents\V
    isual Studio 2013\Projects\ConsoleApplication3\ConsoleApplication3\Program.cs:wi
    ersz 55

英文翻译: 请求已中止:连接意外终止

我的代码:

 public string getUrlData()
        {
            WebClient client = new WebClient();
            Random r = new Random();
            //Random IP Address
            client.Headers["X-Forwarded-For"] = r.Next(0, 255) + "." + r.Next(0, 255) + "." + r.Next(0, 255) + "." + r.Next(0, 255);
            //Random User-Agent
            client.Headers["User-Agent"] = "Mozilla/" + r.Next(3, 5) + ".0 (Windows NT " + r.Next(3, 5) + "." + r.Next(0, 2) + "; rv:2.0.1) Gecko/20100101 Firefox/" + r.Next(3, 5) + "." + r.Next(0, 5) + "." + r.Next(0, 5);
            Stream datastream = client.OpenRead(Url);
            StreamReader reader = new StreamReader(datastream);
            StringBuilder sb = new StringBuilder();
            while (!reader.EndOfStream)
                sb.Append(reader.ReadLine());
            return sb.ToString();
        }

主要:

var d = new Download("http://wiocha.pl");

            var str = d.getUrlData();

            Console.WriteLine(str);

如何在没有错误的情况下每次获取数据?

1 个答案:

答案 0 :(得分:0)

限制最大并发客户

我知道这是HttpWebRequest的限制:一次只能有1个或2个活动客户端请求。我不熟悉WebClient方式,但是在使用HttpWebRequest方法时必须主动处理HttpWebResponse对象。因此,我建议您在返回该字符串之前首先尝试处理数据流。

不是您的编程

看起来你是网络报废,他们正在切断你。你需要:

  1. 限制发送请求的频率,并且;
  2. 使用具有不同IP和/或使用VPN的其他计算机/网络改变您的源IP。
  3. 另一项改进

    此外,您可以更轻松地将输入流转换为单个字符串:var responseString = reader.ReadToEnd();。所以你不需要StringBuilder或While循环。